Groovy / POI возвращает разные итераторы в разных системах

#java #groovy #iterator #apache-poi

#java #groovy #итератор #apache-poi

Вопрос:

У меня есть следующий код. Его цель — запустить xls-файл с использованием POI и записать все данные в текстовый файл.

 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

Есть идеи по поводу этих несоответствий?

Ответ №1:

Вы уверены, что используете одну и ту же версию POI в обеих системах? И используете ли вы HSSF в обеих системах?

Последние версии HSSF всегда должны возвращать org.apache.poi.hssf.usermodel.HSSFRow$CellIterator для вас.

С помощью XSSF возвращаемый вами итератор берется из TreeMap (это итератор значений), поэтому я бы не ожидал итератора HashMap, но я бы ожидал итератор java.util

Это заставляет меня думать, что вы, возможно, не используете одну и ту же версию POI в обоих местах

Смотрите Часто задаваемые вопросы по POI о том, как проверить, какой jar-файл вы используете для POI

Комментарии:

1. Какое простое решение. Спасибо.

Ответ №2:

Я согласен с @Gagravarr…у вас где-то есть другая версия чего-то

И, к вашему сведению, более «заводная» версия вашего кода была бы:

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

Комментарии:

1. Отличная доработка. Я работал с некоторыми ветеранами Java, которые немного осторожно относятся к синтаксису Groovy. Поэтому мне приходится разбирать это по частям.