sunxuewei пре 1 година
родитељ
комит
fae10cab42

+ 0 - 114
src/components/export2xlsx/index.ts

@@ -1,114 +0,0 @@
1
-import { Workbook } from "exceljs";
2
-
3
-export const exportExcel = (fileData: any[], headerName: any[], headerProp: string[], fileName: string) => {
4
-  const repeatingData: any = {};
5
-  const name: string[][] = [[], [], []];
6
-  const data = fileData.map((obj) => {
7
-    return headerProp.map((prop) => obj[prop]);
8
-  });
9
-
10
-  function computedCol(val: number) {
11
-    const header = [
12
-      "A",
13
-      "B",
14
-      "C",
15
-      "D",
16
-      "E",
17
-      "F",
18
-      "G",
19
-      "H",
20
-      "I",
21
-      "J",
22
-      "K",
23
-      "L",
24
-      "M",
25
-      "N",
26
-      "O",
27
-      "P",
28
-      "Q",
29
-      "R",
30
-      "S",
31
-      "T",
32
-      "U",
33
-      "V",
34
-      "W",
35
-      "X",
36
-      "Y",
37
-      "Z"
38
-    ];
39
-    const first = Math.floor(val / 26);
40
-    if (first > 0) {
41
-      return `${header[first - 1]}${header[val % 26]}`;
42
-    } else {
43
-      return `${header[val % 26]}`;
44
-    }
45
-  }
46
-  name[0].push("省份", "储备仓库", ...headerName.map((item) => item.matypename2), "数量总计(件)", "总价值(万元)");
47
-  name[1].push("省份", "储备仓库", ...headerName.map((item) => item.matypename3), "数量总计(件)", "总价值(万元)");
48
-  name[2].push("省份", "储备仓库", ...headerName.map((item) => item.matypename4), "数量总计(件)", "总价值(万元)");
49
-  name[0].forEach((item, index) => {
50
-    const itemIndex = name[0].findIndex((ite) => ite === item);
51
-    if (itemIndex !== index) {
52
-      repeatingData[item] = `${computedCol(index)}1:${computedCol(itemIndex)}1`;
53
-    }
54
-  });
55
-  const cols = data.map((item) => item[0]);
56
-  cols.forEach((item, index) => {
57
-    const itemIndex = cols.findIndex((ite) => ite === item);
58
-    if (itemIndex !== index) {
59
-      repeatingData[item] = `A${index + 4}:A${itemIndex + 4}`;
60
-    }
61
-  });
62
-  data.unshift(...name);
63
-
64
-  const workbook = new Workbook();
65
-  workbook.created = new Date();
66
-
67
-  const worksheet = workbook.addWorksheet(fileName, { views: [{ state: "frozen", xSplit: 2, ySplit: 3 }] });
68
-  worksheet.addRows(data);
69
-  for (let i = 0; i < data.length; i++) {
70
-    worksheet.getRow(i + 1).alignment = { vertical: "middle", horizontal: "center" };
71
-  }
72
-  for (let i = 0; i < data[0].length; i++) {
73
-    worksheet.getColumn(i + 1).width = 20;
74
-  }
75
-  for (let i = 0; i < 3; i++) {
76
-    worksheet.getRow(i + 1).font = { bold: true };
77
-    worksheet.getRow(i + 1).border = {
78
-      top: { style: "thick", color: { argb: "000000" } },
79
-      left: { style: "thick", color: { argb: "000000" } },
80
-      bottom: { style: "thick", color: { argb: "000000" } },
81
-      right: { style: "thick", color: { argb: "000000" } }
82
-    };
83
-  }
84
-  for (let i = 0; i < 2; i++) {
85
-    worksheet.getColumn(i + 1).font = { bold: true };
86
-    worksheet.getColumn(i + 1).border = {
87
-      top: { style: "thick", color: { argb: "000000" } },
88
-      left: { style: "thick", color: { argb: "000000" } },
89
-      bottom: { style: "thick", color: { argb: "000000" } },
90
-      right: { style: "thick", color: { argb: "000000" } }
91
-    };
92
-  }
93
-  worksheet.mergeCells("A1:A3");
94
-  worksheet.mergeCells("B1:B3");
95
-  worksheet.mergeCells("A4:B4");
96
-  worksheet.mergeCells(`${computedCol(data[0].length - 1)}1:${computedCol(data[0].length - 1)}3`);
97
-  worksheet.mergeCells(`${computedCol(data[0].length - 2)}1:${computedCol(data[0].length - 2)}3`);
98
-  Object.keys(repeatingData).forEach((key) => {
99
-    worksheet.mergeCells(repeatingData[key]);
100
-  });
101
-  workbook.xlsx.writeBuffer().then((res) => {
102
-    const blob = new Blob([res]);
103
-    const a = document.createElement("a");
104
-    a.style.display = "none";
105
-    a.download = decodeURI(`${fileName}.xlsx`);
106
-    try {
107
-      a.href = window.URL.createObjectURL(blob);
108
-    } catch (err) {
109
-      console.warn("暂无文件信息.请通知开发人员导入文件模版");
110
-    }
111
-    a.click();
112
-    a.remove();
113
-  });
114
-};

