这个编码能够读取excel文件的小数据......但是不能读取excel文件中的大数据文件....如何进一步修改代码?
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Iterator;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
*
* @author Administrator
*/
public class ReadExcelNdArray {
public static void main(String[] args) throws Exception {
long start = System.currentTimeMillis();
System.out.println("Time taken: " + (System.currentTimeMillis() - start) + " ms");
File myFile = new File("D://Raghulpr/Transaction Data.xlsx");
FileInputStream fis = new FileInputStream(myFile);
// Finds the workbook instance for XLSX file
XSSFWorkbook myWorkBook = new XSSFWorkbook (fis);
// Return first sheet from the XLSX workbook
XSSFSheet mySheet = myWorkBook.getSheetAt(0);
// Get iterator to all the rows in current sheet
Iterator<Row> rowIterator = mySheet.iterator();
// Traversing over each row of XLSX file
while (rowIterator.hasNext()) {
Row row = rowIterator.next();
// For each row, iterate through each columns
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext()) {
Cell cell = cellIterator.next();
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
System.out.print(cell.getStringCellValue() + "\t");
break;
case Cell.CELL_TYPE_NUMERIC:
System.out.print(cell.getNumericCellValue() + "\t");
break;
case Cell.CELL_TYPE_BOOLEAN:
System.out.print(cell.getBooleanCellValue() + "\t");
break;
default :
}
}
System.out.println("");
}
}
}
线程中的异常&#34; main&#34; java.lang.OutOfMemoryError:Java堆空间
at java.io.ByteArrayOutputStream.<init>(ByteArrayOutputStream.java:77)
at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource$FakeZipEntry.<init>(ZipInputStreamZipEntrySource.java:121)
at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource.<init>(ZipInputStreamZipEntrySource.java:55)
at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:88)
at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:272)
at org.apache.poi.util.PackageHelper.open(PackageHelper.java:37)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:254)
at readexcelndarray.ReadExcelNdArray.main(ReadExcelNdArray.java:36)
答案 0 :(得分:2)
首先,您需要在代码中关闭所有Input - output
流对象,例如FileInputStream
等。其次,您还可以在此链接中提及您的JVM堆空间:Increase heap size in Java
答案 1 :(得分:2)
我不知道你是否仍然需要回答这个问题,但我也在寻找同样的东西并且正在努力阅读一个大文件。在互联网上花了很多时间之后,我找到了一个解决方案。你可以检查一下 Excel streaming reader
import com.monitorjbl.xlsx.StreamingReader;
InputStream is = new FileInputStream(new File("G:\\Book1.xlsx"));
Workbook workbook = StreamingReader.builder()
.rowCacheSize(100)
.bufferSize(4096)
.open(is);
现在,您可以使用工作簿进一步处理文件。
我能够处理超过4个lac记录的xlsx文件。
答案 2 :(得分:0)
你需要增加堆大小以便读取大文件。我建议使用64位机器。
答案 3 :(得分:0)
我们有jxl api用于阅读,编写excel文件。这个api的问题是你可以读取和写入65535行的最大值,而起始行的索引是0.但它真的很灵活。
因为在你的情况下,行数超过65535,我建议你更喜欢Apache POI。实际上,这个api没有限制。
答案 4 :(得分:0)
我遇到了同样的问题,如果你改为更低级别的SAX解析,你将节省大量内存。 http://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api
我认为我减少了大约4.5 GB(!)的内存使用量(大约11 MB文件,包含很多公式),直到更容易管理的东西(不记得确切,但它太低了,不再重要了,在最少减少10倍。)
如果您需要减少内存占用,实施起来比较困难