#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. Поэтому мне приходится разбирать это по частям.