平平无奇的老坛 2018-06-13 20:58 采纳率: 50%
浏览 5363
已结题

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包,有什么解决方法?

  • 写回答

9条回答 默认 最新

  • zhangxl5232 2018-06-13 22:06
    关注

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

    评论
  • ededede343 2018-06-13 22:40
    关注

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

    评论
  • u011102238 2018-06-13 23:59
    关注

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

    评论
  • qq_38352646 2018-06-14 00:11
    关注

    基本版本是没有问题的

    评论
  • 李小六 2018-06-14 00:45
    关注

    分别用原生.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的执行顺序没有任何影响。

    评论
  • 王也要强 2018-12-19 01:30
    关注

    word模板有问题就是打不开

    评论
  • wqqqianqian 2019-03-05 07:48
    关注

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

    评论
  • xiangxik 2018-06-13 22:03
    关注

    is.close(); 应最后调用

    评论
  • 邪恶八进制 2018-06-14 01:40
    关注

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

    评论
编辑
预览

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部