我正在尝试使用Java Apache POI
替换我的.docx模板中的一些文本。我使用的是最新版本的Apache POI。以下是我的代码
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author
*/
public class POIDocWriter
{
public void createClientInitialLetter(String input, String output, String clientName, String address, String date) throws IOException, InvalidFormatException
{
XWPFDocument doc = new XWPFDocument(OPCPackage.open("Invoice.docx"));
for (XWPFParagraph p : doc.getParagraphs()) {
for (XWPFRun r : p.getRuns()) {
String text = r.getText(0);
System.out.println(text);
if (text.contains("#ADDRESS#"))
{
text = text.replace("#ADDRESS#", address);
r.setText(text, 0);
System.out.println(text);
}
if (text.contains("#DATE#"))
{
text = text.replace("#DATE#", date);
r.setText(text, 0);
System.out.println(text);
}
if (text.contains("#DATE#"))
{
text = text.replace("#DATE#", date);
r.setText(text, 0);
System.out.println(text);
}
if (text.contains("#CLIENTNAME#"))
{
text = text.replace("#CLIENTNAME#", "Johan");
r.setText(text, 0);
System.out.println(text);
}
}
}
doc.write(new FileOutputStream("output.docx"));
}
}
我的.docx模板可以在下面的保管箱链接中找到
https://www.dropbox.com/s/luiws9pz9q3whe5/Invoice.docx?dl=0
我的问题是,我只得到以下错误,模板没有发生任何事情。
null
java.lang.NullPointerException
at POIDocWriter.createClientInitialLetter(POIDocWriter.java:30)
at Main.main(Main.java:22)
我的代码可以正常使用没有图像和表格的模板,所以我认为这是关于图像和表格的。如何替换.docx
模板中的文字并使用Apache POI
将其另存为新文档?
更新
这里的问题不完全是NULL检查。即使使用NULL检查,它也不会替换值。如果我执行NULL检查,则无论如何都没有错误,并且以下输出显示在控制台中。正如你所看到的,它被打破了#34;我的文件中的文字,所以找不到我要找的字。
除此之外,它不会替换表中的任何值!!!
Advance Payment
#
NAME
#
#
ADDRESS
#
#DATE
#
Vat Payable: #VAT#
Signature