欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 产业 > hutool获取大数据量的excel内容及sheet名称问题

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

2024/11/30 5:36:48 来源:https://blog.csdn.net/qi923701/article/details/140872332  浏览:    关键词:hutool获取大数据量的excel内容及sheet名称问题

读取大数据量的excel时

代码如下

private static RowHandler createRowHandler() {return new RowHandler() {@Overridepublic 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名称问题

代码如下

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

将报错

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);即可解决

改完后代码如下

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com