我正在使用Apache POI 3.13,并尝试搜索和替换给定模板文件中的文本,然后保存新生成的.docx。这是我的代码:
{{1}}
这看起来非常简单,但是当我运行此代码时,文档“Sample.docx”也会被替换。最后,我有两份内容相同的文件。
这是POI的正常行为吗?我认为打开文档只会将其加载到内存中,然后执行'doc.write(OutputStream);'将它刷新到磁盘。
我尝试写入相同的'filePath',但正如我预期的那样,它会抛出异常,因为我正在尝试写入当前打开的文件。
唯一有效的方法是我先复制模板文件并使用该副本。但是现在,我有3个文件,第一个是原始模板'Sample.docx',其余2个具有相同的内容(SampleProcessed.docx和SampleProcessedOut.docx)。
虽然有效,但非常浪费。这有什么办法吗?我做错了什么,也许我打开文件错误了?
答案 0 :(得分:4)
因为您正在使用
XWPFDocument doc = new XWPFDocument(OPCPackage.open(filePath));
要创建XWPFDocument
,OPCPackage
会在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
而不与文件有关。