[alibaba/easyexcel]使用easyexcel读取easyexcel生成的excel文件,无法获取总行数

2024-05-17 839 views
9

触发场景描述 直接生成的excel无法获取exce总行数,需要手动编辑一次excel保存后才可获取到. 版本:2.2.3 触发Bug的代码

    convert("C:\\Users\\a\\Desktop\\test.csv",
                "C:\\Users\\a\\Desktop\\test.xlsx");

        ExcelReader excelReader = EasyExcel.read(new File("C:\\Users\\a\\Desktop\\test.xlsx"), HospitalVisitInfoIMO.class, new AnalysisEventListener() {
            @Override
            public void invoke(Object o, AnalysisContext analysisContext) {
                log.info("读取excel总条数:"+analysisContext.getTotalCount());
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {

            }
        }).build();
        ReadSheet readSheet = EasyExcel.readSheet(0).headRowNumber(1).build();
        excelReader.read(readSheet);
        excelReader.finish();

提示的异常或者没有达到的效果 预期输出:读取excel总条数:14 实际输出:读取excel总条数:1

MS- 2020-09-17 17:29:57 [main] INFO c.s.r.m.b.data.utils.CvsToExcelUtil - 读取并转换数据:14条 MS- 2020-09-17 17:29:57 [main] INFO c.s.r.m.b.data.utils.CvsToExcelUtil - 转换总耗时1秒 MS- 2020-09-17 17:29:57 [main] INFO c.s.r.m.b.data.utils.CvsToExcelUtil - 读取excel总条数:1 -MS- 2020-09-17 17:29:57 [main] INFO c.s.r.m.b.data.utils.CvsToExcelUtil - 读取excel总条数:1 -MS- 2020-09-17 17:29:57 [main] INFO c.s.r.m.b.data.utils.CvsToExcelUtil - 读取excel总条数:1 -MS- 2020-09-17 17:29:57 [main] INFO c.s.r.m.b.data.utils.CvsToExcelUtil - 读取excel总条数:1 -MS- 2020-09-17 17:29:57 [main] INFO c.s.r.m.b.data.utils.CvsToExcelUtil - 读取excel总条数:1 -MS- 2020-09-17 17:29:57 [main] INFO c.s.r.m.b.data.utils.CvsToExcelUtil - 读取excel总条数:1 -MS- 2020-09-17 17:29:57 [main] INFO c.s.r.m.b.data.utils.CvsToExcelUtil - 读取excel总条数:1 -MS- 2020-09-17 17:29:57 [main] INFO c.s.r.m.b.data.utils.CvsToExcelUtil - 读取excel总条数:1 -MS- 2020-09-17 17:29:57 [main] INFO c.s.r.m.b.data.utils.CvsToExcelUtil - 读取excel总条数:1 -MS- 2020-09-17 17:29:57 [main] INFO c.s.r.m.b.data.utils.CvsToExcelUtil - 读取excel总条数:1 -MS- 2020-09-17 17:29:57 [main] INFO c.s.r.m.b.data.utils.CvsToExcelUtil - 读取excel总条数:1 -MS- 2020-09-17 17:29:57 [main] INFO c.s.r.m.b.data.utils.CvsToExcelUtil - 读取excel总条数:1 -MS- 2020-09-17 17:29:57 [main] INFO c.s.r.m.b.data.utils.CvsToExcelUtil - 读取excel总条数:1

回答

7

这个可以参考https://github.com/alibaba/easyexcel/issues/1282

3

这个可以参考#1282

先谢谢 晚点试试

2

通过上述方案规避了此问题,不过需要通过反射获取XSSFSheet设置才行,代码如下: 没想到github的评论排版这么难用 WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").registerWriteHandler(new AbstractWorkbookWriteHandler() { @Override public void afterWorkbookDispose(WriteWorkbookHolder writeWorkbookHolder) { super.afterWorkbookDispose(writeWorkbookHolder); Sheet sheet = writeWorkbookHolder.getWorkbook().getSheetAt(0); if(sheet instanceof SXSSFSheet){ SXSSFSheet sh = ((SXSSFSheet) sheet); XSSFSheet _sh = (XSSFSheet) ReflectUtil.getFieldValue(sh,"_sh"); _sh.getCTWorksheet().getDimension().setRef("A1:" + CellReference.convertNumToColString(atomicMaxColSize.get()) + atomicRowSize.get()); } } }).build();

2

@zhuangjiaju 尊敬的开发您好!我有兴趣在接下来的几个月内修复这个bug,请问可以将这个任务分配给我吗?

4

@cdoer 您好,我在尝试着用您给出的方案修改源码,但是对于您给出的代码中ReflectUtil和atomicMaxColSize.get()) 和 atomicRowSize.get()这几个类有些疑惑,这几个类是您自己定义的吗?

4

@cdoer 看了您的博客,ReflectUtil()应该是hutool里的工具,后面的两个atomicMaxColSize.get()) 和 atomicRowSize.get()指的是通过一定方式读取到的excel表的行数和列数?

7

@cdoer 看了您的博客,ReflectUtil()应该是hutool里的工具,后面的两个atomicMaxColSize.get()) 和 atomicRowSize.get()指的是通过一定方式读取到的excel表的行数和列数?

是的,也就是你导出excel的时候你得知道有多少行、多少列数据 把行列这个信息写入到excel文件,SXSSFSheet导出的excel才有这个问题。

7

已经在3.0.0-beta1 版本修复,beta版本会在一个月内升级成正式版。