2011-09-15 48 views
3

我试图使用Apache POI更新Microsoft Word文档。 msword文档是一个包含“$ {place.holder}”形式的多个占位符的模板,我需要做的就是用特定值替换持有者。到目前为止我所得到的是使用Apache POI更新MSWord文档

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崩溃。

有没有一个步骤(一系列的步骤),我失踪了,或者我基本上运气不好?我是否需要调整任何计数器,因为替换文本的长度与替换文本的长度不同?

问候

+0

您是否尝试过与POI 3.8 beta 4版本?最近在HWPF中进行了大量的工作,所以你可能会发现它是固定的 – Gagravarr

+0

我用3.8 beta 4试过了,现在我可以打开文档,但内容严重损坏。我甚至尝试从程序中删除更新,所以我所做的只是打开.doc并将其写回,并且仍然收到数据损坏 – user497087

+0

您最好报告POI bugzilla中的错误,并上传问题文件 – Gagravarr

回答

0

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

+0

您能澄清为什么这可能有所帮助吗? – Gagravarr