Как загрузить старый XML-файл Microsoft Office (Excel), используя Java - PullRequest
5 голосов
/ 17 августа 2011

Я не могу загрузить файл Excel в старом формате Office XML (например, версия Office 2002 или 2003) в Java.Я попробовал JXL и POI Apache (версия 3.7).POI не работает, поскольку, похоже, требуется более новый формат Office .xlsx.

Вот пример старого формата Office XML.

Можно создать аналогичный файл XML из MS Excel 2010, сохранив книгу в формате «XML Spreadsheet 2003»?

Существуют ли библиотеки Java с открытым исходным кодом, которые будут загружать формат XMLSS?В противном случае у меня нет выбора, кроме как написать собственный синтаксический анализатор: прочитайте файл XML, а затем интерпретируйте теги ячеек для построения матрицы ячеек.В этом формате XML все строки с пустыми значениями ячеек пропускаются, а следующая ячейка с данными, расположенная с атрибутом индекса, который действует как смещение в столбцах, я предполагаю для экономии места в файле XML.

Ответы [ 6 ]

4 голосов
/ 31 июля 2013

Формат называется SpreadsheetML (не путайте с .xlsx, который также основан на xml), библиотека с именем Xelem может справиться с этим:

import nl.fountain.xelem.excel.Workbook;
import nl.fountain.xelem.lex.ExcelReader;
//...
ExcelReader reader = new ExcelReader();
Workbook xlWorkbook = reader.getWorkbook("c:\\my\\spreadsheet.xml");
System.out.println(xlWorkbook.getSheetNames());
2 голосов
/ 17 августа 2011

Копирование ответа Марка Бердсли из команды POI http://apache -poi.1045710.n5.nabble.com / Как конвертировать xml-to-xls-td2306602.html :

У вас есть файл Office 2003 xml, а не файл OpenXML;это ранняя попытка Microsoft создать формат файла на основе xml для Excel, и в этом смысле это «допустимый» формат файла Office.

К сожалению, POI вообще не может интерпретировать этот файл, и именно поэтому вывидел исключение, когда вы пытались обернуть его в InputStream и передать его конструктору WorkbookFactory (s).Однако у вас есть несколько вариантов:

  • Вы можете использовать Excel и вручную открывать и сохранять каждый файл, который вы хотите преобразовать, как вы уже сделали.
  • Если у вас естьдоступ к Visual Studio и может писать код Visual Basic или C #, тогда вы можете использовать элемент управления, который позволит вам программно управлять Excel.Таким образом, вы можете автоматизировать процесс преобразования файлов, используя сам Excel.Затем, после того как файл был преобразован в двоичный формат или в формат OpenXML, для его обработки можно использовать POI.
  • Если вы работаете на отдельном компьютере, на котором установлена ​​копия Excel, и используете Windowsоперационной системы, то вы можете использовать OLE, чтобы сделать что-то очень похожее из кода Java.Как и выше, POI можно использовать для обработки файла после преобразования.
  • Если у вас есть доступ к OpenOffice, он имеет довольно хороший API, который доступен из кода Java.Вы можете использовать его для преобразования между типами файлов для вас - это просто вопрос поиска правильного фильтра для использования в этом случае.OpenOffice подходит для всех, кроме самых сложных файлов, и вы должны иметь возможность использовать POI для обработки файла после преобразования.Однако, если вы выберете этот маршрут, лучше всего выполнить всю работу, используя UNO api OpenOffice.
  • В зависимости от того, что вы хотите сделать с содержимым файла, вы можете создать свой собственный анализатор, используя базовый Java.код и парсеры SAX или Xerces (рассмотрите возможность использования xmlBeans (http://xmlbeans.apache.org/)). Если вы просто откроете исходный файл XML с помощью простого текстового редактора, вы увидите, что структура не сложна и, если все, что вы хотите получить вэто необработанные данные, которые он содержит, это может быть вашим лучшим вариантом.
1 голос
/ 25 октября 2011

После большой боли я нашел решение этой проблемы. JODConverter использует API-интерфейс OpenOffice.org/LibreOffice и может конвертировать SpreadsheetML во все форматы, которые поддерживает OpenOffice.org.

0 голосов
/ 06 марта 2015

У меня была такая же проблема некоторое время назад, в итоге я написал парсер SAX для чтения файла XML. Я написал в блоге об этом здесь .

Вы можете найти пример проекта для анализа файла в Github .

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

Сегодняшний ответ состоял в том, чтобы попросить поставщика изменить свой формат файла Excel на двоичный файл Excel, а не на старый Office XML. Это позволило мне использовать Apache POI 3.7 для чтения файла без проблем. Я ценю ответы, так как я понятия не имел, что в библиотеках с открытым исходным кодом на основе Java не было прямой поддержки этого старого формата Office XML. Теперь я знаю, что в следующий раз проверю раньше, чтобы увидеть, в каком формате находятся файлы Excel, перед тем как фиксировать временную шкалу.

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

Вы можете получить некоторый результат, используя API OpenOffice.Если не напрямую, вы можете конвертировать в «поддерживаемый» формат.В противном случае схема для Office 2003 «SpreadsheetML» не очень сложна.Я успешно создал сценарий xslt для преобразования результирующего набора (запроса к базе данных) в (простой, но эффективный) документ Excel 2003 (формат XML).Наоборот, не должно быть очень трудно достичь.

Ура, Вим

...