概述

主要记录在开发中遇到的问题:使用easyexcel导出excel,一般数据都是保存在数据库中,如果查询返回的是一个实体类,且里面有嵌套的实体类对象,这时导出的时候要先对查询出的数据进行业务逻辑处理,让它符合导出规范,但是当数据量很大时,容易jvm内存,easyexcel(CellDataTypeEnum)只支持基本数据类型的导入,如图1-1所示,可以通过自定义数据类型(Converter)进行转换,但是这样只能返回一种基本的数据类型,像这种实体类里面通常会有很多信息,如果都要导出,这种方式也不合适。目前我能想到的方式是通过它提供的各种拦截器处理,大概流程如下:

通过自定义数据类型将实体类转换为String类型,然后通过拦截器将字符串拆分,添加对应列的数据。

图1-1 excel内部支持的数据类型

代码展示

  • excel日期转换类

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.converters.WriteConverterContext;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.data.WriteCellData;import java.text.SimpleDateFormat;
import java.util.Date;/*** @Description excel日期转换类 即将Mongo中类型为long的时间戳转化为yyyy-MM-dd HH:mm:ss时间* @author HuangAnting* @date 2022/4/8 10:16
*/
public class DateConverter implements Converter<Long> {@Overridepublic Class<?> supportJavaTypeKey() {//对象属性类型return Long.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {//CellData属性类型return CellDataTypeEnum.STRING;}@Overridepublic WriteCellData<?> convertToExcelData(WriteConverterContext<Long> context) throws Exception {//对象属性转CellDataLong cellValue = context.getValue();new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(cellValue));if (cellValue == null) {return new WriteCellData<>("");} else {return new WriteCellData<>( new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(cellValue)));}}
}
  • 自增序号拦截器
import com.alibaba.excel.write.handler.RowWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.*;/*** @Description 自增序号拦截器* @author HuangAnting* @date 2022/4/12 17:27
*/
public class IndexRowWriteHandler implements RowWriteHandler {private static final String FIRST_CELL_NAME = "序号";/*** 序号的样式,与其他列保持一样的样式*/private CellStyle firstCellStyle;private String description;/*** 列号*/private int count = 0;public IndexRowWriteHandler(String description){this.description = description;}@Overridepublic void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) {// 每一行首列单元格Cell indexCell = row.createCell(0);if(!isHead){indexCell.setCellValue(++count);try {row.getCell(3).setCellValue(description);}catch (Exception e){}}else {Workbook workbook = writeSheetHolder.getSheet().getWorkbook();firstCellStyle = firstCellStyle(workbook);indexCell.setCellValue(FIRST_CELL_NAME);indexCell.setCellStyle(firstCellStyle);writeSheetHolder.getSheet().setColumnWidth(0, 6 * 256);}}/*** excel首列序号列样式* @param workbook* @return*/public  CellStyle firstCellStyle(Workbook workbook) {CellStyle cellStyle = workbook.createCellStyle();//居中cellStyle.setAlignment(HorizontalAlignment.CENTER);cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);// 灰色cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());//设置边框cellStyle.setBorderBottom(BorderStyle.THIN);cellStyle.setBorderLeft(BorderStyle.THIN);cellStyle.setBorderRight(BorderStyle.THIN);cellStyle.setBorderTop(BorderStyle.THIN);//文字Font font = workbook.createFont();font.setBold(Boolean.TRUE);cellStyle.setFont(font);return cellStyle;}
}
  • 实体类
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.hat.easyexcel_export.excel.DateConverter;
import com.hat.easyexcel_export.excel.MonPointConverter;
import lombok.Data;/*** @Description 导出实体类* @author HuangAnting* @date 2022/4/12 17:26
*/
@Data
public class Car {/** 名称*/@ExcelProperty(value = "名称",index = 1)private String name;/** 价格*/@ExcelProperty(value = "价格",index = 2)private Double price;/** 描述*/@ColumnWidth(15)@ExcelProperty(value = "描述",index = 3)private String description;/** 坐标*/@ExcelProperty(value = "坐标",converter = MonPointConverter.class,index = 4)private MonPoint monPoint;/** 日期*/@ExcelProperty(value = "日期",converter = DateConverter.class)private Long createDate;
}
  • 自定义对象拦截器

import com.alibaba.excel.write.handler.RowWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import com.alibaba.fastjson.JSONObject;
import com.hat.easyexcel_export.entity.MonPoint;
import org.apache.poi.ss.usermodel.*;/*** @Description 行拦截器 将字符串的经纬度转换成两列数据* @author HuangAnting* @date 2022/4/12 17:26
*/
public class CustomRowWriteHandler implements RowWriteHandler {/*** 序号的样式,与其他列保持一样的样式*/private CellStyle firstCellStyle;private static final String LON_CELL_NAME = "经度";private static final String LAT_CELL_NAME = "纬度";/*** 列号*/@Overridepublic void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer integer, Boolean isHead) {Cell cell = row.getCell(4);row.removeCell(cell);Cell lon = row.createCell(4);Cell lat = row.createCell(5);if (!isHead) {String stringCellValue = cell.getStringCellValue();try {MonPoint monPoint = JSONObject.parseObject(stringCellValue, MonPoint.class);lon.setCellValue(monPoint.getLon());lat.setCellValue(monPoint.getLat());}catch (Exception e){}}else {Workbook workbook = writeSheetHolder.getSheet().getWorkbook();firstCellStyle = firstCellStyle(workbook);lon.setCellStyle(firstCellStyle);lat.setCellStyle(firstCellStyle);lon.setCellValue(LON_CELL_NAME);lat.setCellValue(LAT_CELL_NAME);}}/*** excel首列序号列样式** @param workbook* @return*/public CellStyle firstCellStyle(Workbook workbook) {CellStyle cellStyle = workbook.createCellStyle();//居中cellStyle.setAlignment(HorizontalAlignment.CENTER);cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);// 灰色cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());//设置边框cellStyle.setBorderBottom(BorderStyle.THIN);cellStyle.setBorderLeft(BorderStyle.THIN);cellStyle.setBorderRight(BorderStyle.THIN);cellStyle.setBorderTop(BorderStyle.THIN);//文字Font font = workbook.createFont();font.setBold(Boolean.TRUE);cellStyle.setFont(font);return cellStyle;}
}

gitee地址:easyexcel_export

以上仅代表本人对easyexcel的认识和了解,欢迎大家批评指正。

easyexcel将对象处理为多列,自增序列相关推荐

