问题描述

1、项目中需要多shee导出,需要动态生成列。
2、我的方法是在执行ExcelExportUtil.exportExcel之后,插入自定义的列。
3、发现在执行ExcelExportUtil.exportExcel时传入的list,在下边用的时候变成了空数组
4、最后查看源码发现在执行exportExcel时会删除源数据

1、EasyPoi 导出excel 会删除的数据源

导出excel的时候发现传入的数据源,在执行过ExcelExportUtil.exportExcel之后会变成空list
最后查看源码发现EasyPoi中ExcelExportService里边的remove

解决办法是通过源数据重新生成新数据传入

方法中Entity是你自己的映射类
 // 使用ObjectMapper(Entity是你自己的映射类)ObjectMapper mapper = new ObjectMapper();String str = mapper.writeValueAsString(data);JavaType javaType =mapper.getTypeFactory().constructParametricType(List.class, Entity.class);List<Entity> excelData = mapper.readValue(str, javaType);
 // 使用JSON序列化和反序列化List<Entity> excelData =JSON.parseArray(JSON.toJSONString(data), Entity.class);

2、下边是动态写入cell的主要代码

生成cell,在默认列后插入生成的cell

// 获取默认数据的列数
private int getCellNum(Sheet sheet) {Iterator<Cell> cellIterator = sheet.getRow(0).cellIterator();int cellAllNum = 1;while (cellIterator.hasNext()) {Cell next = cellIterator.next();String cellValue = next.getStringCellValue();if (StringUtils.isNotBlank(cellValue)) {cellAllNum += 1;}}return cellAllNum;}
// 在默认列后插入自定义的cell
public void insertCell(Workbook workbook, Exam exam, List<Entity> data) {// 获取第二个sheetSheet sheet = workbook.getSheetAt(1);CellStyle cellStyle = workbook.createCellStyle();// 设置水平居中cellStyle.setAlignment(HorizontalAlignment.CENTER);// 设置垂直居中cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 获取sheet的列数int cellNum = this.getCellNum(sheet);// getExcelHeaderList自己生成动态表头的逻辑List<String> resultHeaderList = this.getExcelHeaderList();for (int i = 0; i < resultHeaderList.size(); i++) {// 生成表头Cell cell = sheet.getRow(0).createCell(cellNum + i);cell.setCellStyle(cellStyle);cell.setCellValue(String.format("%s、%s", i + 1, resultHeaderList.get(i)));}for (int i = 0; i < data.size(); i++) {Row row = sheet.getRow(i + 1);Map<String, Float> examItemMap = data.get(i).getExamItemMap();for (int j = 0; j < resultHeaderList.size(); j++) {sheet.setColumnWidth(cellNum + j, 256 * 20);Cell cell = row.createCell(cellNum + j);cell.setCellStyle(cellStyle);cell.setCellValue(你自己的数据);}}}

生成sheet

public Map<String, Object> getExcelListMap(String sheetName, Class<?> clazz, List<?> list) {Map<String, Object> map = new HashMap<>();ExportParams sheet = new ExportParams();sheet.setSheetName(sheetName);map.put("title", sheet);map.put("entity", clazz);map.put("data", list);return map;}

执行导出

public void export(HttpServletResponse response, @PathVariable Long id) throws IOException {response.setHeader("content-Type", "application/vnd.ms-excel");response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");response.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode("excel名称.xls", "UTF-8"));// 添加sheet    List<Map<String, Object>> excelList = new ArrayList<>();excelList.add(this.getExcelListMap("成绩分析", Entity1.class, data1));excelList.add(this.getExcelListMap("考试明细", Entity1.class, data2));// 导出Workbook workbook = ExcelExportUtil.exportExcel(excelList, ExcelType.HSSF);// 动态修改cell数据insertCell(workbook, exam, data);workbook.write(response.getOutputStream());workbook.close();}

EasyPoi导出excel多Sheet遇到的坑相关推荐

  1. easyexcel多个sheet导入_Java中Easypoi实现excel多sheet表导入导出功能

    Easypoi简化了开发中对文档的导入导出实现,并不像poi那样都要写大段工具类来搞定文档的读写. 第一步引入Easypoi依赖 cn.afterturn easypoi-spring-boot-st ...

  2. 编码技巧——使用Easypoi导出Excel、多sheet

    本文主要介绍easypoi导出Excel的代码示例:自己之前手动实现过导出工具类<编码技巧--导出工具类>,基于实体和注解,通过反射来映射实体字段和exce列的关系:在部分工程里面看到了e ...

  3. 用easyPoi导出excel,带多sheet,合并单元格,合计,单元格金额类型

    用easyPoi导出excel,带多sheet,合并单元格,合计,单元格金额类型 文档连接:http://easypoi.mydoc.io/ 1.引入依赖 <!-- 导出文件工具 EasyPoi ...

  4. 使用EasyPOI导出Excel模板数据(含图片)

    使用EasyPOI导出Excel模板数据(含图片) EasyPOI功能如同名字Easy,主打的功能就是容易,让一个没接触过POI的人员可以方便的写出Excel导出,Excel模板导出,Excel导入, ...

  5. EasyPoi导出Excel实现标记颜色

    EasyPoi导出Excel实现标记颜色 PS:不知道EasyPoi 的可以看快速上手文档 <dependency><groupId>cn.afterturn</grou ...

  6. easypoi导出excel不设置样式_EasyPOI 导出excel设置边框,背景颜色,字体样式

    EasyPOI 导出excel设置边框,背景颜色,字体样式 EasyPOI 导出代码示例ExportParams exportParams = new ExportParams(); exportPa ...

  7. 使用easypoi导出excel实现动态列

    使用easypoi导出excel实现动态列 说明 使用的是easypoi进行导出 行头是动态生成 依据key进行列匹配,进行数据填充 第一列进行纵向动态合并 自己的一个使用,记录一下 工具依赖 < ...

  8. Poi 导出excel单个sheet的内容

    Poi 导出excel单个sheet的内容 目录 Poi 导出excel单个sheet的内容 代码: Contrller Service: 导出引用:ExcelExportUtil 导出类:PoiSi ...

  9. EasyPoi导出Excel,完整代码+案例(100%能导出——导不出来砍我)

    java解决,EasyPoi导出Excel,废话不多说,直接上代码 第一步:导入依赖 <!--EasyPoi导入导出 --><dependency><groupId> ...

最新文章

  1. python导包顺序_2019-03-21 python导入包以及Python程序执行顺序理解
  2. C# webservice服务跟踪调试方法(转)
  3. md5与des算法有何不同_Python算法详解:为什么说算法是程序的灵魂?
  4. Day12-BigDecimal笔记及练习
  5. 《Reids 设计与实现》第十二章 复制
  6. java 视频转码工具类_JavaCV入门指南:FrameConverter转换工具类及CanvasFrame图像预览工具类(javaCV教程完结篇)...
  7. 纯新手DSP编程--5.21--RTDX
  8. [sipdroid]3CX voip 服务器的搭建教程---个人实践版
  9. 重磅推荐!5 款强大的开源报表工具
  10. Docker的卸载与安装(阿里云)
  11. CF1290F Making Shapes——数位背包DP
  12. Ubuntu18.04为EW-7822ULC网卡安装驱动
  13. 5.JVM三大性能调优参数:-Xms -Xmx -Xss
  14. 5分钟python爬虫案例,手把手教爬取国内外最新疫情历史数据
  15. 蜗牛—cocos2dx之初识
  16. 插值中产生的龙格现象
  17. oracle++spm,ORACLE 11G 使用SPM来调整SQL语句的执行计划
  18. 【数学】第二型曲线积分
  19. python安装环境相关,已被坑过
  20. python中offset_python pandas tseries.offsets.DateOffset用法及代码示例

热门文章

  1. mysql存储过程fetch into_存储过程fetch into
  2. php同步刷新,多个PHPWind论坛数据同步更新教程
  3. 利用Python爬取全国250m精度的人口数据
  4. [转]FBWCBBWC
  5. ghost网络克隆功能实现【批量】计算机操作【系统的安装】,万能ghost网络克隆工具...
  6. 第十三章 指导学习:人机猜拳
  7. 神经网络模式识别方法,神经网络模式识别代码
  8. Apache Awstats 安装配置系列 (4)之 Awstats 安装 配置
  9. TypeScript入门篇——基础知识(快速了解js与ts差异)
  10. Windows10 托盘图标消失隐藏?恢复正常显示方法!