使用Apache POI更新MSWord文档

4

我正在使用Apache POI更新Microsoft Word文档。该msword文档是一个模板,其中包含一些以"${place.holder}"形式的占位符,我所需要做的就是用特定的值替换这些占位符。到目前为止,我已经实现了以下内容:

private void start() throws FileNotFoundException, IOException {

    POIFSFileSystem fsfilesystem = null;
    HWPFDocument hwpfdoc = null;

    InputStream resourceAsStream =  getClass().getResourceAsStream("/path/to/document/templates/RMA FORM.doc");       
    try {
        fsfilesystem = new POIFSFileSystem(resourceAsStream );
        hwpfdoc = new HWPFDocument(fsfilesystem);
        Range range = hwpfdoc.getRange();

        range.replaceText("${rma.number}","08739");
        range.replaceText("${customer.name}", "Roger Swann");

        FileOutputStream fos = new FileOutputStream(new File("C:\\temp\\updatedTemplate.doc"));
        hwpfdoc.write(fos);
        fos.flush();
        fos.close();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

程序运行没有错误。如果我使用十六进制编辑器查看输出文件,我可以看到占位符已被程序替换。然而,当我尝试用MSWord打开文档时,MSWord崩溃了。
我是否忽略了某个步骤(一系列步骤),或者说我的运气不好?我需要调整任何计数器吗,因为替换文本的长度与被替换文本的长度不同?
问候。

你尝试过使用POI 3.8 beta 4吗?最近在HWPF上已经对.DOC处理进行了大量工作,所以你可能会发现它已经修复了。 - Gagravarr
我已经尝试了3.8 beta 4版本,现在可以打开文档,但内容严重损坏。我甚至尝试从程序中删除更新,只是打开.doc文件并将其写回,但仍然出现数据损坏。 - user497087
最好在POI Bugzilla上报告错误,并上传有问题的文件。 - Gagravarr
我不确定你的情况出了什么问题,但这是一个非常有用的poi搜索和替换示例代码。这正是我所需要的,并且运行得非常好,谢谢 =)。顺便说一句,我使用了XML标记符号,如<tag/>,而不是你使用的#{tag}符号。我不知道这是否重要。 - Ted
关于使用POI处理Word模板的相关SE帖子。 - Murta
显示剩余2条评论
1个回答

0

使用 new FileInputStream() 替代 getClass().getResourceAsStream("/path/to/document/templates/RMA FORM.doc");


你能解释一下为什么这可能有帮助吗? - Gagravarr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接