Groovy / POI在不同系统上返回不同的迭代器

时间:2011-05-10 22:30:16

标签: java groovy iterator apache-poi

我有以下代码。其目的是使用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

有关此差异的任何想法?

2 个答案:

答案 0 :(得分:2)

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

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

使用XSSF,你得到的迭代器取自TreeMap(它是值迭代器),所以我不希望有一个HashMap迭代器,但我希望有一个java.util一个

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

请参阅POI FAQ了解如何检查您用于POI的jar文件

答案 1 :(得分:2)

我同意@Gagravarr ......你在某个地方有不同版本的东西

而且,你的代码的更“'groovy'版本将是:

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