Apache POI создает поврежденный файл excel xlsx из-за автономного режима или xmlns?

У меня есть веб-приложение (tomcat 8.5.4, java 1.7.0_72), которое ранее создавало действительные файлы xlsx excel с использованием Apache POI. Я работаю над преобразованием приложения для управления зависимостями jar с помощью maven, и теперь создаваемый файл считается поврежденным (или иным образом недействительным) в excel. Я вообще не изменил код, который генерирует файл, и включенные банки в основном такие же, за исключением некоторых изменений версии и удаления некоторых неиспользуемых банок, которых нет в дереве зависимостей maven (удаленные банки перечислены ниже).

Кто-нибудь знает, что я могу сделать, чтобы заставить POI генерировать файлы по-другому или почему excel считает, что эти изменения делают его недействительным? Я много искал ошибки с POI и поврежденными файлами Excel, и похоже, что в POI было несколько ошибок, которые могли повредить существующие файлы или прервать создание больших файлов, но ничего похожего на то, что это применимо в этом случае. Я видел здесь несколько вопросов, которые выглядели так, как будто они могут быть похожими, но в итоге не были применены.

Отличия

Когда я меняю файлы xlsx, созданные до и после, на zip-файлы и извлекаю их, а затем сравниваю каталоги с Windiff, различия заключаются в следующем (работает -> поврежден).

[content_types].xml

 <?xml version="1.0" encoding="UTF-8" standalone="no"?> -> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"> -> <Types>

_rels.rels, _rels\workbook.xml.rels

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 -> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> -> <Relationships>

docprops\core.xml

Время создания отличается

<?xml version="1.0" encoding="UTF-8" standalone="no"?> -> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>

xl\styles.xml

numFmtId на 1 меньше

xl\worksheets\sheet1.xml, docprops\app.xml, xl\sharedstrings.xml, xl\workbook.xml

Идентичный

Банки

Моя компания использует локальный артефактный репозиторий вместо того, чтобы указывать на официальный репозиторий maven, поэтому было очень весело загружать все зависимости. Я предполагаю, что это вызвано тем, что у меня отсутствует jar или я использую неправильную версию, но На самом деле я не генерирую никаких ошибок, просто получаю плохой файл.

Я включаю poi-3.1.11.jar, poi-ooxml-3.11.jar и poi-ooxml-schemas-3.11.jar. Раньше у нас был commons-codec 1.9 в tomcat/lib и commons-codec 1.3 в WEB-INF/lib. Под maven я включил 1.9, хотя я также пытался вернуться к 1.3, и файл все еще был поврежден.

Я попытался обновить все версии poi до 3.1.14, но это не решило проблему. Я попытался вернуться к точным банкам poi[-ooxml-schemas]-3.11-20141221, которые работали раньше, но это не решило проблему. Я попытался переключить SXSSFWorkbook на обычную XSSFWorkbook, но это не помогло.

Вот список банок, которые я удалил при преобразовании в maven, повлияет ли какое-либо из них на apache poi?

ecj-4.5.1
el-impl-2.2
itext-2.0.8
jimi-1.0
js
opencsv-1.8
standard (1.1.2)

person Tim    schedule 02.09.2016    source источник
comment
Какая версия Apache XMLBeans используется? См. poi.apache.org/overview.html#components. рекомендуется использовать XMLBeans 2.6.0 с Apache POI, и именно эта версия сейчас поставляется в двоичных пакетах выпуска.   -  person Axel Richter    schedule 04.09.2016
comment
@AxelRichter Мы включаем xmlbeans 2.6.0   -  person Tim    schedule 06.09.2016


Ответы (2)


Оказалось, что это вызвано банкой (xalan-2.4.1), которая была включена как зависимость от fop-0.20.05, которая не была включена до преобразования в maven. Как только я исключил эту зависимость, он снова создает действительные файлы. Я должен был с подозрением относиться ко всем этим действительно старым банкам 2002 и 2003 годов.

На случай, если у кого-то возникнет аналогичная проблема в будущем, но не из-за тех же банок, вот мои методы устранения неполадок:

Я включил ведение журнала POI с помощью

-Dorg.apache.poi.util.POILogger=org.apache.poi.util.SystemOutLogger
-Dpoi.log.level=1

Я обнаружил несколько ошибок, жалующихся на устаревший синтаксический анализатор XML и невозможность настроить SAX Security Manager. Некоторые поиски в Интернете привели меня к исключению xercesImpl (которое наше приложение ранее не включало) из fop-0.20.5. Его исключение исправило ошибки в регистраторе, но создаваемый файл по-прежнему считался поврежденным Excel и имел те же различия.

Наконец, я сломался и только что создал новое простое Java-приложение maven, которое только что создало очень простой файл excel с POI. Сначала я попробовал его только с poi и poi-ooxml в качестве зависимостей, и он сгенерировал действительный файл. Когда я добавил все зависимости из моего полного приложения, он сгенерировал недопустимый файл. Затем я удалял одну зависимость за раз, пока она не сработала. Проблемной зависимостью был fop, который мне все еще был нужен, поэтому я попытался исключить каждую из его зависимостей, которые наше приложение ранее не включало, пока файл не заработал и не идентифицировал xalan как проблему.

person Tim    schedule 08.09.2016

У меня была точно такая же проблема, я прошел те же шаги. Для меня удаление зависимости xalan, которая была унаследована в моем проекте другой зависимостью путем ее исключения, не помогло. Я добавил последнюю версию xalan (xalan 2.7.1), и это спасло меня.

person sticky_elbows    schedule 09.10.2018