+ 160 - 0
src/utils/export2xlsx.ts

@@ -0,0 +1,160 @@
1
+import { Workbook } from "exceljs";
2
+// 合并行/列数量
3
+interface merges {
4
+  header?: number[] | number;
5
+  content?: number[] | number;
6
+}
7
+/**
8
+ * data: 表格内容
9
+ * tableheader: 表头内容
10
+ * fileName: 文件名
11
+ * merges: 合并数据
12
+ * fixedCol: 固定列数量
13
+ */
14
+interface exportPayload {
15
+  data: any[];
16
+  tableheader: string[][];
17
+  fileName: string;
18
+  merges?: merges;
19
+  fixedCol?: number;
20
+  sheetName?: string;
21
+}
22
+export const exportExcel = (payload: exportPayload) => {
23
+  const { data, tableheader, fileName, merges, fixedCol, sheetName } = payload;
24
+  const repeatingData: any = {};
25
+  function computedCol(val: number) {
26
+    const mergesCol = [
27
+      "A",
28
+      "B",
29
+      "C",
30
+      "D",
31
+      "E",
32
+      "F",
33
+      "G",
34
+      "H",
35
+      "I",
36
+      "J",
37
+      "K",
38
+      "L",
39
+      "M",
40
+      "N",
41
+      "O",
42
+      "P",
43
+      "Q",
44
+      "R",
45
+      "S",
46
+      "T",
47
+      "U",
48
+      "V",
49
+      "W",
50
+      "X",
51
+      "Y",
52
+      "Z"
53
+    ];
54
+    const first = Math.floor(val / 26);
55
+    if (first > 0) {
56
+      return `${mergesCol[first - 1]}${mergesCol[val % 26]}`;
57
+    } else {
58
+      return `${mergesCol[val % 26]}`;
59
+    }
60
+  }
61
+  function mergersTable(data: any[], mergeNum: number | number[], move: number) {
62
+    if (typeof mergeNum === "number") {
63
+      mergeRow(data, mergeNum);
64
+    } else {
65
+      if (mergeNum[0] > 0) mergeRow(data, mergeNum[0]);
66
+      if (mergeNum[1] > 0) mergeCol(data, mergeNum[1], move);
67
+    }
68
+  }
69
+  function mergeRow(data: any[], mergeNum: number) {
70
+    for (let i = 0; i < mergeNum; i++) {
71
+      let count = 0;
72
+      data[i].forEach((item: any, index: number) => {
73
+        if (index > 0 && data[i][index - 1] === item) {
74
+          if (repeatingData[`${item}${count}`]) {
75
+            repeatingData[`${item}${count}`][1] += 1;
76
+          } else {
77
+            count += 1;
78
+            repeatingData[`${item}${count}`] = [index - 1, index, i + 1, 0];
79
+          }
80
+        }
81
+      });
82
+    }
83
+  }
84
+  function mergeCol(data: any[], mergeNum: number, move: number) {
85
+    data.forEach((item: any[], index: number) => {
86
+      item.forEach((iten: any, indey: number) => {
87
+        if (index > 0 && indey < mergeNum) {
88
+          if (data[index - 1][indey] === iten) {
89
+            if (repeatingData[iten]) {
90
+              repeatingData[iten][1] += 1;
91
+            } else {
92
+              repeatingData[iten] = [index + move, index + move + 1, indey, 1];
93
+            }
94
+          }
95
+        }
96
+      });
97
+    });
98
+  }
99
+  if (merges) {
100
+    const { header, content } = merges;
101
+    if (header) mergersTable(tableheader, header, 0);
102
+    if (content) mergersTable(data, content, tableheader.length);
103
+  }
104
+  data.unshift(...tableheader);
105
+  const workbook = new Workbook();
106
+  workbook.created = new Date();
107
+  const worksheet = workbook.addWorksheet(sheetName ?? fileName, {
108
+    views: [{ state: "frozen", xSplit: fixedCol, ySplit: tableheader.length }]
109
+  });
110
+  worksheet.addRows(data);
111
+  for (let i = 0; i < data.length; i++) {
112
+    worksheet.getRow(i + 1).alignment = { vertical: "middle", horizontal: "center" };
113
+  }
114
+  for (let i = 0; i < data[0].length; i++) {
115
+    worksheet.getColumn(i + 1).width = 20;
116
+  }
117
+  for (let i = 0; i < tableheader.length; i++) {
118
+    worksheet.getRow(i + 1).font = { bold: true };
119
+    worksheet.getRow(i + 1).border = {
120
+      top: { style: "thick", color: { argb: "000000" } },
121
+      left: { style: "thick", color: { argb: "000000" } },
122
+      bottom: { style: "thick", color: { argb: "000000" } },
123
+      right: { style: "thick", color: { argb: "000000" } }
124
+    };
125
+  }
126
+  if (fixedCol) {
127
+    for (let i = 0; i < fixedCol; i++) {
128
+      worksheet.getColumn(i + 1).font = { bold: true };
129
+      worksheet.getColumn(i + 1).border = {
130
+        top: { style: "thick", color: { argb: "000000" } },
131
+        left: { style: "thick", color: { argb: "000000" } },
132
+        bottom: { style: "thick", color: { argb: "000000" } },
133
+        right: { style: "thick", color: { argb: "000000" } }
134
+      };
135
+    }
136
+  }
137
+  Object.keys(repeatingData).forEach((key) => {
138
+    const merge = repeatingData[key];
139
+    if (merge[3] === 0) {
140
+      // console.log(`${computedCol(merge[0])}${merge[2]}:${computedCol(merge[1])}${merge[2]}`, merge, key);
141
+      worksheet.mergeCells(`${computedCol(merge[0])}${merge[2]}:${computedCol(merge[1])}${merge[2]}`);
142
+    } else {
143
+      // console.log(`${computedCol(merge[2])}${merge[0]}:${computedCol(merge[2])}${merge[1]}`, merge, key);
144
+      worksheet.mergeCells(`${computedCol(merge[2])}${merge[0]}:${computedCol(merge[2])}${merge[1]}`);
145
+    }
146
+  });
147
+  workbook.xlsx.writeBuffer().then((res) => {
148
+    const blob = new Blob([res]);
149
+    const a = document.createElement("a");
150
+    a.style.display = "none";
151
+    a.download = decodeURI(`${fileName}.xlsx`);
152
+    try {
153
+      a.href = window.URL.createObjectURL(blob);
154
+    } catch (err) {
155
+      console.warn("暂无文件信息.请通知开发人员导入文件模版");
156
+    }
157
+    a.click();
158
+    a.remove();
159
+  });
160
+};

