为用户创建一个Excel文件使用Apache POI下载(Create an excel file

2019-06-25 19:27发布

我能够创建使用Apache POI的Excel文件。 不过,我希望用户能够下载这是一个“真实”的Excel文件。 我想达到的效果将有一个弹出式对话框,允许用户下载该文件。 这是类似于使用

<%@ page contentType="application/vnd.ms-excel" pageEncoding="ISO-8859-1"%> 
<%response.setHeader("Content-Disposition", "attachment;filename=myfile.xls"); %>

一个重要的例外:我必须允许用户下载一个适当的Excel文件。 我读的地方,上面的代码只是说给服务器发送一个Excel文件,客户端

Answer 1:

不要在一个普通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。



Answer 2:

虽然这是事实,这是更常见的编写使用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可以输出一些初步的新线和破坏你的输出。

另外,我建议你总是设置内容长度。 如果没有设置它的一些浏览器将无法正常工作。 这就是为什么我第一次输出我的电子表格到一个字节数组,所以我可以设置之前实际发送的数据长度。



Answer 3:

如果你想下载唐,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();


文章来源: Create an excel file for users to download using Apache POI