前言

需求:客户提出导出excel统计数据,使用EasyExcel导出比较便捷,导出大量数据时有优势,并且耗费内存较少。


一、EasyExcel是什么?

EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。
他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能(来自官网)。
更多更详细的使用请访问:官方代码示例(Gitee)

二、EasyExcel使用

1.简单的导出EasyExcel

  • 使用类导出非常方便,只需要使用@ExcelProperty注解即可,注解的值就是表头
    代码如下(示例):
@Getter
@Setter
@EqualsAndHashCode
@ToString
@Builder
public class ExcelExportDTO {

    /**
     * 序号
     */
    @ExcelProperty("序号")
    private String index;

    /**
     * 最高温
     */
    @ExcelProperty("最高温")
    private String maxTemp;
    /**
     * 最低温
     */
    @ExcelProperty("最低温")
    private String minTemp;

	// ...
}
 	public ReportDownDto exportWorksheetReport(Long id){
 		String savePath = "E:/test/测试导出excel.xlsx";
 		String sheetName = "测试导出excel";
	    EasyExcel.write(savePath, ExcelExportDTO.class).sheet(sheetName).doWrite(this.exportAnalyseResult(id));
	}
	/**
     * 导出excel
     */
    public List<ExcelExportDTO> exportAnalyseResult(Long id){
        // 获取导出数据
    }

2.单独设置样式

  • 设置表头和内容
 	public ReportDownDto exportWorksheetReport(Long id){
 		String savePath = "E:/test/测试导出excel.xlsx";
 		String sheetName = "测试导出excel";	
 		//表头内容策略
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        //设置头居中
        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        // 设置背景色
        headWriteCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.index);

        //设置内容
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        //设置 水平居中
        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
		// 设置表头和内容
        HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
        // 这里需要指定写用哪个class去写,然后写到第一个sheet,名字为sheetName 然后文件流会自动关闭
 		 EasyExcel.write(savePath, ExcelExportDTO.class).sheet(sheetName)
                .registerWriteHandler(horizontalCellStyleStrategy)
                .doWrite(this.exportAnalyseResult(id));
	}
  • 设置所有表格样式:宽度根据内容自适应
public class AutoWidthHandlerUtil extends AbstractColumnWidthStyleStrategy {


    @Override
    public void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList,
                               Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
        // 计算是否需要设置列宽。仅在处理表头行或第一行数据时设置列宽。
        boolean needSetWidth = relativeRowIndex != null && (isHead || relativeRowIndex == 0);
        if (needSetWidth) {
        	// 获取当前sheet
            Sheet sheet = writeSheetHolder.getSheet();
            // 获取当前列的宽度(单位是1/256个字符宽度)
            int columnWidth = sheet.getColumnWidth(cell.getColumnIndex());
            // 获取单元格内容的字节长度
            int length = cell.getStringCellValue().getBytes().length;
            // 计算新的列宽,长度乘以256,因为列宽度单位是1/256个字符宽度
            columnWidth = Math.max(columnWidth, length * 256);
            // 设置最小宽度,防止过窄
            columnWidth = Math.max(columnWidth, 256 * 10);
            sheet.setColumnWidth(cell.getColumnIndex(), columnWidth);
        }
    }


}
	public ReportDownDto exportWorksheetReport(Long id){
 		String savePath = "E:/test/测试导出excel.xlsx";
 		String sheetName = "测试导出excel";
 		//表头内容策略
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        //设置头居中
        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        // 设置背景色
        headWriteCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.index);

        //设置内容
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        //设置 水平居中
        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
		// 设置表头和内容
        HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
		// 这里需要指定写用哪个class去写,然后写到第一个sheet,名字为sheetName 然后文件流会自动关闭
        EasyExcel.write(savePath, ExcelExportDTO.class).sheet(sheetName)
                .registerWriteHandler(horizontalCellStyleStrategy)
                .registerWriteHandler(new AutoWidthHandlerUtil())
                .doWrite(this.exportAnalyseResult(id));
     }

总结

目前满足客户要求仅仅就是基本导出,对于样式没有特殊的要求,后续有需求再更新

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