easyexcel升级3.3.4失败的经历

原本想通过easyexcel从2.2.6升级到3.3.3解决一部分问题,结果之前的可以用的代码,却无端的出现bug
1 Sheet index (1) is out of range (0…0)
什么都没有改,就出了问题,那么问题肯定出现在easyexcel版本自身.使用模板填充的方式进行多sheet填错,报错out of range #2731
从easyexcel一个模板动态多个sheet填充,easyexcel2,2,10就有这个问题。

异常如下

java.lang.IllegalArgumentException: Sheet index (1) is out of range (0..0)at org.apache.poi.hssf.usermodel.HSSFWorkbook.validateSheetIndex(HSSFWorkbook.java:569)at org.apache.poi.hssf.usermodel.HSSFWorkbook.getSheetAt(HSSFWorkbook.java:1003)at org.apache.poi.hssf.usermodel.HSSFWorkbook.getSheetAt(HSSFWorkbook.java:131)at com.alibaba.excel.context.WriteContextImpl.initSheet(WriteContextImpl.java:184)at com.alibaba.excel.context.WriteContextImpl.currentSheet(WriteContextImpl.java:135)at com.alibaba.excel.write.ExcelBuilderImpl.addContent(ExcelBuilderImpl.java:54)at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:73)at com.whty.acc.accountbook.service.impl.AccountBookExcelServiceImpl.exportExcelList(AccountBookExcelServiceImpl.java:146)

代码如下

public void exportExcelList(OutputStream outputStream, String pathName, List<ExcelSheetVO> list, boolean isShowCount, int lastCol) {Resource resource = new ClassPathResource(pathName);InputStream inputStream = null;String fileName = DateUtil.getDateRandom() + ".xls";File file = new File(TmpDic.url + File.separator + fileName);try {inputStream = resource.getInputStream();FileUtils.copyInputStreamToFile(inputStream, file);} catch (IOException e) {e.printStackTrace();}ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(file).build();FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();StyleCellHander styleCellHander = new StyleCellHander(false);for (ExcelSheetVO vo : list) {if (vo.getList() != null) {WriteSheet writeSheet = EasyExcel.writerSheet(vo.getSheetNo(), vo.getSheetName())//标题.registerWriteHandler(new SubsidiaryLedgerSheetWriteHander(vo.getExcelHeadVO(), isShowCount, lastCol))//单元格.registerWriteHandler(new SubsidiaryLedgerSheetStyleCellHander(isShowCount, false)).registerWriteHandler(new CustomCellWriteHandler()).build();excelWriter.fill(vo.getList(), fillConfig, writeSheet);} else {WriteSheet writeSheet = EasyExcel.writerSheet(vo.getSheetNo(), vo.getSheetName()).build();List<List> multipleList = vo.getMultipleList();int titleRownum = 0;int num = 0;for (int i = 0; i < multipleList.size(); i++) {List<LedgerDto> data = multipleList.get(i);if (i > 0) {titleRownum = num;}num = num + data.size() + 3;ExcelHeadVO headVo = new ExcelHeadVO();BeanUtils.copyProperties(vo.getExcelHeadVO(), headVo);if (i > 0) {headVo.setTitle(data.get(0).getSubFullName());headVo.setSubName(data.get(0).getSubCodeName());}WriteTable writeTable = EasyExcel.writerTable(i).head(vo.getClazz())//标题.registerWriteHandler(new TitleSheetWriteHandler(headVo, titleRownum, lastCol))//单元格.registerWriteHandler(styleCellHander).build();excelWriter.write(data, writeSheet, writeTable);}}}excelWriter.finish();file.delete();}

easyexcel一个模板动态多个sheet填充,从这篇文章中找到了解决方案。但结果并没有对方的好,奇怪。
第一个页签空白
1
第二页签,把上面的模板也导出来了,奇怪了,easyexcel没有结果测试吗?
1
xlsx格式文件比xls格式文件,体积小一半
1
一个Sheet多个table,设置表头不需要的话
1
显示效果如下,上面的模板还在,但是表头信息没有了
1
easyexcel centos 导出excel无数据 在windows上有 easyexcel导出复杂excel
首先猜想是不是跟sheet名称有关系,于是根据名称来匹配
1
得到的效果是,页签名称与页签中的内容是匹配的
1
如果使用,则得到的效果是乱的

 WriteSheet writeSheet = EasyExcel.writerSheet(vo.getSheetNo()).needHead(Boolean.TRUE).build();

1
由于模板也多了一个页签,于是修正

for (int i = 0; i < list.size(); i++){ExcelSheetVO vo = list.get(i);if (i==0){workbook.setSheetName(0,vo.getSheetName());} else{workbook.cloneSheet(0,vo.getSheetName());}}

为什么下面的方式填写数据会为空呢?

WriteSheet writeSheet = EasyExcel.writerSheet(vo.getSheetName())//标题.registerWriteHandler(new SubsidiaryLedgerSheetWriteHander(vo.getExcelHeadVO(), isShowCount, lastCol))//单元格.registerWriteHandler(new SubsidiaryLedgerSheetStyleCellHander(isShowCount, false)).registerWriteHandler(new CustomCellWriteHandler()).build();excelWriter.fill(vo.getList(), fillConfig, writeSheet);

最终无奈退回到2.2.6,应该说2.2.6相对最好用了,现在系统报下面的错误

18:57:14.600 ERROR c.w.a.a.controller.AccSubsidiaryLedgerController - The maximum number of cell styles was exceeded. You can define up to 4000 styles in a .xls workbook
java.lang.IllegalStateException: The maximum number of cell styles was exceeded. You can define up to 4000 styles in a .xls workbookat org.apache.poi.hssf.usermodel.HSSFWorkbook.createCellStyle(HSSFWorkbook.java:1298)at org.apache.poi.hssf.usermodel.HSSFWorkbook.createCellStyle(HSSFWorkbook.java:131)at com.alibaba.excel.util.StyleUtil.buildDefaultCellStyle(StyleUtil.java:27)at com.alibaba.excel.util.StyleUtil.buildHeadCellStyle(StyleUtil.java:49)at com.alibaba.excel.write.style.AbstractVerticalCellStyleStrategy.setHeadCellStyle(AbstractVerticalCellStyleStrategy.java:47)at com.alibaba.excel.write.style.AbstractCellStyleStrategy.afterCellDispose(AbstractCellStyleStrategy.java:58)at com.alibaba.excel.util.WriteHandlerUtils.afterCellDispose(WriteHandlerUtils.java:176)

查看代码,原来是poi的限制,跟easyexcel没有直接的关系,因此升不升级没有影响。
1
单月明细账36个sheet,每个sheet又有20~50个明细科目。
如下面改成xlsx格式

ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(file).excelType(ExcelTypeEnum.XLSX).build();

提示新的错误

Caused by: org.apache.poi.openxml4j.exceptions.OLE2NotOfficeXmlFileException: The supplied data appears to be in the OLE2 Format. You are calling the part of POI that deals with OOXML (Office Open XML) Documents. You need to call a different part of POI to process this data (eg HSSF instead of XSSF)at org.apache.poi.openxml4j.opc.internal.ZipHelper.verifyZipHeader(ZipHelper.java:179)at org.apache.poi.openxml4j.opc.internal.ZipHelper.openZipStream(ZipHelper.java:209)at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:98)at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:324)at org.apache.poi.util.PackageHelper.open(PackageHelper.java:37)at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:295)at com.alibaba.excel.util.WorkBookUtil.createWorkBook(WorkBookUtil.java:32)

