Apache POI:无法替换.docx模板中的文本

时间:2014-10-02 11:34:43

标签: java apache apache-poi docx

我正在尝试使用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

0 个答案:

没有答案