Преобразование отдельных листов POI SS в байты [] - Java - PullRequest
0 голосов
/ 29 июня 2011

Я разрабатываю внутреннюю систему, которая должна работать так же, как Google Docs. Основная часть, которую я реализую, имитирует их реализацию веб-таблиц. По нескольким причинам я не могу использовать Google Docs или ZK, которые имеют очень надежный API Spreadsheet. Я выбрал POI 3.7 в качестве отправной точки для обработки электронных таблиц Excel.

В настоящее время, когда пользователь загружает электронную таблицу Excel, я беру файл байта [] и сохраняю его в нашей базе данных в виде большого двоичного объекта. Когда пользователь хочет просмотреть электронную таблицу, я извлекаю байт [], собираю книгу и отправляю ее в пользовательский интерфейс клиента для редактирования. Толчок к интерфейсу не моя забота. Когда пользователь вносит изменения в электронную таблицу, я отправляю изменения на сервер, сохраняю их в стеке и применяю обновления только тогда, когда пользователь нажимает кнопку «Сохранить». При сохранении я вытаскиваю книгу из базы данных, вносю изменения и возвращаю книгу обратно в базу данных. Таким образом, я не храню это в памяти. Неудивительно, что все это происходит довольно быстро, за исключением случаев, когда несколько пользователей начинают это делать, очевидно, что взрывающиеся рабочие книги пожирают память, как описано в других постах здесь.

Пользователь будет обновлять только одну вкладку за раз, зачем мне открывать всю книгу целиком? Когда пользователь изначально загружает электронную таблицу Excel, могу ли я вытащить каждый лист, преобразовать каждый в байт [] и сохранить каждый как отдельную запись в БД «рабочего листа»? В POI Sheet есть защищенный метод "#write (Stream)", но я бы не хотел заниматься повторной компиляцией POI. Я также не хотел бы взрывать каждую клетку как новую запись в БД. Вы, ребята, сделали бы это по-другому в первую очередь?

Бэкэнд - это Java / Spring / JDBC. По внутренним причинам это технологии, которые я использую.

Ответы [ 3 ]

2 голосов
/ 29 июня 2011

Хранение больших двоичных двоичных объектов в базе данных само по себе не очень хорошая вещь, если важна производительность.Вам было бы гораздо лучше хранить книги на диске.

Я могу дать вам только половину ответа на ваш вопрос, то есть вы можете читать файлы xslx (не xsl) по одному листу за раз, используя (http://poi.apache.org/apidocs/index.html?org/apache/poi/xssf/eventusermodel/XSSFReader.html) и что вы можете использовать SAXParser, чтобы избежать хранения каждого полного листа в памяти. Я не думаю, что есть какой-либо способ сохранить его без создания объекта листа.


ПредупреждениеВзлом : Одним из быстрых способов взлома может быть использование отражения для вызова защищенного метода. Конечно, нет гарантии, что это будет работать в будущих версиях POI.

1 голос
/ 29 июня 2011

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

Возможно, вы захотитевзглянуть на то, как SharePoint выполняет совместное редактирование, что позволяет нескольким людям, использующим Excel, работать над одним файлом, так же, как документы в Google.Все документы протокола SharePoint являются общедоступными, и совсем недавно в документах было событие, по которому видео и презентации должны скоро появиться в сети, следите за блогом о взаимодействии в офисе , когда они это сделают.В документации по SharePoint вы должны найти подробную информацию о том, как Microsoft объединяет файл Excel для совместного редактирования, и есть что сказать, что вы делаете то же самое!

0 голосов
/ 29 июня 2011

Я хотел бы рассмотреть вопрос о сохранении листов в виде отдельных XML-файлов в базе данных. Если вы храните дополнительные (мета) данные о листах, принадлежащих друг другу, в базе данных, их объединение не составит большого труда. Причиной использования XML является то, что из Excel 2003 электронные таблицы могут быть сохранены в формате xml и поэтому могут быть легко созданы с помощью кода.

Если в какой-то момент вам кажется, что вы используете слишком много стен с помощью Apache POI, вы также можете заглянуть в API OpenOffice.

...