这个错误说的我使用的是xls的模板,好吧,更正为xlsx的模板,结果提示,EasyExcel实战与笔记,也有人跟我遇到同样的问题。

java.lang.RuntimeException: NotImplementedat org.apache.poi.xssf.streaming.SXSSFSheet.shiftRows(SXSSFSheet.java:1000)at com.alibaba.excel.write.executor.ExcelWriteFillExecutor.shiftRows(ExcelWriteFillExecutor.java:158)at com.alibaba.excel.write.executor.ExcelWriteFillExecutor.fill(ExcelWriteFillExecutor.java:115)at com.alibaba.excel.write.ExcelBuilderImpl.fill(ExcelBuilderImpl.java:78)at com.alibaba.excel.ExcelWriter.fill(ExcelWriter.java:185)

更正模板后,又出现新的问题

java.lang.NullPointerException: nullat com.alibaba.excel.write.executor.ExcelWriteFillExecutor.doFill(ExcelWriteFillExecutor.java:191)at com.alibaba.excel.write.executor.ExcelWriteFillExecutor.fill(ExcelWriteFillExecutor.java:118)at com.alibaba.excel.write.ExcelBuilderImpl.fill(ExcelBuilderImpl.java:78)at com.alibaba.excel.ExcelWriter.fill(ExcelWriter.java:185)

