POI Создает файлы XLSX не полностью или неправильно (тег измерения в XLSX XML читает только A1 после создания вместо A1:500Z)

Я записываю файлы XLSX через библиотеку Apache POI..(Я пробовал использовать POI 3.8 beta1 to beta 4). Когда я пытаюсь открыть файлы XLSX через Excel 2007, выдает ошибку, что на листе есть нечитаемый контент, а затем Excel спрашивает меня, стоит ли его восстанавливать.

Моя проблема в том, что моя программа генерирует файл XLSX, а другая программа читает его через API событий POI. Когда я читаю измерение XML через API событий, я обнаруживаю, что вместо A1:500Z(предположим, что в Excel есть 500 строк и 26 столбцов), он читает только A1. Я видел, что размеры листа равны А1 только тогда, когда лист пуст, но в моем случае на листе 500 строк данных. Таким образом, существует проблема в коде написания XLSX, который приводит к неправильной настройке измерения. (и я думаю, что это должно быть причиной того, что Excel выдает ошибку нечитаемого содержимого).

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

Код создания файла XLSX довольно прост, поэтому я сомневаюсь, что там должно быть что-то не так (и это ошибочное поведение возникает только в тех случаях, когда записываемый лист содержит данные, превышающие 100 строк).

Кто-нибудь сталкивался с такой проблемой? Или что-то не так по сути с библиотеками POI (в их списках рассылки есть ошибка нечитаемого содержания)?

3 ответа

Имея ту же проблему здесь. Если вы разархивируете xlsx и загляните в файл 'xl/worksheets/sheet1.xml', вы всегда будете читать

<worksheet>
 <dimension ref="A1"/>
 <sheetViews>
  <sheetView ...

независимо от того, сколько строк и ячеек было добавлено.

Я отправил сообщение об ошибке на систему отслеживания ошибок Apache: https://issues.apache.org/bugzilla/show_bug.cgi?id=53611

[Редактировать]
На багтрекере Райан https://issues.apache.org/bugzilla/show_bug.cgi?id=53611 опубликовал обходное решение.

CTWorksheet ctSheet = wb.getXSSFWorkbook().getSheetAt(0).getCTWorksheet();
ctSheet.getDimension().setRef("A1:D47");

Таким образом, вы должны следить за созданными вами столбцами и строками и самостоятельно устанавливать тег измерения для каждого листа.

Вот мой полученный код:

private void updateDimensionRef(Sheet sheet, int columnIndex, int rowNumber) {
    ((XSSFSheet) sheet).getCTWorksheet().getDimension()
        .setRef("A1:" + CellReference.convertNumToColString(columnIndex) + rowNumber);
}

[Правка № 2]

Это было исправлено в версии 3.16-бета1. См. Журнал изменений (ошибка № 53611).

Мне не известны какие-либо открытые ошибки в POI, связанные с неверными записями измерений. Если вам удастся создать небольшой тестовый сценарий, который генерирует простой файл xlsx с использованием XSSF с этой проблемой, я настоятельно рекомендую вам открыть новую ошибку в POI Bugzilla, чтобы ее можно было отслеживать и исправлять.

Наиболее распространенные причины нечитаемого содержимого в списке рассылки - это либо люди, использующие старые версии библиотеки (там, где была ошибка, которая теперь исправлена), либо люди, пытающиеся создать свои собственные файлы xlsx в основном вручную (используя подход стиля BigGridDemo). Последнее обычно решается переключением на новый способ потоковой записи SXSSF.

(Excel обычно выдает вам xml-файл с подробной информацией об ошибке, когда он исправляет проблемный файл, не зная, что он сказал, трудно точно знать, в чем дело)

У меня та же проблема. Странно то, что Open Office открывает эти файлы без ошибок (но по какой-то странной причине теряет группировку). Я отключил группировку в коде, и все работает нормально. Похоже, что это ошибка группирования строк POI в Apache.

Другие вопросы по тегам