java - java中写入excel时出现错误

标签 java servlets export-to-excel

我不知道问题出在哪里。我尝试过,但错误仍然存​​在。

我的程序是导出到 Excel,我使用的是 apache poi api。

下面是我的代码。编辑:

public void exportToExcel(ValueObjectList columnBody, String pageDef, ValueObject vo){
    try {
    HttpServletResponse response = vo.getResponse();

     SimpleDateFormat sd = new SimpleDateFormat("ddMMyy");
     Date dt = new Date();
    response.setContentType("application/vnd.ms-excel");
    if(pageDef == "promo" || pageDef.equals("promo"))
        response.setHeader("Content-Disposition", "attachment; filename=PROMO-" + sd.format(dt) + ".xls");
    else if(pageDef == "incomplete" || pageDef.equals("incomplete"))
        response.setHeader("Content-Disposition", "attachment; filename=INCOM-" + sd.format(dt) + ".xls");
    else
         response.setHeader("Content-Disposition", "attachment; filename=ST-" + sd.format(dt) + ".xls");


    // create a small spreadsheet
     HSSFWorkbook wb = new HSSFWorkbook();
     HSSFSheet sheet = wb.createSheet();

     HSSFRow row = null;
     HSSFCell cell = null;

     //set default font properties
     //font family: Arial
     //font weight: bold
     Font headerFont = wb.createFont();
     headerFont.setBoldweight(Font.BOLDWEIGHT_BOLD);

     headerFont.setFontHeightInPoints((short)14);

     //Cell Style for header
     CellStyle csHeader = wb.createCellStyle();
     csHeader.setFont(headerFont);
     csHeader.setBorderBottom(csHeader.BORDER_THICK);
     csHeader.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
     csHeader.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
     csHeader.setWrapText(true);

     //Cell Style for body
     CellStyle csBody = wb.createCellStyle();
     csBody.setWrapText(true);
     csBody.setAlignment(HSSFCellStyle.ALIGN_CENTER);


     String[] columnHeader = ((ValueObject)columnBody.get(0)).toKeyArray();
     //System.out.println("Header Length: " + columnHeader.length);

     row = sheet.createRow(0);
     cell = row.createCell(0);
     cell.setCellValue("No");
     cell.setCellStyle(csHeader);

     for(int h = 0; h < columnHeader.length; h++){
         cell = row.createCell(h+1);
         cell.setCellValue(columnHeader[h]);
         cell.setCellStyle(csHeader);
         sheet.autoSizeColumn(h+1);
         //sheet.setColumnWidth(h, 2000);
     }

     //System.out.println("header key : " + columnHeader[2]);
    //System.out.println("header value : " + testobj.get(testobj.toKeyArray()[2]));

     for(int i = 0; i < columnBody.size(); i++){
         row = sheet.createRow(i+1);
         cell = row.createCell(0);
         cell.setCellValue(i+1);
         cell.setCellStyle(csBody);
         ValueObject column = (ValueObject)columnBody.get(i);
         for(int j = 0; j < column.size(); j++){
             cell = row.createCell(j+1);
             cell.setCellValue(column.get(column.toKeyArray()[j]));
             cell.setCellStyle(csBody);
             sheet.autoSizeColumn(j+1);
         }
     }


     /*
     // 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
     if(pageDef == "promo" || pageDef.equals("promo"))
        response.setHeader("Content-Disposition", "attachment; filename=PROMO-" + sd.format(dt) + ".xls");
     else if(pageDef == "incomplete" || pageDef.equals("incomplete"))
        response.setHeader("Content-Disposition", "attachment; filename=INCOM-" + sd.format(dt) + ".xls");
     else
         response.setHeader("Content-Disposition", "attachment; filename=ST-" + sd.format(dt) + ".xls");

     OutputStream outStream = response.getOutputStream();
     outStream.write(outArray);
     outStream.flush();
     */


     ByteArrayOutputStream outByteStream = new ByteArrayOutputStream(wb.getBytes().length);
     wb.write(outByteStream);


    } catch (Exception e) {
        log.error(e);
        e.printStackTrace();
    }
}

我尝试在谷歌上冲浪并尝试解决但不行。

首先,我在jsp中编写了这些代码。

当我在 google 上冲浪时,人们说我必须在 servlet 中使用,所以我转向 servlet,但仍然出现错误。

英语不是我的母语。抱歉,如果我输入错误。

提前致谢。

最佳答案

我猜你的错误与这段代码有关(不是 apache poi api):

OutputStream outStream = response.getOutputStream();
outStream.write(outArray);
outStream.flush();
outStream.close();

因为您要刷新并关闭 Servlet 中的输出流,所以在响应返回到客户端之前尝试写入输出流的任何操作都将导致抛出 IllegalStateException。 通常最好将flush()和close()留给servlet容器,除非你真的知道你在做什么。
尝试删除flush()和close(),并检查您拥有的其他servlet是否也在做同样的事情。

关于java - java中写入excel时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15801375/

相关文章:

javascript - 如何使用从 Servlet 发送并由 JavaScript 通过 Jquery 接收的数据来更改网页内容?

java - 在weblogic 11 + linux中无法成功导出excel

java - Excel 导出中的乱码

java - 试图将 Tomcat servlet 的 http 请求发送到另一台服务器,卡在 HttpClientBuilder.create().build();

java - Guava/Google Collections 的向后兼容性如何?

java - Maven - 在 'test' 和 'war' 阶段使用不同的 java 类

java - ANT_HOME 设置不正确或 ant 无法定位

servlets - 在 servlet 中注入(inject) jms 资源以及 MDB 的最佳实践

c# - 如何根据用户输入的值创建验证范围?

java - Firebase Admin SDK 未初始化(Java)