- Создатель Васильев Антон, отредактировано 31.01.2024
Автоматическое формирование файла c помощью Java
Структура шаблона
- {folder name} - название папки
- {file name}.java - java-код
- {file name}.sql - sql-код
- template.xml - описание конфигурации
Описание инструмента
Написание кода
Создание java-кода
Пример
Развернуть исходный код
import org.apache.commons.io.FileUtils; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.util.Map; import java.io.IOException; import org.springframework.beans.factory.annotation.Autowired; import ru.intertrust.cm.core.business.api.CollectionsService; import ru.intertrust.cm.core.business.api.dto.Id; import ru.intertrust.cm.core.business.api.dto.IdentifiableObject; import ru.intertrust.cm.core.business.api.dto.IdentifiableObjectCollection; import ru.intertrust.cm.core.business.impl.report.ReportBuilderFormats; import ru.intertrust.cm.core.config.model.ReportMetadataConfig; import ru.intertrust.cm.core.model.ReportServiceException; import ru.intertrust.cm.core.service.api.ReportGenerator; import ru.intertrust.cm.core.business.api.dto.DomainObject; import com.healthmarketscience.rmiio.RemoteInputStreamClient; import net.sf.jasperreports.engine.JRDefaultScriptlet; import ru.intertrust.cm.core.business.api.AttachmentService; import ru.intertrust.cmj.af.utils.BeansUtils; import java.io.InputStreamReader; import java.io.Reader; import ru.intertrust.cm_sochi.business.activator.model.constant.AGdataMessageConst; import ru.intertrust.cm_sochi.shared.fixtures.MockAttachmentService; import ru.intertrust.cm.core.business.impl.LocalAttachmentServiceImpl; import org.docx4j.convert.in.xhtml.ImportXHTMLProperties; import org.docx4j.convert.in.xhtml.XHTMLImporterImpl; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4j.openpackaging.parts.WordprocessingML.NumberingDefinitionsPart; import org.docx4j.wml.RFonts; import org.docx4j.wml.RPr; import org.docx4j.jaxb.Context; import org.docx4j.openpackaging.exceptions.Docx4JException; public class PrintFormRequestAccessIS implements ReportGenerator { String sqlFileName = "sql.sql"; @Autowired private CollectionsService collectionsService; @Override public InputStream generate(ReportMetadataConfig reportMetadata, File templateFolder, Map<String, Object> parameters) { try { File newHtmlFile = File.createTempFile("new", ".docx"); String htmlString = ""; IdentifiableObjectCollection collection = getCollection(parameters, templateFolder); for (IdentifiableObject identifiableObject : collection) { htmlString = getHtmlReport(identifiableObject); break; } WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage(); NumberingDefinitionsPart ndp = new NumberingDefinitionsPart(); wordMLPackage.getMainDocumentPart().addTargetPart(ndp); ndp.unmarshalDefaultNumbering(); XHTMLImporterImpl xhtmlImporter = new XHTMLImporterImpl(wordMLPackage); String baseURLNotUsed = ""; wordMLPackage.getMainDocumentPart().getContent().addAll(xhtmlImporter.convert(htmlString, baseURLNotUsed)); setDefaultFont(wordMLPackage, "Times New Roman"); wordMLPackage.save(newHtmlFile); return new FileInputStream(newHtmlFile); } catch (Exception ex) { throw new ReportServiceException("Error generate report", ex); } } public void setDefaultFont(WordprocessingMLPackage wmlPackage, String fontName) throws Docx4JException { RFonts rfonts = Context.getWmlObjectFactory().createRFonts(); rfonts.setAsciiTheme(null); rfonts.setAscii(fontName); rfonts.setHAnsi(fontName); rfonts.setEastAsia(fontName); RPr rpr = wmlPackage.getMainDocumentPart().getPropertyResolver().getDocumentDefaultRPr(); rpr.setRFonts(rfonts); } @Override public String getFormat(){ return ReportBuilderFormats.DOCX_FORMAT.getFormat(); } private String getHtmlReport(IdentifiableObject identifiableObject){ Id docId = identifiableObject.getId(); String htmlImage = getAttachmentText(docId); String table = "<table>"+ "</table>"; String style = "<style>"+ "</style>"; if ((htmlImage.indexOf("<style>")>=0)&& (htmlImage.indexOf("</style>"))>=0){ style = htmlImage.substring(htmlImage.indexOf("<style>"), htmlImage.indexOf("</style>")) + "</style>"; } if ((htmlImage.indexOf("<table")>=0)&& (htmlImage.lastIndexOf("</table>"))>=0){ table = htmlImage.substring(htmlImage.indexOf("<table"), htmlImage.lastIndexOf("</table>")) + "</table>"; while (table.indexOf(" style=\"width") > 0) { int first = table.indexOf(" style=\"width"); String str1 = table.substring(first); int second = str1.indexOf(">"); String str = table.substring(first, first + second); table = table.replace(str,""); } } table = table.replaceAll("<a href>", "<a>"); /*String str2 = table; int first1 = -1; while(str2.indexOf("<CAPITAL") >= 0) { str2 = str2.substring(str2.indexOf("<CAPITAL")); if (str2.indexOf("<CAPITAL") >= 0 && str2.indexOf("</CAPITAL>") < 0 && str2.indexOf(">") >= 0) { String str3 = str2.substring(str2.indexOf("<CAPITAL"), str2.indexOf(">")); first1 = str2.indexOf(">") + (">").length(); if(!str3.endsWith("/")) { String str4 = str3 + ">"; table = table.replace(str4, str4.replace(">","/>")); } } else if (str2.indexOf("<CAPITAL") >= 0 && str2.indexOf("</CAPITAL>") >= 0 && str2.indexOf("<CAPITAL") != str2.lastIndexOf("<CAPITAL") && str2.indexOf("</CAPITAL>") == str2.lastIndexOf("</CAPITAL>")) { String str3 = str2.substring(str2.indexOf("<CAPITAL"), str2.indexOf("</CAPITAL>")) + "</CAPITAL>"; first1 = str2.indexOf("</CAPITAL>") + ("</CAPITAL>").length(); while(str3.indexOf("<CAPITAL") >=0 && str3.indexOf(">")>=0) { if(!(str3.indexOf("<CAPITAL") == str3.lastIndexOf("<CAPITAL") && str3.indexOf("</CAPITAL>") == str3.lastIndexOf("</CAPITAL>") )) { String str4 = str3.substring(str3.indexOf("<CAPITAL"), str3.indexOf(">")); if(!str4.endsWith("/")) { String str5 = str4 + ">"; table = table.replace(str5, str5.replace(">","/>")); } int first = str3.indexOf(">"); str3 = str3.substring(first+1); } } } else { first1 = str2.indexOf("</CAPITAL>") + ("</CAPITAL>").length(); } str2 = str2.substring(first1); }*/ String htmlString = "<!DOCTYPE html>" + "<html>" + "<head>" + "<meta charset=\"utf-8\"/>" + "<title>Печатная форма</title>" + "<style>" + "html, body { " + "margin-left: 15%;" + "margin-right: 15%;" + "width: 100%;" + "font-family: 'Times New Roman', Times, serif;" + "}" + ".t1{border:none;border-collapse:collapse;empty-cells: show;}" + ".t2{padding: 2px 5px;border:1px solid}" + "table.t2{border:none}</style>" + style + "<style>" + "table.t11{border:none; width:60%}" + ".t21{padding: 2px 5px;border:none}" + "html, body { " + "font-size: 12pt;" + "}" + "td.t3{width:308px}" + "</style>" + "</head>" + "<body>" +"<table class=\"t3\" align=\"justify\">" + "<tr class=\"t3\">" + "<td width=\"350px\" align=\"left\">" + identifiableObject.getString("request_date") + " № " + identifiableObject.getString("request_number") + "</td>" + "<td class=\"t3\" width=\"308px\" align=\"left\"><b>" + identifiableObject.getString("department_head_position") + "</b></td>" + "</tr>" + "<tr class=\"t3\">" + "<td class=\"t3\" width=\"308px\" align=\"left\"></td>" + "<td class=\"t3\" width=\"308px\" align=\"left\"><b>" + identifiableObject.getString("resource_owner_organization") + "</b></td>" + "</tr>" + "<tr class=\"t3\">" + "<td class=\"t3\" width=\"308px\" align=\"left\"></td>" + "<td class=\"t3\" width=\"308px\" align=\"left\"><b>" + identifiableObject.getString("resource_owner_department_head") + "</b></td>" + "</tr>" + "</table>" + "<p align=\"center\"><b>" + identifiableObject.getString("service_request_type") + "</b></p>" + "<p align=\"center\"><b>" + identifiableObject.getString("IS_environment") + "</b></p>" + "<p/>" + "<p>Прошу предоставить/отозвать права доступа:</p>" + "<p/>" + "<div>" + "<table class=\"t3\" align=\"justify\">" + "<tr class=\"t3\"><td class=\"t3\">ФИО работника по заявке: </td><td class=\"t3\">" + identifiableObject.getString("worker") + "</td></tr>" + "<tr class=\"t3\"><td class=\"t3\">ГО/Филиал: </td><td class=\"t3\">" + identifiableObject.getString("branch") + "</td></tr>" + "<tr class=\"t3\"><td class=\"t3\">Подразделение: </td><td class=\"t3\">" + identifiableObject.getString("subdivision") + "</td></tr>"; if (identifiableObject.getString("isServMass").equals("0")){ htmlString = htmlString + "<tr class=\"t3\"><td class=\"t3\">Должность работника: </td><td class=\"t3\">" + identifiableObject.getString("worker_position") + "</td></tr>" + "<tr class=\"t3\"><td class=\"t3\">Табельный номер: </td><td class=\"t3\">" + identifiableObject.getString("personnel_number") + "</td></tr>" + "<tr class=\"t3\"><td class=\"t3\">Телефон: </td><td class=\"t3\">" + identifiableObject.getString("phone") + "</td></tr>"; } htmlString = htmlString + "<tr class=\"t3\"><td class=\"t3\">Комментарий: </td><td class=\"t3\">" + identifiableObject.getString("comment") + "</td></tr>" + "</table>" + "</div>" + "<p/>" + "<p align=\"left\">к следующим информационным ресурсам " + identifiableObject.getString("initiator_organization") + ":</p>" + "<table class=\"t1\" align=\"justify\" bordercolor=\"black\" cols=\"4\">" + "<tr class=\"t2\">" + "<td class=\"t2\" height=\"50px\" align=\"center\"><b>Наименование информационного ресурса</b>" + "</td>" + "<td class=\"t2\" height=\"50px\" align=\"center\"><b>Наименование должности распорядителя ресурса</b>" + "</td>" + "<td class=\"t2\" height=\"50px\" align=\"center\"><b>ФИО распорядителя ресурса</b>" + "</td>" + "<td class=\"t2\" width=\"180px\" height=\"50px\" align=\"center\"><b>Виза</b>" + "</td>" + "</tr>" + "<tr class=\"t2\">" + "<td class=\"t2\" height=\"50px\" align=\"center\">" + identifiableObject.getString("information_system") + "</td>" + "<td class=\"t2\" height=\"50px\" align=\"center\">" + identifiableObject.getString("resource_owner_position") + "</td>" + "<td class=\"t2\" height=\"50px\" align=\"center\">" + identifiableObject.getString("resource_owner_fullname") + "</td>" + "<td class=\"t2\" width=\"180px\" height=\"50px\" align=\"center\">" + identifiableObject.getString("resource_owner_visa") + "\n" + identifiableObject.getString("resource_owner_visa_date") + "</td>" + "</tr>" + "</table>" + "<p/>" + "<p align=\"left\">Дополнительные данные по заявке:</p>" + table.replaceAll("<br>","<br/>") + "<br/>" + "<table class=\"t11\" align=\"justify\" bordercolor=\"black\" cols=\"3\">" + "<tr class=\"t21\">" + "<td class=\"t21\" width=\"308px\" height=\"50px\" align=\"center\">" + identifiableObject.getString("subdivision_head_position") + "</td>" + "<td class=\"t21\" width=\"308px\" height=\"50px\" align=\"center\">" + identifiableObject.getString("subdivision_head_visa") + " " + identifiableObject.getString("subdivision_head_visa_date") + "</td>" + "<td class=\"t21\" width=\"308px\" height=\"50px\" align=\"center\">" + identifiableObject.getString("subdivision_head_fullname") + "</td>" + "</tr>" + "<tr class=\"t21\">" + "<td class=\"t21\" width=\"308px\" height=\"50px\" align=\"center\" valign=\"bottom\">____________________<br/>(должность руководителя)</td>" + "<td class=\"t21\" width=\"308px\" height=\"50px\" align=\"center\" valign=\"bottom\">____________________<br/>(виза)</td>" + "<td class=\"t21\" width=\"308px\" height=\"50px\" align=\"center\" valign=\"bottom\">____________________<br/>(Фамилия И.О.)</td>" + "</tr>" + "</table>" + "<p/>" + "Данные об Инициаторе заявки:<br/>" + identifiableObject.getString("initiator_fullname") + "<br/>" + identifiableObject.getString("initiator_position") + "<br/>" + identifiableObject.getString("initiator_subdivision") + "<br/>" + identifiableObject.getString("initiator_phone_number") + "</body>" + "</html>"; if (htmlString.contains("<CAPITAL>")) { String str2 = htmlString; int first1 = -1; while(str2.indexOf("<CAPITAL") >= 0) { str2 = str2.substring(str2.indexOf("<CAPITAL")); if (str2.indexOf("<CAPITAL") >= 0 && str2.indexOf("</CAPITAL>") < 0 && str2.indexOf(">") >= 0) { String str3 = str2.substring(str2.indexOf("<CAPITAL"), str2.indexOf(">")); first1 = str2.indexOf(">") + (">").length(); if(!str3.endsWith("/")) { String str4 = str3 + ">"; htmlString = htmlString.replace(str4, str4.replace(">","/>")); } } else if (str2.indexOf("<CAPITAL") >= 0 && str2.indexOf("</CAPITAL>") >= 0 && str2.indexOf("<CAPITAL") != str2.lastIndexOf("<CAPITAL") && str2.indexOf("</CAPITAL>") == str2.lastIndexOf("</CAPITAL>")) { String str3 = str2.substring(str2.indexOf("<CAPITAL"), str2.indexOf("</CAPITAL>")) + "</CAPITAL>"; first1 = str2.indexOf("</CAPITAL>") + ("</CAPITAL>").length(); while(str3.indexOf("<CAPITAL") >=0 && str3.indexOf(">")>=0) { if(!(str3.indexOf("<CAPITAL") == str3.lastIndexOf("<CAPITAL") && str3.indexOf("</CAPITAL>") == str3.lastIndexOf("</CAPITAL>") )) { String str4 = str3.substring(str3.indexOf("<CAPITAL"), str3.indexOf(">")); if(!str4.endsWith("/")) { String str5 = str4 + ">"; htmlString = htmlString.replace(str5, str5.replace(">","/>")); } int first = str3.indexOf(">"); str3 = str3.substring(first+1); } } } else { first1 = str2.indexOf("</CAPITAL>") + ("</CAPITAL>").length(); } str2 = str2.substring(first1); } } else htmlString = htmlString.replace("CAPITAL",""); return htmlString; } public IdentifiableObjectCollection getCollection(Map<String, Object> parameters, File templateFolder){ String query = ""; String request_id = parameters.get("request_id").toString(); request_id = request_id.substring(request_id.indexOf("id=") + 3, request_id.length() - 1); try { File sqlFile = new File(templateFolder, sqlFileName); query = queryString(sqlFile, "$request_id", request_id); } catch (Exception ex) { throw new ReportServiceException("Error generate report1", ex); } return collectionsService.findCollectionByQuery(query); } private AttachmentService attachmentService = BeansUtils.getTypedBean(AttachmentService.class); public String getAttachmentText(Object objDocId){ StringBuffer buffer = new StringBuffer(); if (objDocId == null) { return buffer.toString(); } Id docId = (Id) objDocId; for(DomainObject o : attachmentService.findAttachmentDomainObjectsFor(docId, "F_AddFiles_Rkk")){ if(buffer.length() > 0){ buffer.append("\n"); } try{ buffer.append(convertToString(RemoteInputStreamClient.wrap(attachmentService.loadAttachment(o.getId())))); } catch (Exception e){ throw new RuntimeException(); } } return buffer.toString(); } private String convertToString(InputStream inputStream) { final int bufferSize = 1024; final char[] buffer = new char[bufferSize]; final StringBuilder out = new StringBuilder(); try ( Reader in = new InputStreamReader(inputStream, "UTF-8")) { for (; ; ) { int rsz = in.read(buffer, 0, buffer.length); if (rsz < 0) break; out.append(buffer, 0, rsz); } return out.toString(); } catch (Exception e) { e.printStackTrace(); } return null; } private String queryString (File sqlFile, String old, String newv) { String query = ""; try { query = FileUtils.readFileToString(sqlFile); query = query.replace(old, newv); } catch (IOException e) { e.printStackTrace(); } return query; } }
Описание шаблона
Создать файла tempate.xml, в котором:
template.xml
<?xml version="1.1" encoding="UTF-8" standalone="yes"?> <ReportMetadataConfig name="{name}" description="{description}" reportGeneratorClass="{file name.java}"/>