【问题标题】:Groovy/POI Returning Different Iterators on Different SystemsGroovy/POI 在不同系统上返回不同的迭代器
【发布时间】:2011-05-10 22:30:15
【问题描述】:

我有以下代码。其目的是使用 POI 运行一个 xls 文件,并将所有数据写入一个 txt 文件。

for ( sheetNumber in 0..numberOfSheets-1) {
    HSSFSheet sheet = workBook.getSheetAt(sheetNumber)
    Iterator<HSSFRow> rows = sheet.rowIterator()
    while(rows.hasNext()){
        row = rows.next()
        Iterator<HSSFCell> cells = row.cellIterator();
        println "cell:" + cells.toString()
        while(cells.hasNext()){
            cell = cells.next()
            allEntityFile << cell.toString()
        } 
    allEntityFile << "\n" 
    }
}

在我的机器上这段代码运行良好,但在另一台电脑上似乎有问题。我把它缩小到这个。当我尝试创建单元格迭代器时

Iterator<HSSFCell> cells = row.cellIterator();

我的系统返回

org.apache.poi.hssf.usermodel.HSSFRow$CellIterator@156b386

这是我所期望的。在另一个系统上,它返回以下内容

java.util.HashMap$ValueIterator@38fff7

对这种差异有什么想法吗?

【问题讨论】:

    标签: java groovy iterator apache-poi


    【解决方案1】:

    您确定在两个系统上运行相同版本的 POI 吗?您是否在两者上都使用 HSSF?

    最新版本的 HSSF 应始终向您返回 org.apache.poi.hssf.usermodel.HSSFRow$CellIterator

    使用 XSSF,您返回的迭代器取自 TreeMap(它是值迭代器),所以我不期望 HashMap 迭代器,但我期望 java.util 迭代器

    这让我觉得你可能没有在两个地方使用相同版本的 POI

    请参阅POI FAQ,了解如何检查您正在为 POI 使用的 jar 文件

    【讨论】:

    • 多么简单的解决方案。谢谢。
    【解决方案2】:

    我同意@Gagravarr...你在某处有不同的版本

    仅供参考,您的代码更“时髦”的版本是:

    (0..<numberOfSheets).each { sheetNumber ->
      HSSFSheet sheet = workBook.getSheetAt( sheetNumber )
      sheet.rowIterator().each { row ->
        row.cellIterator().each { cell ->
          allEntityFile << cell.toString()
        } 
        allEntityFile << "\n" 
      }
    }
    

    【讨论】:

    • 伟大的groovification。我一直在与一些对 Groovy 语法持谨慎态度的 Java 资深人士一起工作。所以我必须一块一块地偷偷摸摸。
    猜你喜欢
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多