还是改回xls格式,尝试解决单元格样式的问题。回头又发现一个问题,就是第一个页签,与页面内容不匹配的问题。EasyExcel修改模板sheet的名称(解决EasyExcel第一个sheet名称无法修改bug),有人跟我一样的问题,按照他的方式解决即可。
1
接下来的问题在于怎么将CellStyle的创建数量降低,poi workbook 的
因为HSSFCellStyle不能直接被实例化,被保护了。
1
cellstyle 创建不能超过4000的解决方法,这个里面没有提供CacheManage的代码,或许也不需要这么干吧。无非是创建CellStyle,另外一种解决方案

    private CellStyle getStyle(ExcelWriter excelWriter){CellStyle cellStyle = excelWriter.writeContext().writeWorkbookHolder().getWorkbook().createCellStyle();//背景为白色cellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());//右对齐cellStyle.setAlignment(HorizontalAlignment.RIGHT);// 下边框cellStyle.setBorderBottom(BorderStyle.THIN);// 左边框cellStyle.setBorderLeft(BorderStyle.THIN);// 上边框cellStyle.setBorderTop(BorderStyle.THIN);// 右边框cellStyle.setBorderRight(BorderStyle.THIN);return cellStyle;}

把样式定义在外层,然后传进去。明天搞个工具再仔细验证,至少目前上面出现的问题,没有出现
1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/624888.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过Maven导入本地jar包

1.创建lib文件夹&#xff0c;把jar包放到文件夹里面 2.在pom里导入依赖 导入完成

计算机视觉——OpenCV Python基于颜色识别的目标检测

1. 计算机视觉中的颜色空间 颜色空间在计算机视觉领域的应用非常广泛&#xff0c;它们在图像和视频处理、物体检测等任务中扮演着重要角色。颜色空间的主要作用是将颜色以数值形式表示出来&#xff0c;这样计算机算法就能够对其进行处理和分析。不同的颜色空间有着不同的特点和…

ShardingSphere:强大的分布式数据库中间件【图文】

ShardingSphere的诞生 ShardingSphere的结构 Sharding-JDBC :它提供了一个轻量级的 Java 框架&#xff0c;在 Java 的 JDBC 层提供额外的服务。使用客户端直连数据库&#xff0c;以 jar 包形式提供服务&#xff0c;无需额外部署和依赖&#xff0c;可理解为增强版的 JDBC 驱动&…

六、OpenFeign服务接口调用

一、提问 已经有loadbalancer为什么还要学习OpenFeign? 两个都有道理的话&#xff0c;日常用那个&#xff1f; 二、是什么 OpenFeign是什么 官网翻译 Feign是一个声明性web服务客户端。它使编写web服务客户端变得更容易。使用Feign创建一个接口并对其进行注释。它具有可…

LangChain-Chatchat 开源知识库来了

LangChain-Chatchat 开源知识库来了 LangChain-Chatchat 架构设计LangChain-ChatChat 具体实现过程 一键本地离线部署软件环境硬件环境支持三种部署方式 LangChain-Chatchat 是基于 ChatGLM 等大语言模型与 LangChain 等应用框架实现&#xff0c;开源、可离线部署的 RAG 检索增…

Spring Boot JNA 实现调用 DLL文件(清晰明了)

概述 项目需要用到 重采样算法&#xff0c;JAVA 没有现成的&#xff0c;只能通过 JNA 调用 C 的 DLL 实现&#xff0c;JNA中&#xff0c;它提供了一个动态的C语言编写的转发器&#xff0c;可以自动实现Java和C的数据类型映射。不再需要编写C动态链接库。 实现需求 根据 一个…

力扣152. 乘积最大子数组

Problem: 152. 乘积最大子数组 文章目录 题目描述思路复杂度Code 题目描述 思路 1.初始化&#xff1a;首先&#xff0c;我们创建两个数组maxNum和minNum&#xff0c;并将它们初始化为输入数组nums。这两个数组用于存储到当前位置的最大和最小乘积。我们还需要一个变量maxProduc…

【Conda基础命令】使用conda创建、查看、删除虚拟环境及可能的报错处理

文章目录 前言&#xff08;1&#xff09; 在默认路径下创建一个新的虚拟环境&#xff08;2&#xff09; 查看已有的虚拟环境&#xff08;3&#xff09; 删除已有的虚拟环境&#xff08;谨慎操作&#xff09;&#xff08;4&#xff09;激活虚拟环境&#xff08;5&#xff09;退出…

2024 NTFS读写工具Tuxera NTFS for Mac 是如何进行下载、安装、激活的

本篇将为各位小伙伴们集中讲解一下NTFS读写工具Tuxera NTFS for Mac 是如何进行下载、安装、激活与换机的。 在数字化时代&#xff0c;数据交换和共享变得日益重要。然而&#xff0c;对于Mac用户来说&#xff0c;与Windows系统之间的文件交换可能会遇到一些挑战。这是因为Mac …

sqlilabs靶场1—20题学习笔记(思路+解析+方法)

前几个题目较为简单&#xff0c;均尝试使用各种方法进行SQL注入 第一题 联合查询 1&#xff09;思路&#xff1a; 有回显值 1.判断有无注入点 2.猜解列名数量 3.判断回显点 4.利用注入点进行信息收集 爆用户权限&#xff0c;爆库&#xff0c;爆版本号 爆表&#xff0c;爆列&…

使用python采集VIP会电商平台商品数据②单页数据采集

获取标头&#xff1a; 响应&#xff1a;服务器返回的数据 预览&#xff1a;查看响应得数据 载荷&#xff1a;查询参数/请求参数 标头&#xff1a;查看请求的网址/请求的标头/请求方法 数据包地址&#xff1a;https://mapi.vip.com/vips-mobile/rest/shopping/pc/product/mo…

uniapp 组件传值

uniapp 组件传值 父传子子传父 uniapp 组件传值 父传子 在uniapp中&#xff0c;组件传值主要通过props进行。以下是一个简单的例子&#xff1a; 首先&#xff0c;创建一个组件MyComponent.vue&#xff1a; <template><view><text>{{ message }}</tex…