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 教程有很多