一、实现目标
要实现单sheet页面多个不定表头的子表,并且列的值也不同,并且需要有多级表头
二、官方文档阅读
1.动态表头
/**
* 动态头,实时生成头写入
* <p>
* 思路是这样子的,先创建List<String>头格式的sheet仅仅写入头,然后通过table 不写入头的方式 去写入数据
*
* <p>
* 1. 创建excel对应的实体对象 参照{@link DemoData}
* <p>
* 2. 然后写入table即可
*/
@Test
public void dynamicHeadWrite() {
String fileName = TestFileUtil.getPath() + "dynamicHeadWrite" + System.currentTimeMillis() + ".xlsx";
EasyExcel.write(fileName)
// 这里放入动态头
.head(head()).sheet("模板")
// 当然这里数据也可以用 List<List<String>> 去传入
.doWrite(data());
}
private List<List<String>> head() {
List<List<String>> list = new ArrayList<List<String>>();
List<String> head0 = new ArrayList<String>();
head0.add("字符串" + System.currentTimeMillis());
List<String> head1 = new ArrayList<String>();
head1.add("数字" + System.currentTimeMillis());
List<String> head2 = new ArrayList<String>();
head2.add("日期" + System.currentTimeMillis());
list.add(head0);
list.add(head1);
list.add(head2);
return list;
}
2.单页面多子表
使用table去写入
/**
* 使用table去写入
* <p>
* 1. 创建excel对应的实体对象 参照{@link DemoData}
* <p>
* 2. 然后写入table即可
*/
@Test
public void tableWrite() {
String fileName = TestFileUtil.getPath() + "tableWrite" + System.currentTimeMillis() + ".xlsx";
// 方法1 这里直接写多个table的案例了,如果只有一个 也可以直一行代码搞定,参照其他案
// 这里 需要指定写用哪个class去写
try (ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build()) {
// 把sheet设置为不需要头 不然会输出sheet的头 这样看起来第一个table 就有2个头了
WriteSheet writeSheet = EasyExcel.writerSheet("模板").needHead(Boolean.FALSE).build();
// 这里必须指定需要头,table 会继承sheet的配置,sheet配置了不需要,table 默认也是不需要
WriteTable writeTable0 = EasyExcel.writerTable(0).needHead(Boolean.TRUE).build();
WriteTable writeTable1 = EasyExcel.writerTable(1).needHead(Boolean.TRUE).build();
// 第一次写入会创建头
excelWriter.write(data(), writeSheet, writeTable0);
// 第二次写如也会创建头,然后在第一次的后面写入数据
excelWriter.write(data(), writeSheet, writeTable1);
}
3.复杂表头
private List<List<String>> head() {
List<List<String>> list = new ArrayList<List<String>>();
List<String> head0 = new ArrayList<String>();
//表头是两层数组,第一层是列,第二层是每列有两个表头,其中第一个是第一级表头
head0.add("裁剪单01");
head0.add("字符串");
List<String> head1 = new ArrayList<String>();
head1.add("裁剪单01");
head1.add("数字");
List<String> head2 = new ArrayList<String>();
head2.add("裁剪单01");
head2.add("日期");
list.add(head0);
list.add(head1);
list.add(head2);
return list;
}
/**
* 复杂头写入
* <p>1. 创建excel对应的实体对象 参照{@link ComplexHeadData}
* <p>2. 使用{@link ExcelProperty}注解指定复杂的头
* <p>3. 直接写即可
*/
@Test
public void complexHeadWrite() {
String fileName = TestFileUtil.getPath() + "complexHeadWrite" + System.currentTimeMillis() + ".xlsx";
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
EasyExcel.write(fileName, ComplexHeadData.class).head(head()).sheet("模板").doWrite(data());
}
三、开始编码
测试主类
@Test
public void test(){
//设置请求信息(获取HttpServletResponse,可通过HttpServletResponse给导出数据命名)
String fileName = "dynamicHeadWrite" + System.currentTimeMillis() + ".xlsx";
ExcelWriter excelWriter = EasyExcel.write(fileName).build();
WriteSheet sheet = EasyExcel.writerSheet(0, "报表数据")
.build();
//sheet不要设置表头,在table中设置表头
// sheet.setHead(head());
// 创建两个表格,指定需要头
WriteTable writeTable0 = EasyExcel.writerTable(0).needHead(Boolean.TRUE).build();
//设置表一表头
writeTable0.setHead(head());
WriteTable writeTable1 = EasyExcel.writerTable(1).needHead(Boolean.TRUE).build();
//设置表二表头这里设置是一样的
writeTable1.setHead(head());
// 将多表写到同一个sheet,和excel
excelWriter.write(data(), sheet, writeTable0);
excelWriter.write(data(), sheet, writeTable1);
//完成
excelWriter.finish();
System.out.println("报表导出成功!");
}
数据类LIst获取
private List<List<String>> data() {
List<List<String>> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
List<String> data = new ArrayList<>();
data.add("1");
data.add("1");
data.add("1");
list.add(data);
}
return list;
}
表头list
private List<List<String>> head() {
List<List<String>> list = new ArrayList<List<String>>();
List<String> head0 = new ArrayList<String>();
//表头是两层数组,第一层是列,第二层是每列有两个表头,其中第一个是第一级表头
head0.add("裁剪单01");
head0.add("字符串");
List<String> head1 = new ArrayList<String>();
head1.add("裁剪单01");
head1.add("数字");
List<String> head2 = new ArrayList<String>();
head2.add("裁剪单01");
head2.add("日期");
list.add(head0);
list.add(head1);
list.add(head2);
return list;
}