Create an excel file for users to download using Apache POI

前端 未结 3 1409
逝去的感伤
逝去的感伤 2020-12-01 00:25

I\'m able to create an excel file using apache poi. however, i want users to be able to download this as a \"true\" excel file. the effect i want to achieve would be to have

相关标签:
3条回答
  • 2020-12-01 00:49

    Do the job in a normal servlet instead of a JSP file. A JSP file is meant for dynamically generating HTML code and is using a character writer for that instead of a binary output stream and would thus only corrupt your POI-generated Excel file which is in essence a binary stream.

    So, basically all you need to do in the doGet() method of the servlet is the following:

    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();
    

    Now, to download it, invoke the servlet by its URL instead of the JSP file.

    0 讨论(0)
  • 2020-12-01 01:11

    While it is true that it is more usual to write a binary attachment using a servlet rather than a jsp, it is certainly possible to write a binary attachment from a jsp. And the advantage of doing so is that you need not worry about configuring web.xml or reloading your application. That can be an important consideration, depending on your web server environment.

    Here is an example jsp that uses poi to send a binary attachment to a browser.

    <%@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();
    
    %>
    

    The important trick is to make sure there is only one line with all your imports and other directives prior to the "<%" that begins your code. Otherwise, the jsp may output some initial new lines and corrupt your output.

    Also, I suggest you always set the content length. Some browsers will not work correctly if it is not set. That is why I first output my spreadsheet to a byte array, so I could set the length prior to actually sending the data.

    0 讨论(0)
  • 2020-12-01 01:11

    if you want to download don,t use hssf workbook it will slower and consume more space use 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();
    

    For Pdf Use 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();
    
    0 讨论(0)
提交回复
热议问题