Avi*_*ash 11 java out-of-memory xlsx
我使用XSSF的apache-POI读取XLSX文件.我收到了一个错误java.lang.OutOfMemoryError: Java heap space.后来,使用-Xmx1024mjava类增加了堆大小仍然重复相同的错误.
码:
String filename = "D:\\filename.xlsx";
FileInputStream fis = null;
try {
fis = new FileInputStream(filename);
XSSFWorkbook workbook = new XSSFWorkbook(fis);
Run Code Online (Sandbox Code Playgroud)
在上面的代码段中,执行停止XSSFWorkbook并抛出指定的错误.有人可以建议更好的方法来读取大型XLSX文件.
wax*_*ing 15
POI允许您以流方式读取Excel文件.API几乎是SAX的包装器.确保使用带有String的构造函数以正确的方式打开OPC包.否则你可能会立即耗尽内存.
OPCPackage pkg = OPCPackage.open(file.getPath());
XSSFReader reader = new XSSFReader(pkg);
Run Code Online (Sandbox Code Playgroud)
现在,读者将允许您获取InputStreams不同的部分.如果您想自己进行XML解析(使用SAX或StAX),可以使用它们.但它需要非常熟悉格式.
更简单的选择是使用XSSFSheetXMLHandler.这是一个读取第一张表的示例:
StylesTable styles = reader.getStylesTable();
ReadOnlySharedStringsTable sharedStrings = new ReadOnlySharedStringsTable(pkg);
ContentHandler handler = new XSSFSheetXMLHandler(styles, sharedStrings, mySheetContentsHandler, true);
XMLReader parser = XMLReaderFactory.createXMLReader();
parser.setContentHandler(handler);
parser.parse(new InputSource(reader.getSheetsData().next()));
Run Code Online (Sandbox Code Playgroud)
其中mySheetsContentHandler应该是您自己的XSSFSheetXMLHandler.SheetContentsHandler实现.这个类将被输入行和单元格.
但请注意,如果您的共享字符串表很大(如果您的巨大工作表中没有任何重复的字符串,则会发生这种情况,这可能会适度占用内存).如果内存仍然存在问题,我建议使用原始XML流(也由XSSFReader提供).
| 归档时间: |
|
| 查看次数: |
13377 次 |
| 最近记录: |