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;
}
}