链式输出起因

因为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