如何使用java

时间:2015-11-24 07:27:25

标签: java excel

这个编码能够读取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)

5 个答案:

答案 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倍。)

如果您需要减少内存占用,实施起来比较困难