Как экспортировать / генерировать два файла одновременно? - PullRequest
3 голосов
/ 24 июля 2010

У меня есть требование генерировать два файла Excel одновременно.Мы используем Apache POI для создания файлов Excel и структуры Struts.

Внутри класса действий выполняются следующие шаги:

OutputStream outputStream = response.getOutputStream();

, а затем заполняются данные из базы данных и создается один файл с использованием POIи вызвал,

response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition",
                 "attachment; filename=ExportFile1.xls");
workbook.write(outputStream);
outputStream.flush();

и выполнил те же шаги (заполнить данные из БД, записать содержимое Excel) для второго файла как,

response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition",
                 "attachment; filename=ExportFile2.xls");
workbook.write(outputStream);
outputStream.flush();

Но генерируется только один файл.

Возможно ли в java генерировать два файла одновременно?Кто-нибудь реализовал это?

Примечание. Просьба: создание двух листов в одном файле Excel не требуется.

Ответы [ 4 ]

5 голосов
/ 24 июля 2010

У меня есть требование генерировать два файла Excel одновременно.

У меня были похожие требования, но это было не для того, чтобы «генерировать одним щелчком», потому что если пользователю будут представлены диалоги «сохранить как» для двух или более файлов, это будет очень запутанным для конечного пользователя.

  1. Таким образом, была кнопка «генерировать», которая генерировала файлы (с индикатором выполнения, если процедура занимает больше времени) и затем перенаправляла на другую страницу (или всплывающее окно), которая содержала бы отдельные ссылки этих нескольких файлы, чтобы пользователь мог взять их один за другим или только нужные.

  2. Если пользователю все еще нужно получить «одним щелчком мыши», тогда стандартная процедура - архивирование всех файлов. Для большей простоты использования это может быть объединено / улучшено с помощью экрана или всплывающего окна из сценария № 1: например, показать список с флажками для каждого файла и ссылку внизу «получить все как почтовый индекс». Таким образом, пользователь может загружать отдельные файлы, а также выбирать только те файлы, которые ему интересны, или просто получать все.

Именно так большинство веб-приложений делают это, так как оно наиболее удобное для пользователя.

1 голос
/ 24 июля 2010

Суть этого вопроса в том, как отправить несколько файлов в ответе HTTP. Это не произойдет по умолчанию. И если вы делаете то, что делаете в настоящее время, вы (естественно) получаете один загруженный файл, содержащий объединение двух книг Excel, и у браузера нет простого способа разделить их.

Чтобы отправить 2 разных файла Excel, вам необходимо закодировать их с помощью некоторой схемы, которую браузер знает, как отменить выбор. Один из способов сделать это - отправить ответ с типом контента «multi-part», как описано в RFC1341 раздел 7.2 . Я ожидаю, что кто-то может подключиться с соответствующей библиотекой Java, которая позаботится о создании потока контента из нескольких частей.

Другим способом было бы закодировать два (или более) файла в виде ZIP-архива. В библиотеке классов Java есть классы для программного создания архива ZIP.

0 голосов
/ 24 июля 2010

Вы можете отправить только один файл обратно.

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

0 голосов
/ 24 июля 2010

Я не знаком с Apache POI. Однако вам нужно иметь два OutputStream s для записи в два файла.

С предоставленным вами кодом, похоже, все, что вы сделали, изменили заголовок файла с того, что он думал, что он «ExportFile1.xls», на «ExportFile2.xls», а затем записали содержимое файла (с заголовок, требующий получить file2) в поток. Я подозреваю, что вам понадобится второй резонансный объект для второго потока.

...