Browse Source

导出table

lining 6 years ago
parent
commit
3b6e24e75a

+ 45 - 0
src/main/java/com/common/workflow/service/dto/TableDetailData.java

@@ -0,0 +1,45 @@
+package com.common.workflow.service.dto;
+
+import com.deepoove.poi.data.RowRenderData;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TableDetailData {
+    private List<RowRenderData> dataList = new ArrayList<>();
+    private int startRow = 0;
+    private int needDelRow = 0;
+    private int reverseRow = 0;
+
+    public List<RowRenderData> getDataList() {
+        return dataList;
+    }
+
+    public void setDataList(List<RowRenderData> dataList) {
+        this.dataList = dataList;
+    }
+
+    public int getStartRow() {
+        return startRow;
+    }
+
+    public void setStartRow(int startRow) {
+        this.startRow = startRow;
+    }
+
+    public int getNeedDelRow() {
+        return needDelRow;
+    }
+
+    public void setNeedDelRow(int needDelRow) {
+        this.needDelRow = needDelRow;
+    }
+
+    public int getReverseRow() {
+        return reverseRow;
+    }
+
+    public void setReverseRow(int reverseRow) {
+        this.reverseRow = reverseRow;
+    }
+}

+ 72 - 0
src/main/java/com/common/workflow/service/util/DetailTablePolicy.java

@@ -0,0 +1,72 @@
+package com.common.workflow.service.util;
+
+import com.common.workflow.service.dto.TableDetailData;
+import com.deepoove.poi.data.RowRenderData;
+import com.deepoove.poi.data.TextRenderData;
+import com.deepoove.poi.policy.DynamicTableRenderPolicy;
+import com.deepoove.poi.policy.MiniTableRenderPolicy;
+import com.deepoove.poi.util.TableTools;
+import org.apache.poi.xwpf.usermodel.XWPFTable;
+import org.apache.poi.xwpf.usermodel.XWPFTableRow;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+public class DetailTablePolicy extends DynamicTableRenderPolicy {
+
+    @Override
+    public void render(XWPFTable table, Object data) {
+        if (null == data) return;
+        LinkedHashMap<String, Object> detailData = (LinkedHashMap) data;
+
+        List<RowRenderData> datas = new ArrayList<>();
+        List<HashMap<String, Object>> dataMapList = (List<HashMap<String, Object>>) detailData.get("dataList");
+        List<String> colsList = (List<String>) detailData.get("cols");
+        List<String> mergeList = (List<String>) detailData.get("merge");
+        for (HashMap<String, Object> dataMap : dataMapList) {
+            List<TextRenderData> rowdataList = new ArrayList<>();
+            if (null != colsList && colsList.size() > 0) {
+                for (String key : colsList ) {
+                    rowdataList.add(new TextRenderData(dataMap.get(key).toString()));
+                }
+            } else {
+                dataMap.forEach((k,v) -> {
+                    rowdataList.add(new TextRenderData(v.toString()));
+                });
+            }
+            RowRenderData rowData = new RowRenderData(rowdataList);
+            datas.add(rowData);
+        }
+        // 货品填充数据所在行数
+        int goodsStartRow = Integer.parseInt(detailData.get("startRow").toString()); //detailData.getStartRow();
+        int needDelRowNum = Integer.parseInt(detailData.get("needDelRow").toString()); //detailData.getNeedDelRow();
+        int colsNum = Integer.parseInt(detailData.get("colsNum").toString());
+
+
+        if (null != datas) {
+            for (int i = 0; i < needDelRowNum; i++) {
+                table.removeRow(goodsStartRow);
+            }
+
+            for (int i = 0; i < datas.size(); i++) {
+                XWPFTableRow insertNewTableRow = table.insertNewTableRow(goodsStartRow);
+                int tmpNum = colsNum;
+                if (tmpNum <= 0) {
+                    tmpNum = datas.get(i).size();
+                }
+                for (int j = 0; j < tmpNum; j++) {
+                    insertNewTableRow.createCell();
+                }
+                for (String merge : mergeList) {
+                    // 合并单元格
+                    TableTools.mergeCellsHorizonal(table, goodsStartRow, Integer.parseInt(merge.split(",")[0]), Integer.parseInt(merge.split(",")[1]));
+
+                }
+                // 渲染单行货品明细数据
+                MiniTableRenderPolicy.renderRow(table, goodsStartRow, datas.get(i));
+            }
+        }
+    }
+}

+ 18 - 2
src/main/java/com/common/workflow/service/util/WordTemplate.java

@@ -1,10 +1,13 @@
 package com.common.workflow.service.util;
 
 import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
 
 import java.io.File;
 import java.lang.reflect.Field;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -23,8 +26,21 @@ public class WordTemplate {
             file.delete(); //清除历史文件
         }
         fullFileName = FileUtils.downLoadFromUrl(templateUrl, fileName, FileUtils.getExcelTemplatePath());
-
-        XWPFTemplate template = XWPFTemplate.compile(fullFileName).render(datas);
+        Object tableCommentObj = datas.get("TableComment");
+        List<String> tableComment = new ArrayList<>();
+        Configure.ConfigureBuilder builder = Configure.newBuilder();
+        if(null != tableCommentObj) {
+            tableComment = (List<String>) datas.get("TableComment");
+            for (String tableName : tableComment) {
+                builder = builder.customPolicy(tableName, new DetailTablePolicy());
+            }
+        }
+        XWPFTemplate template = null;
+        if(null != tableCommentObj && tableComment.size() > 0) {
+            template = XWPFTemplate.compile(fullFileName, builder.build()).render(datas);
+        } else {
+            template = XWPFTemplate.compile(fullFileName).render(datas);
+        }
         return template;
     }