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 {
@Override
public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) {
}
@Override
public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean aBoolean) {
}
@Override
public 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();
}
}