  1. sql server无效的对象名称 - 但表列在SSMS表列表中

    本文翻译自:sql server invalid object name - but tables are listed in SSMS tables list I am attempting to ...

  2. sql修改表属性常见错误之——多个对象访问某一列

    1.不允许保存更改. 修改某个字段的数据类型点击保存按钮有时候会弹出:不允许保存更改.您所做的更改要求删除并重新创建以下表.您对无法重新创建的表进行了更改或者启用了"阻止保存要求重新创建表的 ...

  3. EasyExcel动态跨行合并和自定义列宽的策略

    1. 动态表头 2.自定义跨行合并的策略 3.自定义列宽的策略 下载表格的代码 new 出合并单元格的对象 第一个参数写入需要合并的列的字符串列表,会根据相同自动合并 第二个参数写入要合并单元格是第几 ...

  4. 使用 EasyExcel 动态添加自增序号列

    前言 本文将介绍如何通过使用EasyExcel自定义拦截器实现在最终的Excel文件中新增一列自增的序号列,最终的效果如下: 此外,本文所使用的完整代码示例已上传到GitHub. 实现 本文主要是通过 ...

  5. dataframe 对象中统计每个列的所有数的和,或者每一行所有值的和

    如何计算dataframe 对象中每个列的所有数的和,或者每一行所有值的和? 可以使用sum函数. 举个例子:现在有个dataframe对象df3,内容如下: 如何看每一列的和是多少?代码如下: df ...

  6. easyExcel给表格的每一列设置不同样式

    1.前言: exsyExcel官方文档大部分都是使用实体类注解的形式,对于不使用用实体类生成Excel时,很多功能都难以实现,文档对这方面都写得很少,但我们可以去GitHub上查看官方demo,就可以 ...

  7. 关于EasyExcel的invoke方法读取多少列

    首先在easyexcel监听器里面定义一个dataList用于得到invoke按行读取的数据的数据 private final List<Map<Integer, String>&g ...

  8. EasyExcel合并单元格(同列相同数据合并)

    合并后效果如下: 合并策略代码: public class CustomMergeStrategy extends AbstractMergeStrategy {/*** 分组,每几行合并一次*/pr ...

  9. EasyExcel导入导出样式、自适应列宽、自适应行高

    一.先加依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</a ...

最新文章

  1. Hadoop中RPC协议小例子报错java.lang.reflect.UndeclaredThrowableException解决方法
  2. 枚举类型是怎样定义的?有什么用途?_新型合金材料——什么是液态金属、液态金属的定义、发展以及用途...
  3. python性能测试方法_Python实现测试磁盘性能的方法
  4. AT2370-[AGC013D]Piling Up【dp】
  5. BZOJ 3513: [MUTC2013]idiots [FFT]
  6. python3设置编码_python3 中文乱码与默认编码格式设定方法
  7. 数值分析-拉格朗日中值定理与积分中值定理
  8. 【实习之T100开发】T100程序功能代码积累
  9. EMNLPICLR 多模态学习前沿分享
  10. 签入代码(新建分支,新建推拉请求)关联工作项,却找不到自己需要的工作项...
  11. 使用NetAssist注意事项
  12. 关于从asc格式到pcd格式的转换
  13. 泡泡龙游戏开发系列教程(一)
  14. Android audio 三 AudioRecord 分析下
  15. python二级操作题评分方法_第二卷讲解Python语言计算机等级考试二级操作题
  16. java 个人通讯录_java个人通讯录管理系统
  17. 联想服务器带外管理怎么进系统,管理 Internet Explorer 中的加载项
  18. 网站黑白色调之filter属性
  19. 为什么说“水果焦虑”是个伪命题?
  20. 富士康计算机类笔试题,富士康笔试题目及答案

热门文章

  1. 今天觉得自己好像比较紧张
  2. 如何将每一条记录放入到对应的范围中
  3. js中的==与===的区别
  4. asp.net 之高速缓存
  5. 1218. 最长定差子序列
  6. [Leetcode][第114题][JAVA][二叉树展开为链表][递归][迭代]
  7. [Leetcode][第206题][JAVA][反转一个单链表][递归][迭代]
  8. html鼠标离开点击停留,Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)...
  9. uos20专业版是linux哪个版本,WPS Office 2019 for Linux 专业版已与统一操作系统 UOS 完成适配...
  10. 7-13 部落 (25 分)