前言:
最近项目中需要根据excle模板生成想要的excle文件,网上查阅资料后通过Jxls 库提供的方法得到解决,这里记录一下方法。文章末尾会附源码地址。
首先新建excle模板,如图
我们希望数据能动态加入,预期结果就像这样
接下来在我们的模板中加入jxls表达式,点击表格中我们用到范围中的第一个格子,鼠标右键---->插入批注,如图
说明:我们通过插入批注的方式来定义我们表格中所用到的表达式,表格中带右上角有红色标志的地方为加入批注,这里标题也弄成动态赋值,方便大家学习。
jx:area(lastCell="D3") 定义我们用到的表格的范围 lastCall="D3" 这里表示我们用到的范围为A1到D3。
问题: 为什么是A1开始?因为第一行我们由于标题需要,所以进行了合并 其实我们最开始的位置因该是A1 ,也就是说只要表达式写在那个格子里面,就默认从当前格子开始,合并的就从合并的第一个格子开始算,lastCell 值为多少就默认为到哪个格子结束。
为什么D3就要定义为结束?因为我们的模板所用的范围只到了D3 。
jx:each(items="list" var="item" lastCell="D3") 想到与for循环 items="集合名称" , var="对象" ,lastCell="D3" 循环结束的位置。
更多表达式参见Jxls 文档地址
接下来创建maven项目,pom.xml引入依赖
<!--对象 get set插件 便于简写对象属性get set 方法 非必须-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency>
<!--必须-->
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-poi</artifactId>
<version>1.1.0</version>
</dependency>
<!-- 日志包 非必须 避免控制台提示日志相关警告信息-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
<scope>compile</scope>
</dependency>
学生对象Student.java,这里使用了lombok表达式, 加入@Data注解后省去了get、set 以及构造方法的书写,不用的可以自行加入对应方法
@Data
public class Student {
private String name;
private int age;
private String sex;
private String className;
}
打印类print.java
import org.jxls.common.Context;
import org.jxls.util.JxlsHelper;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
public class Print {
/**
* 打印方法
* @throws Exception
*/
public static void print() throws Exception {
//准备数据
List<Student> list = new ArrayList<Student>();
for (int i = 0; i < 20; i++) {
Student stu = new Student();
stu.setAge(i);
stu.setClassName("一年级");
stu.setName("张三" + i);
stu.setSex("男");
list.add(stu);
}
//获取模板文件,你自己当前模板的位置 我这里为当前项目下
//如果为系统路径 为: InputStream is = new FileInputStream("F://student.xlsx");
InputStream is = Print.class.getClassLoader().getResourceAsStream("student.xlsx");
//根据模板生成的文件保存路径 我这里保存在本地D盘
OutputStream os = new FileOutputStream("D://student.xlsx");
//绑定数据
Context context = new Context();
context.putVar("title", "学上统计表");
context.putVar("list", list);
//生成
JxlsHelper.getInstance().processTemplate(is, os, context);
}
public static void main(String[] args) throws Exception {
print();
}
}
特别注意的地方就是数据绑定那里,如果你是对象取值就为对象.属性。运行main方法,去保存的路径下查看生成的文件,效果如图