背景
在业务开发过程中,出现如下需求:在一条记录中,存在多条内容数据,此时导出excel表格时,则需要对同一条记录中的数据进行处理。如下图
easyexcel的引入
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.3</version>
</dependency>
业务操作
- 响应vo的处理
easyexcel导出excel表格,通常需要再响应的vo信息中添加对应的注解
需要的导出的字段中,添加注解 @ExcelProperty(value = {“记录导出”, “工单号”}, index = 0)
不需要导出的字段中,则添加忽略导出注解 @ExcelIgnore - 导出数据处理
在获取需要导出的数据时,如上图中,装载机4,内容项中存在两条数据,则装载机4需要生成两条内容项不同,其他相同的数据 - 构建合并策略方法
/**
* 动态导出合并excel
* @param response
* @param data 导出的数据集合
* @param tableName 导出的表名称
* @param cls 响应的vo对应的cls
* @param mergeRowIndex 需要合并的列
* @param mergeColumeIndex 开始合并的行
*/
public static void exportMergeExcel(HttpServletResponse response, List data, String tableName, Class cls,int mergeRowIndex, int[] mergeColumeIndex) {
try {
response.setContentType("application/vnd.ms-easyExcel");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename="+ URLEncoder.encode( tableName + ".xlsx", "utf-8" ));
String fileName = tableName;
ExcelWriterBuilder excelWriterBuilder = new ExcelWriterBuilder();
excelWriterBuilder.file(response.getOutputStream());
if (cls != null) {
excelWriterBuilder.head(cls);
}
// 由于 Java 8 localDate 和 localDateTime 不支持转化,需要添加自定义转化器
excelWriterBuilder.registerConverter(new LocalDateStringConvert());
excelWriterBuilder.registerConverter(new LocalDateTimeStringConvert());
// 不设置表头和内容样式
//表头样式策略
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
//设置表头居中对齐
headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
WriteFont headWriteFont = new WriteFont();
headWriteFont.setFontHeightInPoints((short) 11);
headWriteFont.setBold(true);
headWriteCellStyle.setWriteFont(headWriteFont);
excelWriterBuilder.registerWriteHandler(new ExcelMergeUtil(mergeRowIndex, mergeColumeIndex)).sheet(fileName).doWrite(data);
} catch (Exception e) {
log.error("导出失败!");
e.printStackTrace();
}
}
- 调用动态合并策略导出excel表
//需要合并的列
int[] mergeColumeIndex = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 21};
// 从那一行开始合并
int mergeRowIndex = 1;
EasyExcelUtilV2.exportMergeExcel(response, orderExportRespVoList, tableName, orderExportRespVo.class, mergeRowIndex, mergeColumeIndex);