【问题标题】:Suggestion on API / Framework to Process large XLS files using Java [closed]关于使用 Java 处理大型 XLS 文件的 API / 框架的建议 [关闭]
【发布时间】:2013-01-15 08:47:58
【问题描述】:

我需要技术选择来使用 Java 处理更大的 XLS 文件

  1. 需要处理xmls文件而不出现内存不足异常

  2. 需要在内存(工作内存)使用上进行优化

请推荐

【问题讨论】:

    标签: java open-source xls


    【解决方案1】:

    Apache POI 框架是最佳选择 - link

    event-based-api 有助于实现最佳内存优化

    如果如here所示正确实施,它可以处理更大的excel表

    读取大文件示例:

        public void parseExcel(File file) throws IOException {
    
                OPCPackage container;
                try {
                    container = OPCPackage.open(file.getAbsolutePath());
                    ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(container);
                    XSSFReader xssfReader = new XSSFReader(container);
                    StylesTable styles = xssfReader.getStylesTable();
                    XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) xssfReader.getSheetsData();
                    while (iter.hasNext()) {
                        InputStream stream = iter.next();
    
                        processSheet(styles, strings, stream);
                        stream.close();
                    }
                } catch (InvalidFormatException e) {
                    e.printStackTrace();
                } catch (SAXException e) {
                    e.printStackTrace();
                } catch (OpenXML4JException e) {
                    e.printStackTrace();
                }
    
        }
    
        protected void processSheet(StylesTable styles, ReadOnlySharedStringsTable strings, InputStream sheetInputStream) throws IOException, SAXException {
    
                InputSource sheetSource = new InputSource(sheetInputStream);
                SAXParserFactory saxFactory = SAXParserFactory.newInstance();
                try {
                    SAXParser saxParser = saxFactory.newSAXParser();
                    XMLReader sheetParser = saxParser.getXMLReader();
                    ContentHandler handler = new XSSFSheetXMLHandler(styles, strings, new SheetContentsHandler() {
    
                    @Override
                        public void startRow(int rowNum) {
                        }
                        @Override
                        public void endRow() {
                        }
                        @Override
                        public void cell(String cellReference, String formattedValue) {
                        }
                        @Override
                        public void headerFooter(String text, boolean isHeader, String tagName) {
    
                        }
    
                    }, 
                    false//means result instead of formula
                    );
                    sheetParser.setContentHandler(handler);
                    sheetParser.parse(sheetSource);
                } catch (ParserConfigurationException e) {
                    throw new RuntimeException("SAX parser appears to be broken - " + e.getMessage());
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 2011-06-11
      • 1970-01-01
      • 2013-10-27
      • 2021-02-27
      • 1970-01-01
      • 2010-10-31
      • 2011-07-18
      • 1970-01-01
      • 2017-03-22
      相关资源
      最近更新 更多