EasyExcel动态表头多sheet导出,单元格操作样式,自动修改单元格格式
说明
EasyExcel是一款开源的Java库,用于读取、写入和操作Excel文件。它是阿里巴巴集团开发的一款高效、功能丰富且易于使用的Excel操作工具。
EasyExcel提供了简洁的API,使得读写Excel文件变得非常方便,尤其适用于大量数据的导入导出操作。以下是EasyExcel的一些主要特性:
读取和写入Excel文件:EasyExcel提供了简单易用的API用于读取和写入Excel文件。你可以通过指定模型类来读取Excel文件的数据,并将数据写入到Excel文件中。
高性能:EasyExcel采用了基于事件驱动的模式,在读取和写入时能够更高效地处理大量数据。它能够以极快的速度读取和写入Excel文件,提高了数据处理的效率。
支持大数据量:EasyExcel使用内存友好的方式进行数据读取和写入,可以处理大量数据而不会导致内存溢出的问题。
导入导出灵活:EasyExcel支持导入和导出多种格式的Excel文件,包括xls和xlsx格式。你可以导入Excel文件的数据到Java对象中,并将Java对象的数据导出为Excel文件。
数据转换:EasyExcel提供了丰富的数据转换功能,可以方便地进行数据格式转换、数据映射、日期格式化等操作。
监听器支持:EasyExcel提供了监听器功能,你可以自定义监听器来处理Excel读取和写入的过程,实现一些自定义的业务逻辑。
多线程支持:EasyExcel支持多线程并发读写Excel,提高数据处理的速度。
自定义处理器
package com.csair.demo.util;import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.*;
import org.thymeleaf.util.StringUtils;import java.util.List;public class CustomCellWriter implements CellWriteHandler {@Overridepublic void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) {}@Overridepublic void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean aBoolean) {}@Overridepublic void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {Sheet sheet = writeSheetHolder.getSheet();Workbook workbook = sheet.getWorkbook();Font font = workbook.createFont();font.setColor(IndexedColors.RED.getIndex());CellStyle cellStyle = workbook.createCellStyle();cellStyle.setFont(font);//获取表头总共有多少列short lastCellNum = writeSheetHolder.getSheet().getRow(0).getLastCellNum();//过滤表头if (!aBoolean) {//获取当前行数int rowNum = integer + 1;//每一个单元格都会执行afterCellDispose此方法,每执行一次单元格数据+1,此处是校验当前行的全部单元格加载完毕if (writeSheetHolder.getSheet().getRow(rowNum).getLastCellNum() == lastCellNum) {//加载完毕执行业务代码(可按照自己实际业务进行修改)for (int i = 0; i < lastCellNum; i++) {if (i % 2 != 0) {//指定单元格修改样式writeSheetHolder.getSheet().getRow(rowNum).getCell(i).setCellStyle(cellStyle);}//录入的数据全部是String类型,直接获取就行,如果有不同类型数据,需要添加类型判断String stringCellValue = writeSheetHolder.getSheet().getRow(rowNum).getCell(i).getStringCellValue();//setCellValue会根据数据自动修改单元格格式if (StringUtils.isEmpty(stringCellValue)) {writeSheetHolder.getSheet().getRow(rowNum).getCell(i).setCellValue("");} else {writeSheetHolder.getSheet().getRow(rowNum).getCell(i).setCellValue(Double.parseDouble(stringCellValue));}}}}}
}
实现类
@GetMapping("/export")public void export(HttpServletResponse response) {try {response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("文件名", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");List<List<String>> head1 = new ArrayList<>();List<List<String>> data1 = new ArrayList<>();List<List<String>> head2 = new ArrayList<>();List<List<String>> data2 = new ArrayList<>();ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new CustomCellWriter()).build();excelWriter.write(data1, EasyExcel.writerSheet("sheet1").head(head1).build());excelWriter.write(data2, EasyExcel.writerSheet("sheet2").head(head2).build());//关闭流excelWriter.finish();} catch (Exception e) {e.printStackTrace();}}