详细聊下easyexcel导出
之前介绍了下复杂表头的导出,如果是那种非常简单的只是一行表头的导出,可以这样处理
pom背景
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.0</version></dependency>
easyexcel版本需要跟poi保持对应官网地址
我因为是旧版本poi就使用的是2.2.6版本(升级poi代价有点大许多方法不能用了)
先上标准的导出dto文件
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.annotation.write.style.ColumnWidth;import java.math.BigDecimal;
import java.util.Date;public class UserExportDto {@ExcelProperty(value = "名字")private String name;@ExcelProperty(value = "年纪")private Integer age;@ExcelProperty(value = "时间1")@DateTimeFormat("yyyy/MM/dd")@ColumnWidth(18)private Date vDate;@ExcelProperty(value = "时间2")@DateTimeFormat("yyyy/MM/dd")@ColumnWidth(18)private Date mDate;@ExcelProperty(value = "比例")private BigDecimal value;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Date getvDate() {return vDate;}public void setvDate(Date vDate) {this.vDate = vDate;}public Date getmDate() {return mDate;}public void setmDate(Date mDate) {this.mDate = mDate;}public BigDecimal getValue() {return value;}public void setValue(BigDecimal value) {this.value = value;}
}
这里格式化了时间yyyy/MM/dd
导出文件代码
ExcelWriter excelWriter = EasyExcel.write("D://1.xlsx").registerWriteHandler(new HeaderWriteHandler()).registerWriteHandler(new DateTimeWriteHandler()).registerWriteHandler(new PercentWriteHandler()).build();WriteSheet sheet = EasyExcel.writerSheet(0,"用户").head(UserExportDto.class).build();List<UserExportDto> dtos = initData();excelWriter.write(dtos,sheet);excelWriter.finish();
post请求的话把第一行改成
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream)
低版本的easyexcel导出的时间、数值在excel里都是文本格式的,如果有严格的版本要求可以参考我以下代码
标题背景色代码HeaderWriteHandler
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.util.StyleUtil;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.style.AbstractCellStyleStrategy;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;public class HeaderWriteHandler extends AbstractCellStyleStrategy implements CellWriteHandler {private XSSFCellStyle headCellStyle;@Overrideprotected void initCellStyle(Workbook workbook) {headCellStyle = (XSSFCellStyle) StyleUtil.buildHeadCellStyle(workbook,null);headCellStyle.setFillForegroundColor(new XSSFColor(new java.awt.Color(245,233,245,255)));headCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);Font font = workbook.createFont();font.setFontHeightInPoints((short) 11);font.setBold(true);headCellStyle.setFont(font);}@Overrideprotected void setHeadCellStyle(Cell cell, Head head, Integer integer) {cell.setCellStyle(headCellStyle);}@Overrideprotected void setContentCellStyle(Cell cell, Head head, Integer integer) {}
}
时间格式化代码DateTimeWriteHandler
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.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;public class PercentWriteHandler implements CellWriteHandler {private static final Logger logger = LoggerFactory.getLogger(PercentWriteHandler.class);private static Set<String> DATA_SET = new HashSet<>(Arrays.asList("value"));private CellStyle cellStyle;@Overridepublic void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean isHead) {}@Overridepublic void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean isHead) {}@Overridepublic void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean isHead) {}@Overridepublic void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean isHead) {if(!isHead && DATA_SET.contains(head.getFieldName())){if(cell==null){return;}//不同版本这个不一样看情况if(cell.getCellType()!= CellType.NUMERIC){return;}Workbook workbook = writeSheetHolder.getSheet().getWorkbook();DataFormat dataFormat = workbook.createDataFormat();short percentFormat = dataFormat.getFormat("0.00%");if(cellStyle == null){cellStyle = workbook.createCellStyle();cellStyle.setDataFormat(percentFormat);}//应用样式到单元格cell.setCellStyle(cellStyle);}}
}
百分比格式化代码PercentWriteHandler
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.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;public class PercentWriteHandler implements CellWriteHandler {private static final Logger logger = LoggerFactory.getLogger(PercentWriteHandler.class);private static Set<String> DATA_SET = new HashSet<>(Arrays.asList("value"));private CellStyle cellStyle;@Overridepublic void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean isHead) {}@Overridepublic void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean isHead) {}@Overridepublic void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean isHead) {}@Overridepublic void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean isHead) {if(!isHead && DATA_SET.contains(head.getFieldName())){if(cell==null){return;}//不同版本这个不一样看情况if(cell.getCellType()!= CellType.NUMERIC){return;}Workbook workbook = writeSheetHolder.getSheet().getWorkbook();DataFormat dataFormat = workbook.createDataFormat();short percentFormat = dataFormat.getFormat("0.00%");if(cellStyle == null){cellStyle = workbook.createCellStyle();cellStyle.setDataFormat(percentFormat);}//应用样式到单元格cell.setCellStyle(cellStyle);}}
}
截图展示下具体的结果
标题背景浅粉红色,字体加粗等等
时间筛选的时候是这样的
百分比显示保留2位,但是原始值仍然存在
对了如果提示导出报错类不存在org/objectweb/asm/Type
pom文件引入一个包即可
<dependency><groupId>org.ow2.asm</groupId><artifactId>asm</artifactId><version>7.0</version></dependency>