Записывать данные Excel напрямую в OutputStream (ограничить потребление памяти) - PullRequest
4 голосов
/ 15 января 2010

Я ищу простое решение для вывода больших файлов Excel. Входные данные поступают из базы данных, и я хотел бы вывести файл Excel непосредственно на диск, чтобы максимально снизить потребление памяти. Я посмотрел на такие вещи, как Apache POI или jxls, но не нашел способа решить мою проблему.

И в качестве дополнительной информации мне нужно генерировать файлы .xls для Excel до 2007 года, а не новый формат .xlsx xml. Я также знаю, что могу создавать файлы CSV, но я бы предпочел создать простой Excel ...

Есть идеи?

Я понимаю, что мой вопрос не так ясен, я действительно хочу написать файл Excel без необходимости хранить все в памяти ...

Ответы [ 3 ]

6 голосов
/ 15 января 2010

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

Я бы порекомендовал использовать для этого CSV, поскольку он может быть более эффективным, чем XML, плюс у вас есть преимущество в том, что любой приличный сервер базы данных имеет возможности экспорта для этого, так что вам не нужно программировать / включает что-нибудь новое в Java. Я не знаю, какую БД вы используете, но если бы это было, например, MySQL, то вы могли бы использовать LOAD DATA INFILE для этого.

2 голосов
/ 15 января 2010

JExcelAPI часто рекомендуется в качестве более эффективной памяти, альтернативной Apache POI.

2 голосов
/ 15 января 2010

Нет идеи для создания реального файла XSL. Но вы можете напрямую написать файл HTML или поток zip, содержащий электронную таблицу OPenDocument (я полагаю, MSExcel может прочитать этот более поздний формат)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...