我使用Apache POI API创建了一个word文档,可以将文件写入本地计算机,并且效果很好,但是当写入response.getOutputStream()
以允许用户使用浏览器下载时,word文档已损坏。
这是我的代码:
String docFile = "inv_export_012.docx";
FileOutputStream fos= new FileOutputStream("C:\\temp\\" + docFile);
//set response headers
response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
response.setHeader("Content-Disposition","attachment; filename=" + docFile);
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setHeader("Expires", "0");
//create docx format using XWPFDocument
XWPFDocument wordDocument = new XWPFDocument();
XWPFParagraph p1 = wordDocument.createParagraph();
p1.setAlignment(ParagraphAlignment.LEFT);
XWPFRun r1 = p1.createRun();
r1.setText("Invoice Number: 00000000XXX");
r1.addCarriageReturn();
//write document to local C: drive
//this step works well and I can successfully create the document
wordDocument.write(fos);
//set content length
response.setHeader("Content-Length", String.valueOf(new File("C:\\temp\\" + docFile).length()));
fos.close();
wordDocument.write(response.getOutputStream());
还尝试了二进制格式,但也不起作用。
response.setContentType("application/octet-stream");
它运行良好,并且在我的本地桌面上成功创建了文档。如果我尝试使用浏览器下载并直接打开(或保存并打开),则会出现以下错误,指示文档已损坏。单击以打开文档仍会打开该文档,但是谁知道为什么我收到此消息?任何帮助,将不胜感激!
单击“确定”,我会收到以下消息:
编辑:06/29 -更新了代码以生成* .docx格式。还在响应头中添加了Content-Length。尝试通过删除Content-Length也无法使用。
答案 0 :(得分:0)
发现POI 3.16存在此问题,当我升级到Apache POI 4.0.0 jar时,此问题已解决。