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 workbook
	at 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: NotImplemented
	at 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: null
	at 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Innodb之redo日志

Innodb引擎执行流程 redo log ​ MySQL中的redo log&#xff08;重做日志&#xff09;是实现WAL&#xff08;预写式日志&#xff09;技术的关键组件&#xff0c;用于确保事务的持久性和数据库的crash-safe能力。借用《孔乙己》中酒店掌柜使用粉板记录赊账的故事&#xff0c;…

Flask前端页面文本框展示后端变量,路由函数内外两类

一、外&#xff01;路由函数外的前后端数据传输 Flask后端 ↓ 首先导入包&#xff0c;需要使用 后端&#xff1a;flask_socketio来进行路由外的数据传输&#xff0c; from flask_socketio import SocketIO, emit 前端&#xff1a;还有HTML头文件的设置。 <!DOCTYPE …

【云原生数据库:原理与实践】1- 数据库发展历程

1-数据库发展历程 1.1 数据库发展概述 从1960年&#xff1a;Integrated Database System&#xff08;IDS&#xff09;&#xff0c;该系统是一个网状模型&#xff08;Network Model&#xff09;到 IMS&#xff08;Information Management System&#xff09;&#xff0c;使用了…

Rust腐蚀服务器清档多教程

Rust腐蚀服务器清档多教程 大家好我是艾西&#xff0c;一个做服务器租用的网络架构师。上期教了大家怎么搭建服务器以及安装插件等那么随着大家自己架设服或是玩耍的时间肯定会有小伙伴想要去新增开区数量或是把原本的服务器进行一些调整等&#xff0c;那么今天主要聊的就是怎…

【智能算法】鸭群算法(DSA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2021年&#xff0c;Zhang等人受到自然界鸭群觅食行为启发&#xff0c;提出了鸭群算法&#xff08;Duck Swarm Algorithm, DSA&#xff09;。 2.算法原理 2.1算法思想 DSA基于自然界鸭群觅食过程&…

[leetcode] max-area-of-island

. - 力扣&#xff08;LeetCode&#xff09; 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0&#xff08;代表水&…

基于SpringBoot+Vue的共享汽车管理系统(源码+文档+包运行)

一.系统概述 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了共享汽车管理系统的开发全过程。通过分析共享汽车管理系统管理的不足&#xff0c;创建了一个计算机管理共享汽车管理系统的方案。文章介绍了共享汽车管理…

从 MySQL 到 DynamoDB,Canva 如何应对每天新增的 5000 万素材

作为一款设计工具&#xff0c;Canva 吸引人的一个重要特色就是拥有数以亿计的照片和图形资源&#xff0c;支持用户上传个人素材。 Canva 于 2013 年推出&#xff0c;设立了一个包含大量照片和图形的资源库&#xff0c;并允许用户上传自己的素材以用于设计。从发布之日起&#…

Python数学建模学习-PageRank算法

1-基本概念 PageRank算法是由Google创始人Larry Page在斯坦福大学时提出&#xff0c;又称PR&#xff0c;佩奇排名。主要针对网页进行排名&#xff0c;计算网站的重要性&#xff0c;优化搜索引擎的搜索结果。PR值是表示其重要性的因子。 中心思想&#xff1a; 数量假设&#…

JavaScript基础:js介绍、变量、数据类型以及类型转换

目录 介绍 引入方式 内部方式 外部形式 注释和结束符 单行注释 多行注释 结束符 输入和输出 输出 输入 变量 声明 赋值 关键字 变量名命名规则 常量 数据类型 数值类型 字符串类型 布尔类型 undefined 类型转换 隐式转换 显式转换 Number ✨介绍 &a…

typescript中的type关键字和interface关键字区别

Type又叫类型别名&#xff08;type alias&#xff09;,作用是给一个类型起一个新名字&#xff0c;不仅支持interface定义的对象结构&#xff0c;还支持基本类型、联合类型、交叉类型、元组等任何你需要手写的类型。 type num number; // 基本类型 type stringOrNum string |…

47.HarmonyOS鸿蒙系统 App(ArkUI)创建轮播效果

创建轮播效果&#xff0c;共3页切换 Entry Component struct Index {State message: string Hello Worldprivate swiperController: SwiperController new SwiperController()build() {Swiper(this.swiperController) {Text("第一页").width(90%).height(100%).bac…

BLE架构图

PHY层(Physical layer 物理层) PHY层用来指定BLE所用的无线频段(2.4G)&#xff0c;调制解调方式和方法、跳频等。PHY层的性能直接决定整个BLE芯片的功耗、灵敏度以及selectivity等射频指标。 LL层(Link Layer 链路层) 链路层主要是对RF射频控制。链路层定义了协议栈中最为基础的…

C++解决大学课设所有管理系统(增删查改)

C一篇解决大学课设所有**管理系统(增删查改) 文章目录 C一篇解决大学课设所有**管理系统(增删查改)1.引言1.1 使用结果展示 2. 基本原理3. 文件层次结构4.具体实现(通讯录管理系统为例)4.1 通讯录实体类(addressbook.h)4.2 通讯录实现类(addressbook.cpp)4.3 通讯录管理类&…

蓝桥杯 — — 完全日期

完全日期 友情链接&#xff1a;完全日期 题目&#xff1a; 思路&#xff1a; 直接从20010101枚举到20211231&#xff0c;然后再判断每一个数是否是一个合法的日期&#xff0c;如果这个日期是合法的&#xff0c;接着判断这个日期的每一个位置上的数字之和是否是一个完全平方数…

ChatGPT 可以预测未来吗?

推荐 4月13日的一篇有趣的 paper&#xff0c;特来分享。 &#x1f449; 当前的大型语言模型&#xff08;LLMs&#xff09;具有强大的数据合成和推理能力&#xff0c;但它们在直接预测尚未发生事件的准确性上常常受到限制。传统的预测方法依赖于直接询问模型关于未来的问题。 …

linux下安装nacos2.2.0

1、获取下载地址并下载 1.1、打开nacos官网 1.2、找到对应版本&#xff0c;点进去 ## 1.3、复制地址 1.4下载 # 进入要安装的目录&#xff0c;cd /usr/local/src # 执行wget https://github.com/alibaba/nacos/releases/download/2.2.0/nacos-server-2.2.0.tar.gz2、 安装…

【产品经理修炼之道】- 平台型产品经理与业务型产品经理

从2015年开始&#xff0c;阿里的产品经理招聘分为平台型和业务型&#xff0c;后来很多互金公司逐步学习采纳了这种分工方式&#xff0c;那么什么是平台型产品经理&#xff0c;什么是业务型产品经理呢&#xff1f;先上结论&#xff1a; 平台型产品经理&#xff08;产品设计&…

loD:如何实现代码的“高内聚、低耦合“

设计模式专栏&#xff1a;http://t.csdnimg.cn/3a25S 目录 1.引用 2.何为"高内聚、低耦合" 3.LoD 的定义描述 4.定义解读与代码示例一 5.定义解读与代码示例二 1.引用 本节介绍最后一个设计原则:LoD(Law of Demeter&#xff0c;迪米特法则)。尽LoD不像SOLID、KI…