Przeglądaj źródła

1.word新增动态创建简单table方法
2.excel内容读取测试案例

GouGengquan 9 miesięcy temu
rodzic
commit
6faf88c151

+ 69 - 0
biz-base/src/test/java/com/dayou/ExcelSimpleTests.java

@@ -1,9 +1,17 @@
 package com.dayou;
 
 import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelReader;
 import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.read.listener.PageReadListener;
+import com.alibaba.excel.read.metadata.ReadSheet;
 import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.fastjson2.JSON;
 import com.dayou.utils.EasyExcelUtil;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.ss.util.CellRangeAddressList;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
@@ -15,6 +23,7 @@ import java.io.InputStream;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 public class ExcelSimpleTests {
@@ -163,4 +172,64 @@ public class ExcelSimpleTests {
         }
     }
 
+    @Data
+    @NoArgsConstructor
+    public static class ReadExcel {
+
+        @ExcelProperty("id")
+        private Integer id;
+
+        @ExcelProperty("值1")
+        private Double value1;
+
+        @ExcelProperty("值2")
+        private Double value2;
+
+        @ExcelProperty("和")
+        private Double sum;
+    }
+
+    /**
+     * EasyExcel读取excel表数据内容
+     */
+    @Test
+    void testExcelRead(){
+        // 文件路径
+        String filePath = "E:\\test\\excel\\read.xlsx";
+        // 分页读取
+        // PageReadListener默认设置的分页读取是100条,但是可以通过构造函数设置
+        EasyExcel.read(filePath, ReadExcel.class, new PageReadListener<ReadExcel>(dataList -> {
+            System.out.println(dataList.size());
+        }, 1000)).sheet().doRead();
+    }
+
+    /**
+     * EasyExcel读取excel指定sheet表数据内容
+     * 可以是sheet下表也可以是sheet名字
+     */
+    @Test
+    void testExcelReadSheet(){
+        // 文件路径
+        String filePath = "E:\\test\\excel\\read.xlsx";
+        ExcelReader excelReader = EasyExcel.read(filePath).build();
+        // 指定sheet
+        ReadSheet readSheet = EasyExcel.readSheet("Sheet2").head(ReadExcel.class).registerReadListener(new PageReadListener<ReadExcel>(dataList -> {
+            System.out.println(dataList.size());
+        }, 1000)).build();
+
+        excelReader.read(readSheet);
+    }
+
+    /**
+     * EasyExcel读取excel同步返回所有内容
+     */
+    @Test
+    void testExcelReadAll(){
+        // 文件路径
+        String filePath = "E:\\test\\excel\\read.xlsx";
+        // 同步返回读取(酌情使用,数据量大可能会OOM)
+        List<ReadExcel> list = EasyExcel.read(filePath).head(ReadExcel.class).sheet().doReadSync();
+        System.out.println(list.size());
+    }
+
 }

+ 28 - 35
biz-base/src/test/java/com/dayou/WordSimpleTests.java

@@ -3,6 +3,7 @@ package com.dayou;
 import com.aspose.words.*;
 import com.aspose.words.net.System.Data.DataRow;
 import com.aspose.words.net.System.Data.DataTable;
+import com.dayou.annotation.WordTableColumn;
 import com.dayou.utils.AsposeWordUtil;
 import lombok.Builder;
 import lombok.Data;
