Создание книги xssf из загруженного файла .xlsx (файл Excel 2007 г.)

В коде клиент загружает стандартный файл .xlsx через struts.

В действии мы берем файл с помощью

FormFile myfile = ABCForm.getTheFile();

Мой вопрос заключается в том, как мне создать XSSFWorkbook из этого файла.

У меня также есть параллельный процесс для доступа к файлу excel 2003 года таким образом.

FormFile myfile = ABCForm.getTheFile();
byte[] fileData = myFile.getFileData();
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(fileData);

in the Helper class

POIFSFileSystem fs = new POIFSFileSystem(byteArrayInputStream);
HSSFWorkbook wb = new HSSFWorkbook(fs);

а затем дальнейшая обработка книги.

Я хотел бы знать, как создать XSSFWorkbook, поскольку я создал HSSFWorkbook выше.

У меня есть все файлы ooxml и связанные с ними файлы jar в папке classpath и lib.

XSSFWorkbook не может быть создан из byteArrayInputStream. Книга Apache XSSF . Его можно создать только из Inputstream и OPCPackage.

Любые идеи/указатели о том, как идти дальше. Я буду рад предоставить дополнительную информацию о любых других фрагментах кода, которые могут помочь.


person Abhay    schedule 29.03.2012    source источник


Ответы (1)


Вы можете с радостью создать XSSFWorkbook из InputStream

Один из вариантов — использовать WorkbookFactory, который автоматически определяет соответствующий тип и возвращает вам HSSFWorkbook или XSSFWorkbook:

Workbook wb = WorkbookFactory.create(inputStream);

В противном случае вы можете создать XSSFWorkbook из потока следующим образом:

XSSFWorkbook wb = new XSSFWorkbook(OPCPackage.open(inputStream));

Однако имейте в виду, что для открытия XSSFWorkbook из файла требуется меньше памяти, чем из потока — с потоком весь файл необходимо будет буферизовать в памяти.

person Gagravarr    schedule 30.03.2012
comment
Хорошее объяснение. Есть ли способ узнать, с каким файлом вы работаете после создания книги с помощью фабрики книг? Я видел только методы создания в этом классе Factory. - person berto77; 11.10.2012
comment
Просто используйте instanceof, чтобы проверить, является ли это HSSFWorkbook или XSSFWorkbook, если вам действительно нужно знать, что это такое - person Gagravarr; 11.10.2012
comment
Это проблема, потому что App Engine имеет ограниченный объем памяти, и загрузка всего входного потока в память, к сожалению, вызывает у меня проблемы с java.lang.outofmemory. Необходимо найти способ буферизации при чтении из входного потока, поскольку в мире движка приложения нет локальной файловой структуры. - person anon58192932; 28.08.2014
comment
@advocate Вам нужно использовать модель событий / модель пользователя событий, чтобы уменьшить объем памяти, но тогда это должен быть совершенно новый вопрос - person Gagravarr; 28.08.2014
comment
Хорошо, если есть обходной путь, который был бы предпочтительнее, поскольку я написал код и протестировал его только локально перед развертыванием в движке приложения. Я бы предпочел не полностью переписывать мой синтаксический анализатор =\ Я надеялся, что может быть обходной путь преобразования Java из входного потока в какой-то буферизованный или файловый входной поток или, возможно, некоторые вызовы API Apache для буферизации ввода каким-то образом. - person anon58192932; 28.08.2014