关注微信公众号(首席摸鱼师)免费查看全部文章
前言:
相信大家对SpringBoot项目中导入导出并不陌生,经常会使用阿里开源项目EasyExcel进行操作,但有些时候我们需要导出非常复杂的Excel,或是合并,改变样式,自定义布局,传统的导出并不能很快实现,当然你也可以使用原生的POI自己进行绘画导出,那将是非常痛苦的一件事,这个时候帆软报表就诞生了,它不仅可以自定义复杂Excel,还可以导出PDF,HTML等,因为功能强大,使用起来还是有些难度,但本次不介绍帆软的使用,本次带来的是Java库中一个非常轻巧的工具,使用简单,专门定制Excel,它就是Jxls。
一、 什么是Jxls
JXLS是一个轻量级的Java库,主要用于基于模板的Excel报表生成。它通过在Excel模板中使用特定的标记或注释来定义数据的输出格式和布局,从而避免了编写大量重复且易出错的代码,特别适合处理复杂的Excel导出需求,如固定样式、合并单元格和动态列等。
二、 Jxls主要特点
- 简单性:JXLS的设计哲学是简单和直观,使得即使是初学者也能快速上手并使用它来创建复杂的Excel报表
- 灵活性:通过在Excel模板中使用类似jsp的标签,JXLS提供了极高的灵活性,可以轻松地生成各种格式的报表
- 轻量级:与其他Java Excel库相比,JXLS更加轻量,不会给项目增加太多的负担
- 功能强大:特别适合处理包含固定样式、合并单元格和动态列等复杂要求的Excel导出任务
- 易于维护:使用JXLS可以减少因手动编码导致的维护成本和出错概率,提高项目的可维护性
三、 如何使用Jxls
1、导入pom依赖
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-poi</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
2、创建一个Excel模版文件,文件名:jxlsDemo.xlsx
3、编写Java代码
实体类:
import lombok.Data;
/**
* 学生
*/
@Data
public class Student {
/**
* 姓名
*/
private String name;
/**
* 年龄
*/
private Integer age;
}
Main调用:
import org.jxls.common.Context;
import org.jxls.util.JxlsHelper;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) throws Exception {
new Test().test();
}
public void test() throws Exception {
// 获取模板文件
InputStream is = new FileInputStream("E:\\data\\jxlsDemo.xlsx");
OutputStream os = new FileOutputStream("E:\\data\\newFile.xlsx");
Context context = new Context();
context.putVar("title", "测试导出标题");
context.putVar("data", getList());
// 数据写入模板
JxlsHelper instance = JxlsHelper.getInstance();
instance.setEvaluateFormulas(true).processTemplate(is, os, context);
}
/**
* @return
*/
public static List<Student> getList() {
List<Student> list = new ArrayList<>();
Student student = new Student();
student.setName("小明");
student.setAge(10);
list.add(student);
Student student2 = new Student();
student2.setName("小王");
student2.setAge(20);
list.add(student2);
return list;
}
}
4、运行代码查看
这个时候新的文件就已经生成了,是不是非常简单
四、 详细说明
黄色注释内容说明
-
其中第一个注释必须写在第一个单元格,内容是【jx:area(lastCell=“B4”)】,其中B4代表整体区域的最后一个位置,可相应的修改
-
第二个注释【jx:each(items=“data”,var=“cell”,lastCell=“B3”)】代表将data里的列表数据进行循环,每一个为cell对象,生效范围一直到B3位置
里面的【${cell.name}】即为表达式,与我们JavaScript写法一样,【$[]】这里面的写法可以使用Excel的公式
五、 语法命令
1、语法
命令以 Excel 注释的形式编写。您可以通过右键单击>创建注释。注释通常包含第一行的作者。接下来是逐行的命令,命令位于jx:开头的名称。
格式如下:
"jx:" + command name + "(" + attribute name + "=\"" + value + "\" " [...] + ")\n"
例如:
jx:each(items="employees" var="e" lastCell="C2")
或:
jx:each(items="employees", var="e", lastCell="C2")
lastCell说明:每个命令都引用一个单元格区域。单元格区域从具有注释(左上角)和 在 lastCell 属性(右下角)中指定的单元格结束。
2、其他语法
-
jx:area 定义 Jxls 应处理的单元格区域。jx:area 通常位于单元格 A1 中,而 其 lastCell 属性定义所用工作表区域的右下角。
-
jx:each 主要用于创建行。这是最重要的命令。jx:each 也可以创建列或工作表。
如:jx:each(items="employees" var="e" lastCell="C2") 说明: items: 返回 Iterable 或数组的表达式 var:保存每行对象的变量名称 lastCell:区域结束
-
jx:if 用于根据条件显示和隐藏单元格区域。
如:jx:if(condition="e.payment<2000" lastCell="C2" areas=["A2:C2","A3:C3"]) 说明: condition: 如果表达式结果为 true,则显示区域,否则隐藏 if area; 如果 expression result 不为 true,则显示 else 区域,否则隐藏 else 区域。 应避免使用 Result null,但会将其视为 false(从版本 3 开始)。 lastCell:IF 零件的面积终点 areas:第一部分是 if 区域,第二部分是 else 区域
-
jx:grid 从列标题和数据对象中动态创建网格。
如:jx:grid(headers="headers" data="items" areas=["A3:A3","A4:A4"] formatCells="BigDecimal:C1,Date:D1" lastCell="A4") 说明: headers: 表达式,其中结果可以是数组或 Iterable。结果 null 将创建一个包含 0 列的网格。 array/Iterable 项将使用变量名称 “header” 作为值放入数据映射中。它通常是一个 String。 data: 表达式,其中结果可以是数组或 Iterable。Result null 将创建一个包含 0 行的网格。 array/Iterable 项是一个数组、Iterable 或一个对象。如果它是一个对象,则还必须指定 .否则 array/Iterable 的值将使用 var 逐列输出。 props:对象属性名称的非空逗号分隔列表。仅当数据项不是数组或 Iterable 时才需要。 允许使用空格。 formatCells:类型到单元格映射的逗号分隔列表。Type 是表达式结果的短类名, cell 是与 B2 类似的单元格引用,由冒号分隔。示例:Double:B4,Date:C4 允许使用空格。 areas:用于指定标题单元格区域和数据行单元格区域。请注意,这将无效。areas=["A3","A4"] lastCell:区域结束
-
jx:updateCell 可用于应用修改单元格区域的单个处理指令。
如:jx:updateCell(updater="myUpdater" lastCell="E2") 说明: updater:用于获取 CellDataUpdater 实例的属性名称 lastCell:区域结束
-
jx:params 是用于设置参数的特殊命令。
如:jx:params(defaultValue="1")
-
jx:image 用于将图像添加到工作表中。
如:jx:image(src="image" lastCell="A2") 说明: src: 表达式,该表达式返回包含图像数据的 byte[] 数组 imageType:可以具有以下值:PNG(默认)、JPEG(非 JPG)、EMF、WMF、PICT、DIB。 scaleX and scaleY :用于缩放的可选 Double 值scaleY lastCell:区域结束
-
jx:mergeCells 用于将单元格合并为一个新单元格。
如:jx:mergeCells(cols="" rows="" minCols="" minRows="" lastCell="C2") 说明: cols:组合的列数 rows:组合的行数 minCols:要合并的最小列数 minRows:要合并的最小行数 lastCell:合并单元格区域
这里是一些大概说明,更详细的说明可以参考官方文档进行参考
官方地址:https://jxls.sourceforge.net/commands.html
本次教程到这里就结束了,希望大家多多关注支持(首席摸鱼师 微信同号),持续跟踪最新文章吧~