链式输出起因
因为Excel样式总是不可控的,总有一些稀奇古怪的excel需要咱们开发生成,即不是简单的列表式,也不是模板可以定义的模式,总有一些是上面的东西无法处理的,很多时候我都劝大家,自己基于poi在输出一遍,最近也是遇到了一些,所有总结了下,提供一个简单的链式输出,一行一行生成,但是又提供一些通用的服务
基于ExcelBuilder,大家可以按照自己的诉求,逐行逐单元格生成,合并修改,在简单的模式下,最大的满足大家自定义的诉求
提供的主要几个方法是
- create()创建一个excel
- addOneRow()在excel的最后一行的基础上增加一行
- addRows()添加多行,复用以前的能力,支持list(Map),对象的后面支持
- addOneCell() 创建一个cell,可以支持合并
- addCells() 创建一行的cell,挨个输出
- write()把流写到文件里面
基于这几个核心的犯法,基本上就能满足大家的需求,每个方法都有很多参数,具体需要大家看看代码了
案例说明
这个表格最开始拿到的时候,看着也不复杂,以为可以用模板搞定,但是分析之后发现,模板很困难,主要核心难点有:
- 条件1 这个高度是不固定的,后面具体列表是多少都不确定
- 时间的数量也是不确定的,可能3年也可能5年都不确定
- 每个小的列表都是重复的,但是数据是一致的
综上所述,这个模板基本上没有办法生成,只能单行单行的数据,而且哪怕是单行单上输出也不是一把可以搞定的,里面涉及6个list,但是使用ExcelBuilder还是很快的搞定了
ExcelBuilder eb = ExcelBuilder.create().setRowHeight(20);
CellStyle cellStyle = getHeaderStyle(eb.getWorkbook());
//生成表头
eb.addOneRow("小明自己生成的表格", 22, 50, getHeaderStyle(eb.getWorkbook()))
.addOneRow("(共×名)", 22)
//生成3行空数据,避免下面创建行
.addNoneRow().addNoneRow().addNoneRow()
.addOneCell("把握原则", 3, 0, 4, 0)
.addOneCell("2022年6月(测算时间1)", 3, 1, 3, 7)
.addOneCell("2022年12月(测算时间2)", 3, 8, 3, 14)
.addOneCell("2023年6月(测算时间3)", 3, 15, 3, 21);
String[] names = new String[]{"姓名", "出生\n年月", "上班\n时间", "年限", "转正时间", "年限", "备注"};
//这里可以动态生成几个
eb.addCells(names, 4, 1)
.addCells(names, 4, 8)
.addCells(names, 4, 15);
//先生成主要的数据,再生成条件N,避免没空row的问题
List<Map> dataList = new ArrayList<>();
Map<String, String> data = new HashMap<>();
data.put("name", "张三");
data.put("birthday", "1965.02");
data.put("leveltime", "2015.04");
data.put("years", "20");
data.put("jobytime", "2008.06");
data.put("jobyyears", "5");
data.put("remark", "");
dataList.add(data);
dataList.add(data);
dataList.add(data);
dataList.add(data);
dataList.add(data);
dataList.add(data);
dataList.add(data);
dataList.add(data);
dataList.add(data);
String[] cellNames = new String[]{"name", "birthday", "leveltime", "years", "jobytime", "jobyyears", "remark"};
eb.addRows(dataList, cellNames, 5, 1,BorderStyle.THIN)
.addOneCell("条件1", 5, 0, 5 + dataList.size() - 1, 0,BorderStyle.THIN);
dataList.remove(0);
eb.addRows(dataList, cellNames, 5, 8);
dataList.remove(0);
eb.addRows(dataList, cellNames, 5, 15);
// 换一行新的
eb.addRows(dataList, cellNames, 14, 1)
.addOneCell("条件2", 14, 0, 14 + dataList.size() - 1, 0);
dataList.remove(0);
eb.addRows(dataList, cellNames, 14, 8);
dataList.remove(0);
eb.addRows(dataList, cellNames, 14, 15);
eb.write("D:\\home\\excel\\自定义组合excel.xlsx");
作者:悟耘信息 创建时间:2022-09-04 21:45
最后编辑:悟耘信息 更新时间:2022-09-04 22:15
最后编辑:悟耘信息 更新时间:2022-09-04 22:15