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();
            }
        }
    }

}
相关推荐
总裁余(余登武)3 小时前
【python项目】:1操作EXCEl自动化开发
python·自动化·excel
ailitsoft2 天前
库存管理系统如何记录跨门店调拨后的收货差异?
excel·零售·软件需求
百事牛科技4 天前
Excel的三种密码:防看、防存、防乱改,各管各的
windows·excel
用户298698530144 天前
React 前端将 Excel 工作表导出为图片的技术实践
javascript·react.js·excel
用户0332126663675 天前
使用 Python 在 Excel 文档中添加水印
python·excel
科技新资讯7 天前
AI如何批量处理Excel文件? 从数据合并、清洗到自动生成报表,看看 AI Agent 怎么完成任务
大数据·人工智能·excel
用户0332126663677 天前
使用 Python 在 Excel 中添加与删除筛选器
python·excel
xurime7 天前
Excelize 开源基础库发布 2.11.1 版本更新
数据分析·excel·开源软件·excelize·gitcode
梦想出海-Phoebe7 天前
Gemini新增文件编辑功能:PDF、Word、Excel处理体验分享
pdf·word·excel
Data-Miner8 天前
AI和Excel怎么结合才能真提效
人工智能·excel