繁体   English   中英

如何在Java中读取大.xls文件?

[英]How to read big .xls files in java?

10在Java中读取xls文件。
但是,当我打算读取20 MB以上的大型.xls文件时,这给了我错误。
以下我的代码对于.xls小文件正常运行,但是对于.xls大文件却给出了Java堆错误。 Java代码

public static void main(String[] args) throws IOException {
        ArrayList<ArrayList<String>> Temp = new ArrayList<ArrayList<String>>();
        ArrayList<String> Temp1 = new ArrayList<String>();
        int row = 0;
        String fname = "D:/Vijay/xls/vijay/bookTest.xls";
        try {
            InputStream fis = new FileInputStream(fname);
            HSSFWorkbook workbook = new HSSFWorkbook(fis);
            HSSFSheet sheet = workbook.getSheetAt(0);
            FormulaEvaluator formulaEval = workbook.getCreationHelper().createFormulaEvaluator();
            int rowEnd = sheet.getLastRowNum();
            int rowStart = sheet.getFirstRowNum();
            for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
                Row r = sheet.getRow(rowNum);
                int lastColumn = r.getLastCellNum();

                int cols = 0;
                Temp1 = new ArrayList<String>();
                for (int cn = 0; cn < lastColumn; cn++) {
                    String cellvalue = "";
                    Cell c = r.getCell(cn, Row.RETURN_BLANK_AS_NULL);
                    if (c == null) {
                        cellvalue = "";
                    } else {
                        if (r.getCell(cn).getCellType() == HSSFCell.CELL_TYPE_STRING) {
                            cellvalue = r.getCell(cn).getStringCellValue();
                        } else if (r.getCell(cn).getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
                            if (HSSFDateUtil.isCellDateFormatted(r.getCell(cn))) {
                                DateFormat formatter = new SimpleDateFormat(
                                        "E MMM dd HH:mm:ss Z yyyy");
                                Date date = (Date) formatter.parse(r
                                        .getCell(cn).getDateCellValue()
                                        .toString());
                                Calendar cal = Calendar.getInstance();
                                cal.setTime(date);
                                cellvalue = cal.get(Calendar.DATE) + "/"
                                        + (cal.get(Calendar.MONTH) + 1) + "/"
                                        + cal.get(Calendar.YEAR);
                            } else {
                                r.getCell(cn).setCellType(
                                        r.getCell(cn).CELL_TYPE_STRING);
                                cellvalue = ""
                                        + r.getCell(cn).getStringCellValue();
                            }
                        } else if (r.getCell(cn).getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) {
                            cellvalue = ""
                                    + r.getCell(cn).getBooleanCellValue();
                        } else if (r.getCell(cn).getCellType() == HSSFCell.CELL_TYPE_FORMULA) {
                            cellvalue = ""
                                    + formulaEval.evaluate(r.getCell(cn))
                                            .formatAsString();
                        }

                    }
                    Temp1.add(cols, cellvalue);
                    cols++;
                }
                if (Temp1.size() > 0) {
                    Temp.add(row, Temp1);
                    row++;
                }
            }
             for (ArrayList al : Temp) {
             System.out.println("Contents of temp " + al);
             }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

错误-

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.LinkedHashMap.createEntry(Unknown Source)
    at java.util.LinkedHashMap.addEntry(Unknown Source)
    at java.util.HashMap.put(Unknown Source)
    at sun.util.resources.OpenListResourceBundle.loadLookup(Unknown Source)
    at sun.util.resources.OpenListResourceBundle.loadLookupTablesIfNecessary(Unknown Source)
    at sun.util.resources.OpenListResourceBundle.handleGetObject(Unknown Source)
    at sun.util.resources.TimeZoneNamesBundle.handleGetObject(Unknown Source)
    at java.util.ResourceBundle.getObject(Unknown Source)
    at java.util.ResourceBundle.getObject(Unknown Source)
    at java.util.ResourceBundle.getStringArray(Unknown Source)
    at sun.util.TimeZoneNameUtility.retrieveDisplayNames(Unknown Source)
    at sun.util.TimeZoneNameUtility.retrieveDisplayNames(Unknown Source)
    at java.util.TimeZone.getDisplayNames(Unknown Source)
    at java.util.TimeZone.getDisplayName(Unknown Source)
    at java.util.Date.toString(Unknown Source)
    at com.test.arrayList.ValidateXls.main(ValidateXls.java:69)

请帮助我解决此问题,或建议我另一种方法来读取Java中的.xls大文件。
提前致谢。

我认为您需要尝试的第一件事是增加Java默认堆空间。 例如:-Xms256m -Xmx512m -XX:PermSize = 64M -XX:MaxPermSize = 1000M

您还需要根据poi文档将文件的加载更改为这样(WorkbookFactory.create(new File(“ MyExcel.xls”))),请参见此链接

http://poi.apache.org/spreadsheet/quick-guide.html#FileInputStream

文件与InputStreams

打开工作簿(.xls HSSFWorkbook或.xlsx XSSFWorkbook)时,可以从文件或InputStream加载工作簿。 使用File对象可以减少内存消耗,而InputStream则需要更多内存,因为它必须缓冲整个文件。

如果使用WorkbookFactory,则使用其中一个非常容易:

//使用文件Workbook wb = WorkbookFactory.create(new File(“ MyExcel.xls”));

//使用InputStream,需要更多的内存Workbook wb = WorkbookFactory.create(new FileInputStream(“ MyExcel.xlsx”));;

如果仍然遇到相同的异常,请尝试使用

XSSF和SAX(事件API)

http://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM