最近,我不得不解决同样的问题,但需要一个.docx文档。尝试上述方法导致以下错误(如本文所述):
org.apache.poi.poifs.filesystem.OfficeXmlFileException:提供的数据似乎在 Office 2007+ XML 中。您正在调用 POI 中处理 OLE2 Office 文档的部分。您需要调用POI的不同部分来处理此数据(例如XSSF而不是HSSF)
最后,我必须按如下方式更改代码(在我的情况下,.docx文件位于资源文件夹中):
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
public class XWPFTest {
public static void main(String[] args) throws URISyntaxException, IOException {
String resourcePath = "template.docx";
Path templatePath = Paths.get(XWPFTest.class.getClassLoader().getResource(resourcePath).toURI());
XWPFDocument doc = new XWPFDocument(Files.newInputStream(templatePath));
doc = replaceTextFor(doc, "UNIQUE_VAR", "MyValue1");
saveWord("C:\\document.docx", doc);
}
private static XWPFDocument replaceTextFor(XWPFDocument doc, String findText, String replaceText){
doc.getParagraphs().forEach(p ->{
p.getRuns().forEach(run -> {
String text = run.text();
if(text.contains(findText)) {
run.setText(text.replace(findText, replaceText), 0);
}
});
});
return doc;
}
private static void saveWord(String filePath, XWPFDocument doc) throws FileNotFoundException, IOException{
FileOutputStream out = null;
try{
out = new FileOutputStream(filePath);
doc.write(out);
}
catch(Exception e) {
e.printStackTrace();
}
finally{
out.close();
}
}
}
P.S. 我不得不删除 $ ,因为在.docx被管理是单独的运行,所以我不得不选择一个唯一的 var 名称的方法。我需要以下Apache POI依赖项:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.17</version>
</dependency>