Browse Source

run through ServiceProviderInfoRender.renderDocx

dengjia 1 month ago
parent
commit
71a3d53725

+ 4 - 0
.gitignore

@@ -31,3 +31,7 @@ build/
 
 ### VS Code ###
 .vscode/
+
+### Mac ###
+.DS_Store
+temp/

+ 1 - 3
easier-report-biz/pom.xml

@@ -96,8 +96,6 @@
             <version>5.4.1</version>
         </dependency>
 
-
-
         <dependency>
             <groupId>com.yaoyicloud</groupId>
             <artifactId>easier-report-api</artifactId>
@@ -154,4 +152,4 @@
         </dependency>
     </dependencies>
 
-</project>
+</project>

+ 27 - 9
easier-report-biz/src/main/java/com/yaoyicloud/render/AbstractRender.java

@@ -1,8 +1,14 @@
 package com.yaoyicloud.render;
 
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
+import java.util.Map;
 
-
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
 
 /**
  * 抽象渲染器
@@ -36,22 +42,32 @@ public abstract class AbstractRender {
 
     /**
      * Docx 渲染
+     *
      * @param info 数据
      * @param templateFileContent 模板内容
      * @return 本地文件目录
      * @throws IOException
      */
-    public final String renderDocx(String json /* 可能会改成对象 */, Byte[] templateFileContent, String outputPath) throws IOException {
-        // 用POI 渲染模板
-        // 保存到 cwd 目录,文件名使用 ServiceProviderInfo + uuid
-        // 注: 目前的实现假设:一个session对应一个cwd目录
+    public final String renderDocx(String jsonStr, byte[] templateFileContent, String outputPath) throws IOException {
+
+        // 注: 报告模板的模板变量按照json序列化的结果命名
+        ObjectMapper objectMapper = new ObjectMapper();
+        Map<String, Object> data = objectMapper.readValue(jsonStr, new TypeReference<Map<String, Object>>() {});
+
+        ConfigureBuilder builder = Configure.builder();
+        Configure config = builder.build();
+        XWPFTemplate template =
+            XWPFTemplate.compile(new ByteArrayInputStream(templateFileContent), config).render(data);
+        template.writeToFile(outputPath);
+        template.close();
 
-        this.docxResultPath = cwd + "/1.docx";
+        this.docxResultPath = outputPath;
         return this.docxResultPath;
     }
 
     /**
-     *  docx转换为pdf
+     * docx转换为pdf
+     *
      * @return 本地文件目录
      * @throws IOException
      */
@@ -65,7 +81,8 @@ public abstract class AbstractRender {
     }
 
     /**
-     *  docx转换为Html
+     * docx转换为Html
+     *
      * @return 本地文件目录
      * @throws IOException
      */
@@ -77,7 +94,8 @@ public abstract class AbstractRender {
     }
 
     /**
-     *  html转换为pdf
+     * html转换为pdf
+     *
      * @return 本地文件目录
      * @throws IOException
      */

+ 6 - 4
easier-report-biz/src/main/java/com/yaoyicloud/render/ServiceProviderInfo.java

@@ -1,5 +1,7 @@
 package com.yaoyicloud.render;
 
+import java.time.LocalDate;
+
 import lombok.Data;
 
 /**
@@ -7,8 +9,8 @@ import lombok.Data;
  */
 @Data
 public class ServiceProviderInfo {
-    private String name;          // ${服务商信息:服务商名称}
-    private String type;          // "基金会"
-    private String reportDate;    // ${服务商信息:报告日期}
-    private String tenantName;    // ${服务商信息:租户名称}
+    private final String name; // ${服务商信息:服务商名称}
+    private final String type; // "基金会"
+    private final LocalDate reportDate; // ${服务商信息:报告日期}
+    private final String tenantName; // ${服务商信息:租户名称}
 }

+ 51 - 7
easier-report-biz/src/main/java/com/yaoyicloud/render/ServiceProviderInfoRender.java

@@ -1,6 +1,18 @@
 package com.yaoyicloud.render;
 
 import java.io.IOException;
+import java.nio.file.Paths;
+import java.time.format.DateTimeFormatter;
+import java.util.UUID;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+
+import cn.hutool.core.date.DatePattern;
 
 /**
  * ServiceProviderInfo渲染器
@@ -14,21 +26,53 @@ public final class ServiceProviderInfoRender extends AbstractRender {
 
     /**
      * Docx 渲染
-     * 
+     *
      * @param info 数据
      * @param templateFileContent 模板内容
      * @return 本地文件目录
      * @throws IOException
      */
-    public String renderDocx(ServiceProviderInfo info, Byte[] templateFileContent) throws IOException {
-        // json序列化 info
+    public String renderDocx(ServiceProviderInfo info, byte[] templateFileContent) throws IOException {
+        ObjectMapper mapper = new ObjectMapper();
+        SimpleModule module = new SimpleModule();
+        module.addSerializer(new ServiceProviderInfoSerializer(ServiceProviderInfo.class));
+        mapper.registerModule(module);
+
+        String jsonStr = mapper.writeValueAsString(info);
+
         // 注: 报告模板的模板变量按照json序列化的结果命名
-        // 用POI 渲染模板
-        // 保存到 cwd 目录,文件名使用 ServiceProviderInfo + uuid
         // 注: 目前的实现假设:一个session对应一个cwd目录
-
-        this.docxResultPath = this.renderDocx(info.toString() /* Fake */, templateFileContent, cwd + "/1.docx");
+        this.docxResultPath =
+            this.renderDocx(jsonStr, templateFileContent, Paths.get(cwd,  UUID.randomUUID().toString() + ".docx").toString());
         return this.docxResultPath;
     }
 
+    /*
+     * 通过序列化和反序列化
+     * 1. 默认显示规则的数据转换
+     * 2. 避免TL处理模板面对复杂数据类型
+     */
+    public class ServiceProviderInfoSerializer extends StdSerializer<ServiceProviderInfo> {
+
+        public ServiceProviderInfoSerializer() {
+            this(null);
+        }
+
+        public ServiceProviderInfoSerializer(Class<ServiceProviderInfo> t) {
+            super(t);
+        }
+
+        @Override
+        public void serialize(ServiceProviderInfo value, JsonGenerator jgen, SerializerProvider provider)
+            throws IOException, JsonProcessingException {
+
+            jgen.writeStartObject();
+            jgen.writeStringField("name", value.getName() == null ? "-" : value.getName());
+            jgen.writeStringField("type", value.getType() == null ? "-" : value.getType());
+            jgen.writeStringField("reportDate", value.getReportDate() == null ? ""
+                : value.getReportDate().format(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN)));
+            jgen.writeStringField("tenantName", value.getTenantName());
+            jgen.writeEndObject();
+        }
+    }
 }

