2

作为正式用户,我是新手,我总是在这里找到答案,但现在我必须问。

我正在使用最新的 apache-poi 3.8 版本(从 2012 年 3 月 26 日开始),我必须操作一个包含多个工作表的单个文件,其中只有一个包含大量数据(超过 1000 列和 10 000 行)。

我只需要在大表上有更多的列。因此,使用现有的工具,我应该使用 SAX 来读取它并使用 SXSSF 来重写它。

Excel 文件已经在每张工作表中使用不同的样式和图像进行了预格式化,因此能够在没有大工作表的情况下制作文件副本将很有帮助。

我的问题是:如何在不解析的情况下使用 SAX(从 中的输入流)制作工作表副本?我试图在这里做类似的事情,但该字段sheetsXSSFWorkbook可见性设置为私有。

SXSSFWriter.SheetIterator如果它在 POI 开发人员的未来计划中,那么很棒的事情就是有类似的东西。

谢谢阅读,

亚瑟

**更新* *

该文件太大,无法将其作为常见的 XSSFWorkbook (OutOfMemoryException) 打开。是否可以从 InputStream 创建和 XSSFSheet?如下所示:

  XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) xssfReader
            .getSheetsData();
    int index = 0;
    while (iter.hasNext()) {
        InputStream stream = iter.next();
        String sheetName = iter.getSheetName();
        if (!sheetName.equalsIgnoreCase("BigSheetThatIDontWant")) {
            Sheet newSheet = new XSSFSheet(stream);
            stream.close();
        }
        ++index;
    }

非常感谢你的回答。

4

2 回答 2

4

您将不得不阅读该文件。

关于第二个问题,请参阅 public java.util.Iterator<XSSFSheet> XSSFWorkbook.iterator()

Allows foreach loops:

 XSSFWorkbook wb = new XSSFWorkbook(package);
 for(XSSFSheet sheet : wb){

 }
于 2012-06-21T15:05:05.303 回答
2

在我使用 POI 和复制操作的整个经验中,我意识到,只要性能不重要,为了复制一张或多张工作表,加载整个工作簿、删除不必要的工作表然后将结果保存在另一个文件。

Andy 为迭代器 +1。

于 2012-06-21T15:16:39.897 回答