Создайте файл excel для загрузки пользователями с помощью Apache POI
Я могу создать файл excel с помощью apache poi. однако, я хочу, чтобы пользователи могли загрузить это как "истинный" файл excel. эффект, который я хочу достичь, будет иметь всплывающее окно, позволяющее пользователю загрузить файл. это похоже на использование
<%@ page contentType="application/vnd.ms-excel" pageEncoding="ISO-8859-1"%>
<%response.setHeader("Content-Disposition", "attachment;filename=myfile.xls"); %>
с одним критическим исключением: я должен разрешить пользователю загружать надлежащий файл excel. я прочитал где-то вышеприведенный код просто говорит клиенту, что сервер отправляет файл excel
Ответы
Ответ 1
Выполняйте задание в обычном сервлете вместо JSP файла. JSP файл предназначен для динамического генерации HTML-кода и использует для этого символ-символ вместо двоичного потока вывода и, таким образом, только повреждает ваш файл Excel, созданный POI, который по сути является двоичным потоком.
Итак, в основном все, что вам нужно сделать в методе doGet()
сервлета, следующее:
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment; filename=filename.xls");
HSSFWorkbook workbook = new HSSFWorkbook();
// ...
// Now populate workbook the usual way.
// ...
workbook.write(response.getOutputStream()); // Write workbook to response.
workbook.close();
Теперь, чтобы загрузить его, вызовите сервлет по URL-адресу вместо JSP файла.
Ответ 2
Хотя верно, что писать двоичное вложение с использованием сервлета, а не jsp, более естественно писать двоичное вложение из jsp. И преимущество этого в том, что вам не нужно беспокоиться о настройке web.xml или перезагрузке приложения. Это может быть важным соображением, в зависимости от среды вашего веб-сервера.
Вот пример jsp, который использует poi для отправки двоичного вложения в браузер.
<%@page import="org.apache.poi.hssf.usermodel.*" %><%@page import="java.io.*" %><%
// create a small spreadsheet
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet();
HSSFRow row = sheet.createRow(0);
HSSFCell cell = row.createCell(0);
cell.setCellValue("Some text");
// write it as an excel attachment
ByteArrayOutputStream outByteStream = new ByteArrayOutputStream();
wb.write(outByteStream);
byte [] outArray = outByteStream.toByteArray();
response.setContentType("application/ms-excel");
response.setContentLength(outArray.length);
response.setHeader("Expires:", "0"); // eliminates browser caching
response.setHeader("Content-Disposition", "attachment; filename=testxls.xls");
OutputStream outStream = response.getOutputStream();
outStream.write(outArray);
outStream.flush();
%>
Важным трюком является удостовериться, что перед "<%", который начинает ваш код, есть только одна строка со всеми вашими импортами и другими директивами. В противном случае jsp может выводить некоторые начальные новые строки и испортить ваш вывод.
Кроме того, я предлагаю вам всегда устанавливать длину содержимого. Некоторые браузеры не будут работать правильно, если они не установлены. Вот почему я сначала выводил свою таблицу в массив байтов, поэтому я мог установить длину до фактической отправки данных.
Ответ 3
если вы хотите скачать дон, t использовать hssf workbook, он будет медленнее и будет потреблять больше пространства apche poi 3.17 beta-1
SXSSFWorkbook workbook = new SXSSFWorkbook(100);
workbook.setCompressTempFiles(true);
Sheet sh = workbook.createSheet();
//write your data on sheet
//below code will download file in browser default download folder
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment; filename="+filename+".xlsx");
workbook.write(response.getOutputStream());
workbook.close();
workbook.dispose();
Для Pdf Использование Itext
Document document = new Document();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter.getInstance(document, baos);
document.open();
//write your code
document.add("content");
document.close();
response.setHeader("Expires", "0");
response.setHeader("Cache-Control","must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
response.setContentType("application/pdf");
response.addHeader("Content-Disposition", "attachment; filename="+filename+".pdf");
response.setContentLength(baos.size());
OutputStream os = response.getOutputStream();
baos.writeTo(os);
os.flush();
os.close();