我可以使用apache poi创建一个excel文件。但是,我希望用户能够将其下载为“真正的”excel文件。我想要实现的效果是有一个允许用户下载文件的弹出框。这类似于使用
<%@ page contentType="application/vnd.ms-excel" pageEncoding="ISO-8859-1"%>
<%response.setHeader("Content-Disposition", "attachment;filename=myfile.xls"); %>
有一个严重的例外:我必须允许用户下载一个合适的excel文件。我在某处读到上面的代码只是告诉客户端服务器正在发送一个excel文件
答案 0 :(得分:35)
在普通的servlet中执行作业而不是JSP文件。 JSP文件用于动态生成HTML代码,并且使用字符编写器而不是二进制输出流,因此只会破坏POI生成的Excel文件,这实际上是二进制流。
所以,基本上你需要在servlet的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文件调用servlet。
答案 1 :(得分:20)
虽然使用servlet而不是jsp来编写二进制附件更为常见,但是从jsp编写二进制附件当然是可能的。这样做的好处是您无需担心配置web.xml或重新加载应用程序。这可能是一个重要的考虑因素,具体取决于您的Web服务器环境。
这是一个使用poi将二进制附件发送到浏览器的jsp示例。
<%@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();
%>
重要的诀窍是确保在开始代码的“&lt;%”之前只有一行包含所有导入和其他指令。否则,jsp可能会输出一些初始新行并破坏您的输出。
另外,我建议您始终设置内容长度。如果未设置,某些浏览器将无法正常工作。这就是我首先将电子表格输出到字节数组的原因,因此我可以在实际发送数据之前设置长度。
答案 2 :(得分:0)
如果你想下载don,请使用hssf工作簿,它会更慢并消耗更多空间使用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();