+ 28 - 0
easier-report-biz/src/test/java/com/yaoyicloud/render/test/TestServiceProviderInfoRender.java

@@ -0,0 +1,28 @@
+package com.yaoyicloud.render.test;
+
+import static org.junit.Assert.assertTrue;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.time.LocalDate;
+
+import org.junit.Test;
+
+import com.yaoyicloud.render.ServiceProviderInfo;
+import com.yaoyicloud.render.ServiceProviderInfoRender;
+
+public class TestServiceProviderInfoRender {
+
+    @Test
+    public void testRenderDocx() throws IOException {
+
+        byte[] content = Files.readAllBytes(
+            Paths.get(getClass().getClassLoader().getResource("docx/service_provider_info.docx").getFile()));
+        // String s = Paths.get("").toAbsolutePath().toString();
+        ServiceProviderInfoRender render = new ServiceProviderInfoRender("../temp/");
+        String retPath = render.renderDocx(new ServiceProviderInfo("宇宙公司", null, LocalDate.now(), "要易"), content);
+
+        assertTrue(retPath.length() > 0);
+    }
+
+}

+ 0 - 10
easier-report-biz/src/test/java/com/yaoyicloud/report/TestServiceProviderInfoRender.java

@@ -1,10 +0,0 @@
-package com.yaoyicloud.report;
-
-import org.junit.jupiter.api.Test;
-
-public class TestServiceProviderInfoRender {
-
-    @Test
-    public void testRenderDocx() {}
-
-}

BIN
easier-report-biz/src/test/resources/docx/service_provider_info.docx


+ 1 - 1
pom.xml

@@ -199,7 +199,7 @@
                     <target>${maven.compiler.target}</target>
                     <source>${maven.compiler.source}</source>
                     <encoding>UTF-8</encoding>
-                    <skip>true</skip>
+                    <skip>false</skip>
                 </configuration>
             </plugin>
             <!--打包关联最新 git commit 信息插件-->