Замена содержимого в текстовом шаблоне документа с помощью Java с использованием POI - PullRequest
0 голосов
/ 08 февраля 2019

Мне нужно открыть документ .dotx, изменить содержимое (или что-то подобное) и поместить свои собственные данные, а затем вернуть сгенерированный файл .docx / document.

для примера в файле dotx, строка«name» следует заменить на «John» в генерируемом файле docx.

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 голосов
/ 08 февраля 2019

Поскольку анализ файла dotx / docx не так прост. У нас есть apache 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

...