转载地址:https://blog.csdn.net/qq_42761569/article/details/119025171
背景
前两天客户反应对数据导出的文件格式不太满意,然后给了我们模板,
让我们按照模板导出数据。于是一通修改(excel数据量有限制他们也不管,之前我们给的csv格式)。
Java操作excel常用的有poi和阿里开源的easyexcel两种方式,
poi太麻烦了这里用的easyexcel。
根据模板生成文件还是比较简单的,因为我们不需要在代码中再设置各种格式、
样式,模板设置好所有格式、样式以及占位符,只用写数据就行了,easyexcel使用个数据类非常方便。
1、简介
如下图所示,template目录下是准备好的模板,export目录下是生成数据文件。
我们这里以第一个模板theUser蒸汽历史数据.xls为例进行测试,
theUser为占位符,生成的文件中会被替换成对应的用户名。
我这里的代码逻辑是根据选取的用户、起始时间导出用户的历史数据,
一个用户一个excel文件,所有用户数据文件在一个目录下,
最后把这个目录再压缩成zip,最后用户点击导出的就是这个压缩文件。
2、模板格式
占位符这里分两种:
- {字段名} :{theUser} 和 {reportDate}
- {自定义名称.字段名}:数据类字段占位符,字段对应第二个图中的类
HistoryData
的字段,hisData在代码中定义。
3、代码
这里的数据都是模拟测试的,代码中使用了Hutool工具类。没有文件压缩等代码。我的另一篇博客已经介绍过了文件压缩的方法【Java导出MySQL数据成csv文件并压缩成zip】。
1 public static void main(String[] args) { 2 String reportDate = DateUtil.date().toString("yyyy年MM月dd日"); 3 // 模板文件 4 String templateFile = "data/template/theUser蒸汽历史数据.xls"; 5 // 结果文件,省去了根据模板文件生成的步骤 6 String resultFile = "data/export/明邦建材蒸汽历史数据.xls"; 7 // 根据模板文件生成目标文件 8 ExcelWriter excelWriter = EasyExcel 9 .write(resultFile) 10 .withTemplate(templateFile) 11 // 单独设置单元格格式 12 // .registerWriteHandler(new CellStyleHandler()) 13 .build(); 14 WriteSheet writeSheet = EasyExcel.writerSheet().build(); 15 // 每次都会重新生成新的一行,而不是使用下面的空行 16 FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); 17 // 第一种占位符替换 18 Map<String, Object> map = new HashMap<>(); 19 map.put("reportDate", reportDate); 20 excelWriter.fill(map, writeSheet); 21 // 第二种占位符替换,这里定义了 hisData 22 excelWriter.fill(new FillWrapper("hisData", hisData()), fillConfig, writeSheet); 23 excelWriter.finish(); 24 } 25 26 private static List<HistoryData> hisData(){ 27 List<HistoryData> resList = new ArrayList<>(); 28 String today = DateUtil.now(); 29 String yesterday = DateUtil.yesterday().toString(); 30 HistoryData yesData = HistoryData.builder() 31 .time(today) 32 .temp(34.211) 33 .press(1.222) 34 .insFlow(34.211) 35 .accFlow(233.125) 36 .insHeat(20.532) 37 .accHeat(112.562) 38 .build(); 39 HistoryData nowData = HistoryData.builder() 40 .time(yesterday) 41 .temp(34.211) 42 .press(1.222) 43 .insFlow(34.211) 44 .accFlow(233.125) 45 .insHeat(20.532) 46 .accHeat(112.562) 47 .build(); 48 resList.add(yesData); 49 resList.add(nowData); 50 return resList; 51 }
4、代码执行结果
5、单独设置单元格格式 CellStyleHandler
.registerWriteHandler(new CellStyleHandler()) 上面代码中的注释部分。
1 package com.cloudansys.hawkeye.modules.report.schedule; 2 3 import com.alibaba.excel.metadata.CellData; 4 import com.alibaba.excel.metadata.Head; 5 import com.alibaba.excel.write.handler.CellWriteHandler; 6 import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; 7 import com.alibaba.excel.write.metadata.holder.WriteTableHolder; 8 import org.apache.poi.ss.usermodel.*; 9 10 import java.util.List; 11 12 public class CellStyleHandler implements CellWriteHandler { 13 @Override 14 public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) { 15 16 } 17 18 @Override 19 public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean aBoolean) { 20 21 } 22 23 @Override 24 public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) { 25 26 } 27 28 @Override 29 public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) { 30 Workbook workbook = writeSheetHolder.getSheet().getWorkbook(); 31 CellStyle cellStyle = workbook.createCellStyle(); 32 Font font = workbook.createFont(); 33 font.setFontName("Times New Roman"); 34 cellStyle.setFont(font); 35 cell.setCellStyle(cellStyle); 36 } 37 }