src/components/export2xlsx/index1.ts → src/utils/export2xlsx1.ts


+ 29 - 4
src/utils/util.ts

@@ -5,17 +5,42 @@ import CryptoJS from "crypto-js";
5 5
 export function handleTree(arr: any, id: string) {
6 6
   // 数组去重
7 7
   arr = arr.filter((item: any, index: number) => {
8
-    if (arr.findIndex((ite: any) => ite[id] === item[id]) === index) {
8
+    if (index > 0) {
9
+      if (arr.findIndex((ite: any) => ite[id] === item[id]) === index) {
10
+        return item;
11
+      } else {
12
+        if (item.dmUpname !== arr[index - 2].dmUpname) {
13
+          return item;
14
+        }
15
+      }
16
+    } else {
9 17
       return item;
10 18
     }
11 19
   });
12
-
13 20
   function turnTree(arr: any, id: string) {
14 21
     const tree = ref<any>([]);
15 22
     for (let i = 0; i < arr.length; i++) {
16
-      const isFirst = tree.value.findIndex((item: any) => arr[i][id].slice(0, 3) === item[id]);
23
+      const isFirst = tree.value.findIndex((item: any) => {
24
+        if (item.children.length > 0) {
25
+          return (
26
+            arr[i][id].slice(0, 3) === item[id] && item.children[item.children.length - 1].index === arr[i].index - 1
27
+          );
28
+        } else {
29
+          return arr[i][id].slice(0, 3) === item[id];
30
+        }
31
+      });
17 32
       if (isFirst !== -1) {
18
-        tree.value[isFirst].children.push(arr[i]);
33
+        if (tree.value[isFirst].children.length > 0) {
34
+          const isSecond = tree.value[isFirst].children.find((item: any) => item.index === arr[i].index - 1);
35
+          if (isSecond) {
36
+            tree.value[isFirst].children.push(arr[i]);
37
+          } else {
38
+            arr[i].children = [];
39
+            tree.value.push(arr[i]);
40
+          }
41
+        } else {
42
+          tree.value[isFirst].children.push(arr[i]);
43
+        }
19 44
       } else {
20 45
         arr[i].children = [];
21 46
         tree.value.push(arr[i]);

+ 48 - 7
src/views/dataStatistics/components/valueTable.vue

@@ -58,7 +58,14 @@
58 58
       </el-row>
59 59
     </el-form>
60 60
 
61
-    <el-button type="primary" :icon="Download" style="margin-bottom: 10px" @click="downloadExcel">导出</el-button>
61
+    <el-button
62
+      type="primary"
63
+      :disable="!tableLoading"
64
+      :icon="Download"
65
+      style="margin-bottom: 10px"
66
+      @click="downloadExcel"
67
+      >导出</el-button
68
+    >
62 69
     <el-table
63 70
       :data="tableData"
64 71
       stripe
@@ -90,7 +97,7 @@ import { ref } from "vue";
90 97
 
91 98
 import { deepClone, handleTree } from "@/utils/util";
92 99
 import { useGetters } from "@/hooks/storeHooks";
93
-import { exportExcel } from "@/components/export2xlsx";
100
+import { exportExcel } from "@/utils/export2xlsx";
94 101
 import {
95 102
   getDroughtResistantHeader,
96 103
   getDroughtResistantList,
@@ -164,15 +171,17 @@ getSysTreeDict({ type: 1, difference: 2, parentCodeList: props.payload }).then((
164 171
 getDroughtResistantHeader({ matype1: props.payload }).then((res: any) => {
165 172
   if (res.code === 0) {
166 173
     res.data
167
-      .map((item: any) => {
174
+      .map((item: any, index: number) => {
168 175
         const parent = {
169 176
           dmUpcode: item.matypecode2,
170
-          dmUpname: item.matypename2
177
+          dmUpname: item.matypename2,
178
+          index
171 179
         };
172 180
         const own = {
173 181
           dmUpcode: item.matypecode3,
174 182
           dmUpname: item.matypename3,
175
-          units: item.matypename4
183
+          units: item.matypename4,
184
+          index
176 185
         };
177 186
         return [parent, own];
178 187
       })
@@ -227,7 +236,7 @@ const getSpanArr = (data: any) => {
227 236
 const getList = () => {
228 237
   const data = {
229 238
     ...searchList.value,
230
-    dmUpcode0List: ["100", "200"]
239
+    dmUpcode0List: props.payload
231 240
   };
232 241
   tableLoading.value = true;
233 242
   getDroughtResistantList(data).then((res: any) => {
@@ -280,6 +289,38 @@ const arraySpanMethod = ({ column, rowIndex, columnIndex }: any) => {
280 289
 const downloadExcel = () => {
281 290
   const exportProp = deepClone(headerProps.value);
282 291
   exportProp.push("tolNum", "tolMoney");
283
-  exportExcel(tableData.value, exportHeaderName.value, exportProp, props.fileName);
292
+  const name: string[][] = [[], [], []];
293
+  name[0].push(
294
+    "省份",
295
+    "储备仓库",
296
+    ...exportHeaderName.value.map((item: any) => item.matypename2),
297
+    "数量总计(件)",
298
+    "总价值(万元)"
299
+  );
300
+  name[1].push(
301
+    "省份",
302
+    "储备仓库",
303
+    ...exportHeaderName.value.map((item: any) => item.matypename3),
304
+    "数量总计(件)",
305
+    "总价值(万元)"
306
+  );
307
+  name[2].push(
308
+    "省份",
309
+    "储备仓库",
310
+    ...exportHeaderName.value.map((item: any) => item.matypename4),
311
+    "数量总计(件)",
312
+    "总价值(万元)"
313
+  );
314
+  const data = tableData.value.map((obj: any) => {
315
+    return exportProp.map((prop: string) => obj[prop]);
316
+  });
317
+  const exportPayload = {
318
+    data: data,
319
+    tableheader: name,
320
+    fileName: props.fileName,
321
+    merges: { header: [1, name[0].length], content: [0, 2] },
322
+    fixedCol: 2
323
+  };
324
+  exportExcel(exportPayload);
284 325
 };
285 326
 </script>