我使用apache-poi中的XSSF创建了一个xlsx文件,并创建了一个使用apache-camel返回此文件的路由。 文件创建正常,我做了我发现的所有可能的内容设置,下载工作没有任何问题在我的本地机器(Windows)。 将它部署到Unix服务器(在Tomcat7下)并从该服务器访问http路径后,文件被下载但是已损坏,excel不会打开它。我收到以下错误:
" Excel在' Filename.xlsx'中找到了不可读的内容。你想恢复这个工作簿的内容吗?如果您信任此工作簿的来源,请单击“是”。"点击是后跟着错误显示: " Excel无法打开文件' Filename.xlsx'因为文件格式或文件扩展名无效。验证文件是否已损坏,以及文件扩展名是否与文件格式匹配。"
我正在使用从camel调用的处理器来创建Workbook文件,并在处理器中创建所有内容设置,这应该不是问题,我将它们记录在处理器之外并且全部都已设置。一切都按预期工作,但仅限于本地PC。 注意:我有相同版本的Java / apache-camel / poi / tomcat等等..就像服务器一样。
一些代码段:
XSSFWorkbook xlsx = writeToExcel(list);
ByteArrayOutputStream bos = getByteFormat(exchange, xlsx);
exchange.getIn().setHeader("Content-Disposition",
"attachment; filename=ProductExports.xlsx");
exchange.getIn().setHeader(Exchange.CONTENT_TYPE,"application/vnd.openxml");
exchange.getIn().setHeader(Exchange.CONTENT_LENGTH,bos.toByteArray().length);
exchange.getIn().setHeader("Expires","0");
exchange.getIn().setBody(bos.toByteArray());
getByteFormat()部分:
private ByteArrayOutputStream getByteFormat(Exchange exchange,
XSSFWorkbook xlsx) throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
xlsx.write(bos);
} finally {
bos.close();
}
return bos;
}
我四处寻找,但没有找到任何骆驼痘的例子,人们遇到了同样的问题。 注意:我也尝试使用HSSF格式,并且使用不同的CONTENT_TYPE设置,结果是相同的。
我想问题可能是因为我传递了字节数组而导致Unix系统以不同的方式解释这个问题,或者可能是文件传输分区。损坏的文件比正常创建的文件更大,可能包含一些额外的行,不确定这是否重要。
答案 0 :(得分:0)
下面的代码在Windows和Unix下运行良好。希望这对你有所帮助。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
OutputStream outStream = null;
try {
response.setContentType("application/vnd.ms-excel");
response.setHeader
("Content-Disposition", "attachment; filename=Sample.xlsx");
outStream = response.getOutputStream();
Workbook wb = new XSSFWorkbook();
XSSFSheet sheet = wb.createSheet(sheetName) ;
//iterating r number of rows
for (int r=0;r < 5; r++ )
{
XSSFRow row = sheet.createRow(r);
//iterating c number of columns
for (int c=0;c < 5; c++ )
{
XSSFCell cell = row.createCell(c);
cell.setCellValue("Cell "+r+" "+c);
}
}
wb.write(outStream);
outStream.close();
}
catch (Exception e){
throw new ServletException("Exception in Excel Sample Servlet", e);
}
finally{
if (outStream != null)
outStream.close();
}
}