情况就是这样:
我在服务器上有一个.xslm文件(一个启用宏的excel工作表)。在服务器上打开此文件没有问题(使用ms-excel 2013) 然后我使用Apache POI 3.13编辑该文件。在服务器上保存此文件的副本,并将另一个文件提供给用户下载 (这样做只是为了检查编辑时是否有任何写入问题。最初的目的只是为了下载) 保存在服务器上的此文件的副本将打开,没有任何问题。但是,从excel 2013打开它时,以下载方式发送的错误会导致this错误。
我在客户端使用Jquery.fileDownload()
对服务器进行ajax调用,我的Spring Controller为文件提供服务。
以下是我编写文件的代码:
Workbook workbook = null;
ServletOutputStream out = null;
InputStream inputStream = null;
FileOutputStream fos = null;
try {
OPCPackage inputFilePackage = OPCPackage.open(<original file saved on server>);
workbook = WorkbookFactory.create(inputFilePackage);
//Do Some stuff to edit workbook here
fos = new FileOutputStream("temp.xlsm");
workbook.write(fos);
fos.close();
inputStream = new FileInputStream("temp.xlsm"); // The file that is created just now
servletResponse.setContentType("application/vnd.ms-excel.sheet.macroEnabled.12");
servletResponse.setHeader("content-disposition", "attachment; filename=NewFile.xlsm");
servletResponse.setHeader("Set-Cookie", "fileDownload=true; path=/");
out = servletResponse.getOutputStream();
// workbook.write(out); // Was previously using this method to directly write to ServletOutputStream
int i;
while ((i = inputStream.read()) != -1) {
out.write(i);
}
out.flush();
// new File("temp.xlsm").delete();
}
catch (Exception e) {
LOGGER.error(e.getMessage(), e);
}
finally {
if (out != null) {
try {
out.close();
}
catch (Exception ex) {
LOGGER.error(ex.getMessage());
}
}
if (inputStream != null) {
try {
inputStream.close();
}
catch (Exception ex) {
LOGGER.error(ex.getMessage());
}
}
}
return "success";
另外,我可以清楚地看到两个文件的大小之间的差异。 打开没有问题的文件是(436,129字节),而抛出错误的文件是(436,136字节)。我不确定这些额外字节的来源。
非常感谢任何帮助。