Java在Apache POI上进行搜索和替换时如何避免覆盖模板文件

时间:2016-02-14 06:39:20

标签: java apache-poi xwpf

我正在使用Apache POI 3.13,并尝试搜索和替换给定模板文件中的文本,然后保存新生成的.docx。这是我的代码:

{{1}}

这看起来非常简单,但是当我运行此代码时,文档“Sample.docx”也会被替换。最后,我有两份内容相同的文件。

这是POI的正常行为吗?我认为打开文档只会将其加载到内存中,然后执行'doc.write(OutputStream);'将它刷新到磁盘。

我尝试写入相同的'filePath',但正如我预期的那样,它会抛出异常,因为我正在尝试写入当前打开的文件。

唯一有效的方法是我先复制模板文件并使用该副本。但是现在,我有3个文件,第一个是原始模板'Sample.docx',其余2个具有相同的内容(SampleProcessed.docx和SampleProcessedOut.docx)。

虽然有效,但非常浪费。这有什么办法吗?我做错了什么,也许我打开文件错误了?

1 个答案:

答案 0 :(得分:4)

因为您正在使用

XWPFDocument doc = new XWPFDocument(OPCPackage.open(filePath));

要创建XWPFDocumentOPCPackage会在filePath模式下从READ_WRITE打开。如果这将关闭,它也将被保存。请参阅https://poi.apache.org/apidocs/org/apache/poi/openxml4j/opc/OPCPackage.html#close%28%29

OPCPackage将在XWPFDocument关闭时关闭。

但你为什么这样做?为什么不

XWPFDocument doc = new XWPFDocument(new FileInputStream(filePath));

这样,XWPFDocument将仅在内存中创建一个新的OPCPackage而不与文件有关。