POI 生成的word无法打开

代码jar包图片说明

public static void main(String[] args) throws ParseException, IOException {

InputStream is = new FileInputStream(new File("D:\\POI\\test\\test.doc"));

// WordExtractor ex = new WordExtractor(is);
// System.out.println(ex.getText());
//is.close();
HWPFDocument doc = new HWPFDocument(is);
// Range range =doc.getRange();
// System.out.println(range.text());
// range.replaceText("Test", "111");
FileOutputStream os = new FileOutputStream("D:\POI\result\result.doc");

ByteArrayOutputStream baos = new ByteArrayOutputStream();

doc.write(baos);
os.write(baos.toByteArray());

doc.write(os);  
is.close();
os.flush();
baos.flush();
os.close();
baos.close();

}


公司要做一个替换模板文字然后导出word的功能,自己写了demo,然后生成的word打不开。如果不执行range.replaceText("Test", "111"); 生成的word可以打开,但是会提示受保护的视图,求助如何解决

不知道为什么你们可以正常导出word ,我在我同事的电脑上试过了也是打不开。是POI3.5的问题吗?反正现在不能换jar包,有什么解决方法?

您好,我试了一下您的代码,没有问题,我建议您的word如果是高版本,你先另存为word 97-2003文档,转成doc格式,然后在试试。或者word要设置为兼容模式。

版本匹配就可以了,开发环境和代码对比下

可以的,我也是这样做我试了一下您的代码,没有问题,我建议您的word如果是高版本,你先另存为word 97-2003文档,转成doc格式,然后在试试。或者word要设置为兼容模式。

基本版本是没有问题的

分别用原生.doc文档(Word97-2003)和.docx文档(Word2007及以上)修改后缀名后测试,都没有问题。

 public static void main(String[] args) throws Exception {
    String path = "E:\\test2003.doc";
    // path = "E:\\test2007.doc";// Word2007(.docx)改了后缀

    FileInputStream in = new FileInputStream(new File(path));
    HWPFDocument doc = new HWPFDocument(in);

    Range range = doc.getRange();
    System.out.println(range.text());
    range.replaceText("111", "test");
    System.out.println(range.text());

    BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("E:\\result.doc"));
    doc.write(out);
    out.flush();
    out.close();

    doc.close();// A
    in.close();// B
}

题主你写的代码有点绕了:
HWPFDocument.write(out) 的注释说的很明白了,该方法的功能就是把文档对象输出到任意输出流;如果嫌字节流输出有性能影响,可以使用BufferedOutputStream包装一下。

另外,从 HWPFDocument.close() 的注释来看,A和B的执行顺序没有任何影响。

word模板有问题就是打不开

可以试试用pageoffice操作word。doc 和 docx 的文件调用的同一个接口,兼容性很好。

is.close(); 应最后调用

打不开就是你的业务逻辑有问题,去检查一下,POI 教程有很多