我能够创建使用Apache POI的Excel文件。 不过,我希望用户能够下载这是一个“真实”的Excel文件。 我想达到的效果将有一个弹出式对话框,允许用户下载该文件。 这是类似于使用
<%@ page contentType="application/vnd.ms-excel" pageEncoding="ISO-8859-1"%>
<%response.setHeader("Content-Disposition", "attachment;filename=myfile.xls"); %>
一个重要的例外:我必须允许用户下载一个适当的Excel文件。 我读的地方,上面的代码只是说给服务器发送一个Excel文件,客户端
不要在一个普通Servlet而不是JSP文件的作业。 甲JSP文件是指动态生成HTML代码,并且使用的是,代替二进制输出流的字符作家,将因此仅破坏您POI生成的Excel文件,其在本质上是二进制流。
所以,基本上所有你需要的做doGet()
在servlet的方法如下:
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。
虽然这是事实,这是更常见的编写使用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();
%>
最重要的诀窍是要确保只有一个与所有的开头你的代码“<%”之前,进口和其他指令线。 否则,JSP可以输出一些初步的新线和破坏你的输出。
另外,我建议你总是设置内容长度。 如果没有设置它的一些浏览器将无法正常工作。 这就是为什么我第一次输出我的电子表格到一个字节数组,所以我可以设置之前实际发送的数据长度。
如果你想下载唐,T使用HSSF工作簿它会更慢,消耗更多的空间使用apche的POI 3.17β-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();