之前介绍了下复杂表头的导出,如果是那种非常简单的只是一行表头的导出,可以这样处理
pom背景
java
<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文件
java
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
导出文件代码
java
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请求的话把第一行改成
java
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream)
低版本的easyexcel导出的时间、数值在excel里都是文本格式的,如果有严格的版本要求可以参考我以下代码
标题背景色代码HeaderWriteHandler
java
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;
@Override
protected 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);
}
@Override
protected void setHeadCellStyle(Cell cell, Head head, Integer integer) {
cell.setCellStyle(headCellStyle);
}
@Override
protected void setContentCellStyle(Cell cell, Head head, Integer integer) {
}
}
时间格式化代码DateTimeWriteHandler
java
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;
@Override
public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean isHead) {
}
@Override
public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean isHead) {
}
@Override
public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean isHead) {
}
@Override
public 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
java
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;
@Override
public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean isHead) {
}
@Override
public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean isHead) {
}
@Override
public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean isHead) {
}
@Override
public 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文件引入一个包即可
java
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>7.0</version>
</dependency>