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.