hutool获取大数据量的excel内容及sheet名称问题

读取大数据量的excel时

代码如下

java 复制代码
private static RowHandler createRowHandler() {
        return new RowHandler() {
            @Override
            public void handle(int i, long l, List<Object> list) {
                System.out.println(i + " " + l + " " + list);
            }
        };
    }
    public static void main(String[] args) {
        File file = FileUtil.file("d:/1.xlsx");
        ExcelUtil.readBySax(file,-1,createRowHandler());

    }

报错

NoSuchMethodError:org.apache.poi.util.XMLHelper.newXMLReader()

解决办法

修改源码

复制代码
ExcelSaxUtil中readFrom方法中的xmlReader = XMLHelper.newXMLReader();

改为

复制代码
xmlReade SAXHelper.newXMLReader();

或者升级poi到5.x

读取sheet名称问题

代码如下

java 复制代码
 public static List<String> getSheetNames() throws IOException {
        OPCPackage open = null;
        try {
            File file = FileUtil.file("d:/1.xlsx");
            open = OPCPackage.open(file, PackageAccess.READ);
            XSSFReader xssfReader = new XSSFReader(open);
            SheetRidReader parse = SheetRidReader.parse(xssfReader);
            List<String> sheetNames = parse.getSheetNames();

            return sheetNames;
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (OpenXML4JException e) {
            throw new RuntimeException(e);
        } finally {
            if (open!= null){
                open.close();
            }
        }
    }

这是运行没问题的

当将open = OPCPackage.open(file, PackageAccess.READ);改为文件流的形式如下

复制代码
open = OPCPackage.open(new FileInputStream(file));

将报错

java 复制代码
Zip bomb detected! The file would exceed the max. ratio of compressed file size to the size of the expanded data.
This may indicate that the file is used to inflate memory usage and thus could pose a security risk.
You can adjust this limit via ZipSecureFile.setMinInflateRatio() if you need to work with files which exceed this limit.
Uncompressed size: 233647, Raw/compressed size: 2324, ratio: 0.009947
Limits: MIN_INFLATE_RATIO: 0.010000, Entry: xl/styles.xml

包括获取文件内容时将

复制代码
ExcelUtil.readBySax(file,-1,createRowHandler());改为流的形式如下
复制代码
ExcelUtil.readBySax(new FileInputStream(file),-1,createRowHandler());
同样会报这个错

这是因为压缩率超过范围了 在执行之前添加代码

复制代码
ZipSecureFile.setMinInflateRatio(-1.0);即可解决

改完后代码如下

java 复制代码
package org.example;

import cn.hutool.core.io.FileUtil;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.sax.SheetRidReader;
import cn.hutool.poi.excel.sax.handler.RowHandler;
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageAccess;
import org.apache.poi.openxml4j.util.ZipSecureFile;
import org.apache.poi.util.XMLHelper;
import org.apache.poi.xssf.eventusermodel.XSSFReader;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;

public class Test5 {

    private static RowHandler createRowHandler() {
        return new RowHandler() {
            @Override
            public void handle(int i, long l, List<Object> list) {
                System.out.println(i + " " + l + " " + list);
            }
        };
    }
    public static void main(String[] args) throws FileNotFoundException {
        ZipSecureFile.setMinInflateRatio(-1.0);
        File file = FileUtil.file("d:/1.xlsx");
        ExcelUtil.readBySax(new FileInputStream(file),-1,createRowHandler());

    }
    public static List<String> getSheetNames() throws IOException {
        OPCPackage open = null;
        try {
            ZipSecureFile.setMinInflateRatio(-1.0);
            File file = FileUtil.file("d:/1.xlsx");
            open = OPCPackage.open(new FileInputStream(file));
            XSSFReader xssfReader = new XSSFReader(open);
            SheetRidReader parse = SheetRidReader.parse(xssfReader);
            List<String> sheetNames = parse.getSheetNames();
            return sheetNames;
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (OpenXML4JException e) {
            throw new RuntimeException(e);
        } finally {
            if (open!= null){
                open.close();
            }
        }
    }

}
相关推荐
2601_9623818620 小时前
Python办公联动:Excel数据一键自动生成PPT图表
python·数据分析·自动化·excel·ppt
tryCbest2 天前
Excel常用公式(WPS vs Office)
excel·wps
taller_20002 天前
【006】何时用 Python?何时用 Excel 公式?一文讲清
python·excel·公式·pie·py
2601_949950632 天前
Word、PDF、Excel题目怎么快速整理?
pdf·word·excel
Eiceblue3 天前
React 项目实战:用 JavaScript 合并多个本地 Excel 文件
前端·javascript·react.js·excel
ms365copilot3 天前
Excel做完≠结束,Copilot一键生成汇报PPT
powerpoint·excel·copilot
城数派4 天前
1901-2025年中国省市县三级逐年平均气温数据集(Shp/Excel 格式)
excel
一晌小贪欢4 天前
Python办公18:PDF 转 Word——利用 OCR 技术批量提取不可编辑的文档内容
开发语言·python·pdf·word·excel·数据可视化·python办公
一晌小贪欢4 天前
Python办公17:暴力拆分——按页数或指定范围提取 PDF 核心页面
java·开发语言·python·pdf·excel·数据可视化·python办公
AI英德西牛仔5 天前
文心 Excel 与“AI 导出鸭”:PC 端批量导出方案的技术解构
人工智能·excel·deepseek·ai导出鸭