apache POI 3.8无法读取内容错误

时间:2012-06-11 15:20:34

标签: excel jsp excel-2007 apache-poi

我正在使用Apache POI 3.8。我有一个生成excel(.xslx)文件的JSP。我在本地开发它,文件可以毫无问题地打开。 然后,我在Dev环境中部署了应用程序,当我在那里打开生成的excel文件时,会出现一个警告框:“Excel在ausencias.xlsx中找到了不可读的内容。你想要恢复这个工作簿的内容吗?如果你相信此工作簿的来源,单击是。“ 如果单击“是”,则会出现以下警告:“无法使用Microsoft Excel打开此文件。是否要在Microsoft Office Online网站上搜索可以打开该文件的转换器?” 如果单击“否”,则表明文件已正确打开。但我不知道为什么会出现这些错误。

即使我生成一个简单的空.xslx文件,也会发生这种情况:

<%@page import="java.io.FileOutputStream"%>
<%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@page import="java.io.IOException"%>
<%@page import="javax.servlet.*"%>

<%@page import="org.apache.poi.ss.usermodel.*"%>    
<%@page import="org.apache.poi.ss.util.CellRangeAddress"%>
<%@page import="org.apache.poi.xssf.usermodel.*"%>

<%
    response.setHeader ("Content-Disposition", "attachment;filename=\"ausencias.xlsx\"");
    response.setContentType("application/vnd.ms-excel");

    Workbook wb = new XSSFWorkbook();

    Sheet sheet = wb.createSheet("Ausencias");

    ServletOutputStream fout = response.getOutputStream();

    wb.write(fout);
    fout.flush();
    fout.close();
%>

在我的本地计算机上,我有Microsoft Office Excel 2007(12.0.6661.5000)SP2 MSO(12.0.6562.5003) 在开发环境中,我有Microsoft Office Excel 2007(12.0.6611.1000)SP3 MSO(12.0.6607.1000)

有没有人知道解决方案或解决方法?

感谢。

编辑:我添加了整个JSP代码。我知道可能不会使用某些进口产品;当我裁剪原始代码时,我只是将它们留在那里寻找问题。

编辑2:我在本地机器上打开了在开发环境中生成的文档,它会抛出相同的警告。所以问题出在文件中,而不是Excel版本中。似乎某些东西正在篡改Dev Env中的文件。任何想法??

3 个答案:

答案 0 :(得分:2)

我发现只要将二进制文件作为http响应发回,就应该始终设置内容长度。虽然有时你可以在不设置长度的情况下逃脱,但浏览器通常无法可靠地自动判断文件的长度。

通常,我这样做的方法是首先将输出文件写入ByteArrayOutputStream。这让我可以计算输出文件的大小。然后我将ByteArrayOutputStream字节写入响应对象。

以下是基于原始代码的示例:

    // generate the xlsx file as a byte array
    Workbook wb = new XSSFWorkbook();
    Sheet sheet = wb.createSheet("Ausencias");
    ByteArrayOutputStream bout = new ByteArrayOutputStream();
    wb.write(bout);
    bout.close();

    // send byte array as response
    response.setHeader ("Content-Disposition", "attachment;filename=\"ausencias.xlsx\"");
    response.setContentType("application/vnd.ms-excel");
    response.setContentLength(bout.size());
    ServletOutputStream fout = response.getOutputStream();
    fout.write(bout.toByteArray());
    fout.flush();
    fout.close();

答案 1 :(得分:2)

您收到此错误的原因是MIME类型错误。而不是

“application / vnd.ms-excel”

你需要使用

“application / vnd.openxmlformats-officedocument.spreadsheetml.sheet”

用于XLSX文档

答案 2 :(得分:0)

这是我解决它的方式:

String name = "Name_of_file.xlsx";

ByteArrayOutputStream bout = new ByteArrayOutputStream();
workbook.write(bout);
bout.close();

response.setHeader("Set-Cookie", "fileDownload=true; path=/");
response.setHeader("Content-Disposition", "attachment; filename=" + name);
response.setContentLength(bout.size());

ServletOutputStream out = response.getOutputStream();

out.write(bout.toByteArray());
out.flush();
out.close();

我认为与其他答案的不同之处在于我没有使用response.setContentType指令而且我不确切知道它的工作原因......但它确实有效。没有更多“Excel发现不可读的内容......”消息。