文章目录
- 1.EasyExcel 导出
- 1.1. Response流导出单sheet页
- 1.1.1 response流处理(防止中文乱码):
- 1.1.2 根据excel映射对象导出(适合结构化数据:列表台账)
- 1.1.3. 根据单元格集合导出(适合非结构化数据:详情页)
- 1.2. 单元格样式(背景色、加粗、字体、边框)
- 1.3. 单元格合并策略
- 1.3.1 只合并一次
- 1.3.2. 循环合并
- 1.4. 列宽样式策略
- 1.4.1. 根据每个列标题返回列宽
- 1.4.2. 以最长列的宽度作为所有列的宽度
- 1.4.3. 定长列宽
- 1.4.4. 自动调整列宽(推荐)
- 1.5. 转换器
- 1.5.1. 转换器注入方式
- 1.5.2. 转换器 注解
- 1.6. RowWriteHandler 行处理器
- 1.7. CellWriteHandler 单元格处理器
- 1.8. 图片导出
1.EasyExcel 导出
1.1. Response流导出单sheet页
1.1.1 response流处理(防止中文乱码):
response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");String fileName = URLEncoder.encode(getTitle(), "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
1.1.2 根据excel映射对象导出(适合结构化数据:列表台账)
excel导出实体:
@Data
@NoArgsConstructor
//@ContentRowHeight(50)//内容单元格高度
//@HeadRowHeight(50)//表头单元格高度
//@ColumnWidth(50)//单元格宽度
public class DemoExcelBO {@ExcelProperty(value = {"导出台账","序号"})private Integer no;@ExcelProperty(value = {"导出台账","编号"})private String code;
}
执行实际的导出动作:
//要导出的excel 数据List<DemoExcelBO> dataList = new ArrayList<>();//指定outputStream和 excel映射实体EasyExcel.write(response.getOutputStream(), DemoExcelBO.class)//注册 WriteHandler ,getDefaultWriteHandler() 见下.registerWriteHandler(getDefaultWriteHandler())//注入原生 或 自定义转换器.registerConverter(new DateStringConverter()).registerConverter(new BigDecimalStringConverter()).sheet("这是指定要写入的sheet页").doWrite(dataList );
1.1.3. 根据单元格集合导出(适合非结构化数据:详情页)
//执行excel写入对象ExcelWriter excelWriter = EasyExcel.write(url).build();//当前sheet页 写入对象创建者ExcelWriterSheetBuilder sheetBuilder = EasyExcel.writerSheet("测试sheet");//todo sheetBuilder 可以注入 writeHandlerWriteSheet writeSheet = sheetBuilder.build();//实际要写入的数据 ,List<Object> 为每一行的合并前的数据,放入List中为整个要写入的数据List<List<Object>> dataList = new ArrayList<>();//可以多次调用 excelWriter.write() 方法 。 写入同一sheet 的话 ,WriteSheet 对象不变excelWriter.write(list, writeSheet);//关流excelWriter.finish();
1.2. 单元格样式(背景色、加粗、字体、边框)
HorizontalCellStyleStrategy 分别设置 表头 和 表体 的样式:
//默认设置的样式 (表头样式 和 表体样式 不同)default WriteHandler getDefaultWriteHandler() {WriteCellStyle headWriteCellStyle = new WriteCellStyle();headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());WriteFont headWriteFont = new WriteFont();
// headWriteFont.setBold(true);// 加粗headWriteFont.setFontHeightInPoints((short) 11);//字体大小headWriteCellStyle.setWriteFont(headWriteFont);headWriteCellStyle.setWrapped(false);//自动换行
// headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);//CENTERWriteCellStyle contentWriteCellStyle = new WriteCellStyle();contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);contentWriteCellStyle.setBorderBottom(BorderStyle.NONE);//THINcontentWriteCellStyle.setBorderLeft(BorderStyle.NONE);contentWriteCellStyle.setBorderRight(BorderStyle.NONE);contentWriteCellStyle.setBorderTop(BorderStyle.NONE);contentWriteCellStyle.setWrapped(false);//自动换行HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);return horizontalCellStyleStrategy;}
1.3. 单元格合并策略
easyExcel 抽象父类类 :AbstractMergeStrategy
public abstract class AbstractMergeStrategy implements CellWriteHandler {@Overridepublic void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {//在创建单元格之前调用}@Overridepublic void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell,Head head, Integer relativeRowIndex, Boolean isHead) {//创建单元格后调用}@Overridepublic void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {//在单元格上的所有操作完成后调用if (isHead) {return;}merge(writeSheetHolder.getSheet(), cell, head, relativeRowIndex);}//合并策略protected abstract void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex);
}
1.3.1 只合并一次
easyExcel 预制子类:OnceAbsoluteMergeStrategy
//创建单元格时只合并一次
public class OnceAbsoluteMergeStrategy extends AbstractMergeStrategy {private int firstRowIndex;private int lastRowIndex;private int firstColumnIndex;private int lastColumnIndex;
}
1.3.2. 循环合并
easyExcel 预制子类:LoopMergeStrategy
//循环区域合并
public class LoopMergeStrategy extends AbstractMergeStrategy {private int eachRow;private int columnCount;private int columnIndex;
}
继承 AbstractMergeStrategy 重写 merge()方法 ,可自定义合并策略
1.4. 列宽样式策略
easyExcel 抽象父类:
public abstract class AbstractColumnWidthStyleStrategy implements CellWriteHandler, NotRepeatExecutor {@Overridepublic String uniqueValue() {return "ColumnWidthStyleStrategy";}@Overridepublic void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {//在创建单元格之前调用
}@Overridepublic void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell,Head head, Integer relativeRowIndex, Boolean isHead) {//在创建单元格之后调用
}@Overridepublic void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {//在单元格上的所有操作完成后调用setColumnWidth(writeSheetHolder, cellDataList, cell, head, relativeRowIndex, isHead);}//列宽样式策略protected abstract void setColumnWidth(WriteSheetHolder writeSheetHolder, List<CellData> cellDataList, Cell cell, Head head,Integer relativeRowIndex, Boolean isHead);}
1.4.1. 根据每个列标题返回列宽
easyExcel 预制子类:AbstractHeadColumnWidthStyleStrategy
//根据每个列标题返回列宽
public abstract class AbstractHeadColumnWidthStyleStrategy extends AbstractColumnWidthStyleStrategy {
}
1.4.2. 以最长列的宽度作为所有列的宽度
easyExcel 预制子类:LongestMatchColumnWidthStyleStrategy
//以最长列的宽度作为宽度
public class LongestMatchColumnWidthStyleStrategy extends AbstractColumnWidthStyleStrategy {
}
1.4.3. 定长列宽
easyExcel 预制子类:SimpleColumnWidthStyleStrategy
//所有列的宽度相同
public class SimpleColumnWidthStyleStrategy extends AbstractHeadColumnWidthStyleStrategy {
}
继承 AbstractColumnWidthStyleStrategy 重写 setColumnWidth()方法 ,可自定义列宽策略
1.4.4. 自动调整列宽(推荐)
在这里插入代码片
1.5. 转换器
easyExcel 转换器 父接口:
public interface Converter<T> {// 写入excel时 ,指定一个class ,该class 会在写入时 被拦截执行转换Class supportJavaTypeKey();// 读取excel时 ,指定一个excel字段类型,该类型 会在读取时 被拦截执行转换CellDataTypeEnum supportExcelTypeKey();//写入时 , java 类型 转换 excel数据类型 动作T convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) throws Exception;//读取时 , excel数据类型 转换 java 类型动作CellData convertToExcelData(T value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration)throws Exception;
}
有预制转换器,均实现改接口,如需自定义转换器,可实现 Converter 接口。
1.5.1. 转换器注入方式
方式一: 在excel实体上指定 某些特定字段生效
public class ContractAccountExcelBO {@ExcelProperty(value = {"合同导出台账","","序号"} ,converter = IntegerStringConverter.class)private Integer no;
}
方式二: .registerConverter() 方法注入 ,本次读取或写入时,均生效
//要导出的excel 数据
List<DemoExcelBO> dataList = new ArrayList<>();
EasyExcel.write(response.getOutputStream(),DemoExcelBO.class ).registerConverter(new BigDecimalStringConverter()).doWrite(dataList);//
1.5.2. 转换器 注解
指定日期格式注解:@DateTimeFormat(“yyyy-MM-dd”)
指定数字格式注解:@NumberFormat("#.00")
NumberFormat 中 format格式 遵循 Bigdecimal.format() 策略(#不补位,没有数字则空。0自动补位,没有数字自动补零)。
1.6. RowWriteHandler 行处理器
// 行创建 动作 拦截器
public interface RowWriteHandler extends WriteHandler {//行 创建前执行void beforeRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Integer rowIndex,Integer relativeRowIndex, Boolean isHead);//行 创建后执行void afterRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,Integer relativeRowIndex, Boolean isHead);//在该行的所有操作完成后调用。填充数据时不调用此方法。void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,Integer relativeRowIndex, Boolean isHead);
}
1.7. CellWriteHandler 单元格处理器
// 单元格创建 动作 拦截器
public interface CellWriteHandler extends WriteHandler {//单元格创建 前动作void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head,Integer columnIndex, Integer relativeRowIndex, Boolean isHead);//单元格创建 后动作void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head,Integer relativeRowIndex, Boolean isHead);//在单元格上的所有操作完成后调用void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead);
}
1.8. 图片导出
EasyExcel支持5种图片类型导出,根据1.1.3.把图片形式放入单元格中,写会即可
@Data
@ContentRowHeight(200)
@ColumnWidth(200 / 8)
public class ImageData {// 图片导出方式有5种private File file;private InputStream inputStream;/*** 如果string类型 必须指定转换器,string默认转换成string,该转换器是官方支持的*/@ExcelProperty(converter = StringImageConverter.class)private String string;private byte[] byteArray;/*** 根据url导出 版本2.1.1才支持该种模式*/private URL url;
}
Excel解析工具easyexcel全面探索
easyexcel复杂格式导出、自定义合并
图片导出