@@ -15,6 +16,7 @@ import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -52,14 +54,20 @@ public class WordSimpleTests {
     @Data
     @Builder
     public static class SimpleWordTableData {
+
+        @WordTableColumn(name = "id")
         private String id;
 
+        @WordTableColumn(name = "担保人")
         private String pledger;
 
+        @WordTableColumn(name = "合同编号")
         private String contractNum;
 
+        @WordTableColumn(name = "担保方式")
         private String guarantyStyle;
 
+        @WordTableColumn(name = "金额")
         private String amount;
     }
 
@@ -177,41 +185,9 @@ public class WordSimpleTests {
         // 需要插入的word文件
         Document subDoc = new Document("E:\\test\\word\\5_main_output.doc");
 
-        // 是否纵向纸张
-/*        boolean isPortrait = true;
-
-        // Aspose的文档构造器
-        DocumentBuilder builder = new DocumentBuilder(mainDoc);
-            // 获取书签信息
-            BookmarkCollection bms = mainDoc.getRange().getBookmarks();
-            Bookmark bm = bms.get(bookmark);
-            // 判断书签是否为null
-            if (bm != null) {
-
-                // 移动光标到书签的位置
-                builder.moveToBookmark(bookmark, true, false);
-                // 在文档中插入段落分隔符(会在书签位置换行)
-                builder.writeln();
-                Node insertAfterNode = builder.getCurrentParagraph().getPreviousSibling();
-                // 在分隔符插入word
-                AsposeWordUtil.insertDocumentAfterNode(insertAfterNode, mainDoc, subDoc);
-            }
-            //设置纸张大小
-            builder.getPageSetup().setPaperSize(PaperSize.A4);
-
-            // 判断是横向还是纵向纸张
-            if (isPortrait) {
-                //纵向
-                builder.getPageSetup().setOrientation(Orientation.PORTRAIT);
-                builder.insertBreak(BreakType.SECTION_BREAK_NEW_PAGE);
-            } else {
-                //横向
-                builder.getPageSetup().setOrientation(Orientation.LANDSCAPE);
-                builder.insertBreak(BreakType.SECTION_BREAK_NEW_PAGE);
-            }*/
-            mainDoc = AsposeWordUtil.insertDocumentAfterBookMark(mainDoc, subDoc, bookmark, false);
-            // 保存文件
-            mainDoc.save("E:\\test\\word\\2_framework_output.doc");
+        mainDoc = AsposeWordUtil.insertDocumentAfterBookMark(mainDoc, subDoc, bookmark, false);
+        // 保存文件
+        mainDoc.save("E:\\test\\word\\2_framework_output.doc");
     }
 
     /**
@@ -235,6 +211,23 @@ public class WordSimpleTests {
     }
 
     /**
+     * 测试在指定书签处创建table
+     * 这里测试的是从无到有的创建一个table,和值填充到模板中已存在的table不一样
+     * @throws Exception
+     */
+    @Test
+    void testCreateTable() throws Exception {
+        Document doc = new Document("E:\\test\\word\\createTable.doc");
+        // 设置信息
+        SimpleWordTableData data1 = SimpleWordTableData.builder().id("1").pledger("张三").contractNum("合同阿巴阿巴阿巴阿巴").guarantyStyle("担保").amount("1000万").build();
+        SimpleWordTableData data2 = SimpleWordTableData.builder().id("2").pledger("李四").contractNum("合同呜呼呜呼呜呼芜湖").guarantyStyle("抵押").amount("200028万").build();
+        List<SimpleWordTableData> contractList = Arrays.asList(data1,data2);
+
+        AsposeWordUtil.createTable(doc, SimpleWordTableData.class, contractList, "table");
+        doc.save("E:\\test\\word\\createTable.doc");
+    }
+
+    /**
      * (该方法实测不是很好用,建议先在模板设置好页眉页脚页码等相关设置)
      * 设置Word页眉
      * 不能先设置页脚,需要先设置页码后才能设置页脚内容

+ 22 - 0
common/src/main/java/com/dayou/annotation/WordTableColumn.java

@@ -0,0 +1,22 @@
+package com.dayou.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface WordTableColumn {
+
+    /**
+     * 列名
+     */
+    String name() default "";
+
+    /**
+     * 是否创建列
+     */
+    boolean isCreate() default true;
+
+}

+ 69 - 1
common/src/main/java/com/dayou/utils/AsposeWordUtil.java

@@ -1,8 +1,10 @@
 package com.dayou.utils;
 
 import com.aspose.words.*;
+import com.aspose.words.Font;
 import com.aspose.words.net.System.Data.DataRow;
 import com.aspose.words.net.System.Data.DataTable;
+import com.dayou.annotation.WordTableColumn;
 
 import java.awt.*;
 import java.awt.geom.AffineTransform;
@@ -15,6 +17,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -111,7 +114,7 @@ public class AsposeWordUtil {
 
                 // 判断数据是否是集合
                 if (value instanceof List) {
-                    //有集合调用方法创建Word Table写入表数据
+                    //有集合调用方法向设置了值填充(域替换)的Word Table写入表数据
                     DataTable dataTable = fillListData((List) value, key);
                     doc.getMailMerge().executeWithRegions(dataTable);
                 }
@@ -322,4 +325,69 @@ public class AsposeWordUtil {
         }
         return doc;
     }
+
+    public static Document createTable(Document doc, Class<?> clazz, List<?> list, String bookmark) throws Exception {
+        // Aspose文档构造器
+        DocumentBuilder builder = new DocumentBuilder(doc);
+        builder.moveToBookmark(bookmark, true, false);
+        // 创建table
+        Table table = builder.startTable();
+        // 获取所有字段
+        Field[] fields = clazz.getDeclaredFields();
+
+        // 创建表头
+        for (Field field : fields) {
+            // 检查字段是否有自定义注解
+            if (field.isAnnotationPresent(WordTableColumn.class)) {
+                // 获取注解实例
+                WordTableColumn annotation = field.getAnnotation(WordTableColumn.class);
+                // 检查isCreate属性是否为true
+                if (annotation.isCreate()) {
+                    builder.insertCell();
+                    // 字体宋体
+                    builder.getFont().setName("华文细黑");
+                    // 是否加粗
+                    builder.getFont().setBold(true);
+                    // 字号(9是小五字号)
+                    builder.getFont().setSize(9);
+                    builder.write(annotation.name());
+                }
+            }
+        }
+        // 结束行
+        builder.endRow();
+
+        // 创建内容行
+        for (Object obj : list){
+            for (Field field : fields) {
+                // 检查字段是否有自定义注解
+                if (field.isAnnotationPresent(WordTableColumn.class)) {
+                    // 获取注解实例
+                    WordTableColumn annotation = field.getAnnotation(WordTableColumn.class);
+                    // 检查isCreate属性是否为true
+                    if (annotation.isCreate()) {
+                        field.setAccessible(true);
+                        builder.insertCell();
+                        // 字体宋体
+                        builder.getFont().setName("华文细黑");
+                        // 是否加粗
+                        builder.getFont().setBold(false);
+                        // 字号(9是小五字号)
+                        builder.getFont().setSize(9);
+                        builder.write((String) field.get(obj));
+                    }
+                }
+            }
+            // 结束行
+            builder.endRow();
+        }
+
+        // 自动调整列宽
+        table.autoFit(AutoFitBehavior.AUTO_FIT_TO_WINDOW);
+        // 设置居中
+        table.setAlignment(CellVerticalAlignment.CENTER);
+        builder.endTable();
+
+        return doc;
+    }
 }