使用POI用Java替换Word模板文档中的内容

时间:2019-02-08 11:08:35

标签: java apache-poi docx

我需要打开.dotx文档,修改内容(或类似内容)并放入自己的数据,然后返回生成的.docx / document。

对于dotx文件中的示例,在生成的docx文件中,字符串“ name”应替换为“ John”。

public static void main( String[] args ) throws IOException
{
    String inputFile="D:/Copies 2.dotx";
//  String outputeFile="D:/test.txt";
    String outputeFile="D:/test.docx";
    File inFile=new File(inputFile);
    File ouFile=new File(outputeFile);
    Map<String,String> hm = new HashMap<String,String>();
    hm.put("Namur","Youssef");
    App a = new App();
    a.changeData(inFile,ouFile, hm);    
}
private void changeData(File targetFile,File out, Map<String,String> substitutionData) throws IOException{
    BufferedReader br = null;
    String docxTemplate = "";
    try {
        br = new BufferedReader(new InputStreamReader(new FileInputStream(targetFile)));
        String temp;
        while( (temp = br.readLine()) != null) {
            docxTemplate = docxTemplate + temp;   
        }
        br.close();
    } 
    catch (IOException e) {
        br.close();
        throw e;
    }

    Iterator<Entry<String, String>> substitutionDataIterator = substitutionData.entrySet().iterator();
    while(substitutionDataIterator.hasNext()){
        Map.Entry<String,String> pair = (Map.Entry<String,String>)substitutionDataIterator.next();
        if(docxTemplate.contains(pair.getKey())){
            if(pair.getValue() != null)
                docxTemplate = docxTemplate.replace(pair.getKey(), pair.getValue());
            else
                docxTemplate = docxTemplate.replace(pair.getKey(), "NEDOSTAJE");
        }
    }

    FileOutputStream fos = null;
    try{
        fos = new FileOutputStream(out);
        fos.write(docxTemplate.getBytes());
        fos.close();
    }
    catch (IOException e) {
        fos.close();
        throw e;
    }

}

有人可以给我一些建议吗?

Ps:我正在使用apach POI 3.16

1 个答案:

答案 0 :(得分:1)

因为解析dotx / docx文件不是那么简单 我们让ap​​ache poi为此付出了一些努力,例如

XWPFDocument doc = new XWPFDocument(OPCPackage.open("-you docx/dotx file-path-"));

通过此操作,您可以加载现有文件。 现在解析文件 你得到

XWPFParagraph
XWPFTable

您可以像这样解析两者

for (XWPFParagraph p : doc.getParagraphs()) {
                List<XWPFRun> runs = p.getRuns();
                if (runs != null) {
                    for (XWPFRun r : runs) {
                        String text = r.getText(0);
                        if (text != null && text.contains("$$key$$")) {
                            text = text.replace("<asdas>", "ABCD");// your content
                            r.setText(text, 0);
                        }
                    }
                }
            }

要分析表格

for (XWPFTable tbl : doc.getTables()) {
                for (XWPFTableRow row : tbl.getRows()) {
                    for (XWPFTableCell cell : row.getTableCells()) {
                        for (XWPFParagraph p : cell.getParagraphs()) {
                            for (XWPFRun r : p.getRuns()) {
                                String text = r.getText(0);
                                if (text != null && text.contains("$$key$$")) {
                                    text = text.replace("<asdas>", "abcd");
                                    r.setText(text, 0);
                                }
                            }
                        }
                    }
                }
            }

现在将解析的文件写入您获得的目标中

doc.write(new FileOutputStream("-taget-path-"));

这需要使用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>

您将需要更多的构建路径,检查异常并添加。

您可以使用此链接并浏览更多

http://poi.apache.org/apidocs/dev/org/apache/poi/xwpf/usermodel/XWPFRun.html#setText%28java.lang.String%29