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

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 27 июля 2012

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

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

независимо от того, сколько строк и ячеек было добавлено.ошибка в трекере ошибок Apache: https://issues.apache.org/bugzilla/show_bug.cgi?id=53611

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

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);
}

[Edit # 2]

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

0 голосов
/ 27 сентября 2011

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

0 голосов
/ 26 августа 2011

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

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

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

...