我正在使用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中的文件。任何想法??
答案 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发现不可读的内容......”消息。