Почему я получаю пустую строку при чтении непустой ячейки в файле xlsx? - PullRequest
0 голосов
/ 06 июля 2018

У меня проблемы с чтением файла xlsx. По сути, если я читаю это не сверху вниз, я получаю пустую строку из пропущенных строк. Например, если я читаю строку 5, а затем любую строку от 1 до 4, я не получаю ответа, тогда как ячейки не пусты и их можно прочитать, если я это сделаю, прежде чем читать строку 5.

Я использую org.apache.poi.ss.usermodel. * и com.monitorjbl.xlsx.StreamingReader

Кто-нибудь испытывает такие проблемы?

изменить 1: Весь код довольно длинный, но метод, который я создал для чтения данной ячейки:

private static String getCellValue(Sheet sheet, int rowNum, int column) {
    for (Row row : sheet) {
        if (row.getRowNum() != rowNum) {
            continue;
        }
        Cell cell = row.getCell(column);
        return cell.getStringCellValue();
    }
    return "";
}

Я использую цикл foreach, потому что sheet.getRow (rowNum) тоже не работает. Чтобы читать разные ячейки, я вызываю этот метод несколько раз, поэтому тот факт, что я использую цикл foreach, не должен быть причиной проблемы.

Я также пытался использовать импорт XSSF, но затем я могу прочитать некоторые ячейки, но не все, что еще больше смущает меня.

изменить 2: Звонок происходит здесь:

try (Workbook wb = StreamingReader.builder().bufferSize(BUFFER).open(tmp)) {
    Sheet sheet = wb.getSheetAt(SHEET_NUMBER);
    for (FieldEnum field : FieldEnum.getAllMandatory()) {
        fieldMap.put(field, getCellValue(sheet, field.getRow(), field.getColumn()));
    }
}

где tmp - файл xlsx, FieldEnum - перечисление, содержащее информацию о файле xlsx (имя ячейки, номер ячейки, ...) и fieldMap - Карта между FieldEnum и String со значением String для содержимого соответствующей ячейки.

редактировать 3: Я только что понял, что когда я не получаю ответ, потому что возвращение в цикле foreach никогда не достигается. Я пока не знаю, происходит ли это из-за того, что сам цикл не запущен, или если это так, но всегда запускается продолжение. Инициализация rowNum и столбца происходит в FieldEnum, и именно здесь, если я переключаю порядок полей, я могу или не могу прочитать значение ячейки.

редактировать 4: Поэтому я вхожу в цикл foreach, но по какой-то причине я никогда не получаю условие if

1 Ответ

0 голосов
/ 09 июля 2018

Большое спасибо, Аксель Рихтер, я решил вашу проблему благодаря вам!

Вы были правы относительно того, что StreamingReader только передает данные и не сохраняет их впоследствии. Таким образом, чтобы прочитать разные строки, используя Enum для организации данных ячеек, нужно прочитать их по порядку, а для чтения нескольких ячеек в одной строке нужно либо прочитать их все сразу (когда строка создается впервые), либо сохранить строку в статическая переменная, к которой нужно обращаться позже.

По сути, я должен упорядочить мое перечисление по rowNum и убедиться, что разные ячейки в одной и той же строке объявляются одновременно (одна за другой, без какой-либо другой ячейки из других строк между ними). ​​

...