Easy excel动态表头使用过程(记录一下)

实现过程中还是遇到比较多的坑的,本来想用POI,但是代码太多了

产品需求:多月条件筛选,列不固定,表头有合并

 实现效果,基本上和需求相符:

 贴代码:

//创建表头集合
List<List<String>> headList = new ArrayList<>();
//第一列,合并三行
headList.add(Arrays.asList("项目名称","项目名称","项目名称"));

//以月份为维度,添加表头

LocalDateTime startTime1 = DateUtils.parse(vo.getStartTime(), DateUtils.YYYY_MM);
LocalDateTime endTime1 = DateUtils.parse(vo.getEndTime(), TimeUtil.MONTH);
while (!startTime1.isAfter(endTime1)){
    String monthStr = TimeUtil.format(startTime1, TimeUtil.MONTH);
    if (StringUtils.hasText(vo.getDetailType())){
        addHeadList(headList, monthStr, vo.getDetailType());//列数过多,控制导出表头的列,代码太麻瓜,就不贴出来了
大概就是这样
headList.add(Arrays.asList(monthStr, DictEnums.DetailType.INCOME.getDesc(), DictEnums.MonthReportQueryLine.INCOME.getDesc()));
    }
    startTime1 = startTime1.plusMonths(1);
}

//追加合计列

addHeadList(headList, "合计", vo.getDetailType());

//添加数据,和表头集合保持相同格式和列数

List<List<Object>> dataList = new ArrayList<>();

if (CollectionUtils.isNotEmpty(resultData)){
    Map<Integer, MonthlyReportVO> listMap = resultData.stream().collect(Collectors.toMap(x->x.getProjectId(), Function.identity()));
    Map<Integer, MonthlyReportVO> listMap1 = Maps.newLinkedHashMap();
    listMap.entrySet().stream().sorted(Collections.reverseOrder(Map.Entry.comparingByKey())).forEachOrdered(x -> listMap1.put(x.getKey(), x.getValue()));
    for (Map.Entry<Integer, MonthlyReportVO> entry : listMap1.entrySet()){
        List<Object> dataLine = Lists.newArrayList();
        MonthlyReportVO projectData = entry.getValue();
        dataLine.add(projectData.getProjectName());
        LocalDateTime startTime = DateUtils.parse(vo.getStartTime(), DateUtils.YYYY_MM);
        LocalDateTime endTime = DateUtils.parse(vo.getEndTime(), TimeUtil.MONTH);
        Map<String,MonthReportDataVO> monthDataMap = projectData.getDataList().stream().collect(Collectors.toMap(x->x.getMonth(), Function.identity()));
        while (!startTime.isAfter(endTime)){
            String monthStr = TimeUtil.format(startTime, TimeUtil.MONTH);
            MonthReportDataVO monthData = monthDataMap.get(monthStr);
            if (StringUtils.hasText(vo.getDetailType())){
                addDataList(dataLine, vo.getDetailType(), monthData);//列数过多,控制导出的列,因为要和表头保持列数一致,所以也需要和表头做相同的处理,不然导出的时候会报错
            }
            startTime = startTime.plusMonths(1);
        }
        addDataList(dataLine, vo.getDetailType(), monthDataMap.get("total"));
        dataList.add(dataLine);
    }
}
try {
    String fileName="月报表" + DateUtil.format(new Date(), TimeUtil.TIME); // excel文件名称
    ExcelUtil.excelResponse(res, fileName);
    EasyExcel.write(res.getOutputStream())
            .head(headList)
            .registerWriteHandler(new SimpleColumnWidthStyleStrategy(14))//这里注册了列宽14的策略,自动列宽则设置策略,根据实际需求设定,new LongestMatchColumnWidthStyleStrategy()
            .sheet("sheet1")
            .doWrite(dataList);
}catch (Exception e){
    e.printStackTrace();
}

如有错误请指正!谢谢

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用easy excel导出Excel文件可以通过以下步骤完成: 1. 首先,确保已经安装了Java开发环境以及easyexcel的相关依赖包,例如alibaba easyexcel。 2. 导入easyexcel相关的类和包,例如`com.alibaba.excel.EasyExcel`。 3. 创建一个ExcelWriter对象,用于写入Excel文件。可以指定要生成的Excel文件的路径和文件名。 4. 创建一个Sheet对象,并设置sheet的名称。 5. 创建一个List集合,用于存储要导出的数据。 6. 将数据逐一添加到List集合中。 7. 调用ExcelWriter对象的write方法,将数据写入到Sheet中。 8. 最后,调用ExcelWriter对象的finish方法,关闭资源,生成Excel文件。 下面是一个示例代码: ```java import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.metadata.Sheet; import com.alibaba.excel.metadata.Table; import java.util.ArrayList; import java.util.List; public class ExportExcel { public static void main(String[] args) { // 创建ExcelWriter对象,并指定要生成的Excel文件的路径及名称 ExcelWriter excelWriter = EasyExcel.write("D:\\test.xlsx").build(); // 创建Sheet对象,并设置sheet的名称 Sheet sheet = new Sheet(1, 0); sheet.setSheetName("Sheet1"); // 创建一个 List 集合,用于存储要导出的数据 List<List<String>> data = new ArrayList<>(); // 向 List 中逐一添加数据 List<String> item = new ArrayList<>(); item.add("姓名"); item.add("年龄"); data.add(item); item = new ArrayList<>(); item.add("张三"); item.add("25"); data.add(item); // 将数据写入到 Sheet 中 excelWriter.write(data, sheet); // 关闭资源,生成Excel文件 excelWriter.finish(); } } ``` 以上代码会生成一个名为test.xlsx的Excel文件,其中包含一个名为Sheet1的工作表,表格中有两列数据:姓名和年龄,其中姓名为张三,年龄为25。 这样就可以使用easyexcel导出Excel文件了。注意,使用easyexcel还可以导出更复杂的Excel文件,例如多个工作表、自定义样式等。详细的用法可以参考easyexcel的官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值