1
resposta

Erro ao usar docx modelo

Estou a usar um docx de modelo para geração de um relatório onde, dados alguns parâmetros, sobrescrevos no docx. Porém, a geração correta do relatório funciona apenas uma vez. Todas as demais solicitações retornam o mesmo docx da primeira execução. Segue a classe que executa a geração:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.poifs.crypt.HashAlgorithm;
import org.apache.poi.xwpf.usermodel.XWPFDocument;

import br.com.renansouza.util.CalendarUtil;

public class Docx {

    private Report report;
    private Map<String, String> tokens = new HashMap<String, String>();

    public Docx(Report report) {
        this.report = report;
        this.tokens = reportToTokens(this.report);
    }

    public File reportToDocx() {
        File docx = null;
        try {
            ClassLoader classLoader = getClass().getClassLoader();
            File file = new File(classLoader.getResource("documento_modelo.docx").getFile());
            XWPFDocument doc = new XWPFDocument(OPCPackage.open(file));

            doc.getParagraphs().stream().forEach(paragraph -> {
                paragraph.getRuns().stream().filter(run -> run != null && run.getText(0) != null && !run.getText(0).equals(" ")).forEach(r -> {
                    tokens.forEach((k, v) -> {
                        String text = r.getText(0);
                        if (text.equals(k)) {
                            if (text.equals("description")) {
                                r.setText(text.replace(k, v));
                                report.getDeliverables().stream().forEach(deliverable -> {
                                    r.setText(deliverable.getDeliverable());
                                    r.addBreak();
                                    paragraph.getCTP().getDomNode().insertBefore(r.getCTR().getDomNode(), r.getCTR().getDomNode());
                                });
                            }
                            if (text.equals("resume")) {
                                r.setText(text.replace(k, v));
                                report.getDocuments().stream().forEach(document -> {
                                    r.setText(document.getDocument());
                                    r.addBreak();
                                    paragraph.getCTP().getDomNode().insertBefore(r.getCTR().getDomNode(), r.getCTR().getDomNode());
                                });
                            }
                            if (text.equals("criteria")) {
                                r.setText(text.replace(k, v));
                                report.getDocuments().stream().forEach(document -> {
                                    document.getCriterias().stream().forEach(criteria -> {
                                        r.addTab();
                                        r.setText(criteria.getCriteria());
                                        r.addBreak();
                                        paragraph.getCTP().getDomNode().insertBefore(r.getCTR().getDomNode(), r.getCTR().getDomNode());
                                    });
                                });
                            }
                            if (!text.equals("description") || !text.equals("resume")) {
                                r.setText(text.replace(k, v), 0);
                            }
                        }
                    });
                });
            });

            doc.enforceFillingFormsProtection("neo@1234", HashAlgorithm.sha512);

            docx = new File(System.getProperty("java.io.tmpdir") + "Termo de Entrega - " + report.getId_crm() + ".docx");
            doc.write(new FileOutputStream(docx));
            doc.close();

        } catch (IOException | InvalidFormatException e) {
            e.printStackTrace();
        }

        return docx;
    }

    private Map<String, String> reportToTokens(Report report2) {
        CalendarUtil util = new CalendarUtil();

        tokens.put("client", report.getClient());
        tokens.put("id_crm", report.getId_crm());
        tokens.put("homolog", util.calendarToString(report.getHomolog()));
        tokens.put("contact", report.getContact());
        tokens.put("user", report.getUser().getName());
        tokens.put("golive", util.calendarToString(report.getGolive()));
        tokens.put("description", "");
        tokens.put("resume", "");
        tokens.put("criteria", "");

        return tokens;
    }

}
1 resposta

Fala ai Renan, de boa ?

Imagino que o problema seja com o nome do arquivo, como você tá chamando sempre a mesma coisa, ele cria a primeira e reaproveita o mesmo nas demais vezes.

Acho que precisa dar um jeito de ser dinâmico esse nome.