chenrui  2 жил өмнө
parent
commit
24e1f150da

+ 27 - 0
package-lock.json

@@ -26,6 +26,7 @@
         "path": "0.12.7",
         "path-to-regexp": "6.2.0",
         "pinia": "^2.0.16",
+        "script-loader": "^0.7.2",
         "tinymce": "4.9.11",
         "vue": "^3.2.37",
         "vue-router": "4.0.14",
@@ -14002,6 +14003,11 @@
         "node": ">= 0.8"
       }
     },
+    "node_modules/raw-loader": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz",
+      "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q=="
+    },
     "node_modules/read-pkg": {
       "version": "5.2.0",
       "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
@@ -14562,6 +14568,14 @@
         "url": "https://opencollective.com/webpack"
       }
     },
+    "node_modules/script-loader": {
+      "version": "0.7.2",
+      "resolved": "https://registry.npmjs.org/script-loader/-/script-loader-0.7.2.tgz",
+      "integrity": "sha512-UMNLEvgOAQuzK8ji8qIscM3GIrRCWN6MmMXGD4SD5l6cSycgGsCo0tX5xRnfQcoghqct0tjHjcykgI1PyBE2aA==",
+      "dependencies": {
+        "raw-loader": "~0.5.1"
+      }
+    },
     "node_modules/select-hose": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
@@ -31013,6 +31027,11 @@
         "unpipe": "1.0.0"
       }
     },
+    "raw-loader": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz",
+      "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q=="
+    },
     "read-pkg": {
       "version": "5.2.0",
       "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
@@ -31439,6 +31458,14 @@
         "ajv-keywords": "^3.5.2"
       }
     },
+    "script-loader": {
+      "version": "0.7.2",
+      "resolved": "https://registry.npmjs.org/script-loader/-/script-loader-0.7.2.tgz",
+      "integrity": "sha512-UMNLEvgOAQuzK8ji8qIscM3GIrRCWN6MmMXGD4SD5l6cSycgGsCo0tX5xRnfQcoghqct0tjHjcykgI1PyBE2aA==",
+      "requires": {
+        "raw-loader": "~0.5.1"
+      }
+    },
     "select-hose": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",

+ 2 - 1
package.json

@@ -38,8 +38,9 @@
     "path": "0.12.7",
     "path-to-regexp": "6.2.0",
     "pinia": "^2.0.16",
+    "script-loader": "^0.7.2",
     "tinymce": "4.9.11",
-    "vue": "^3.2.37",
+    "vue": "^3.2.26",
     "vue-router": "4.0.14",
     "vue3-seamless-scroll": "^2.0.1",
     "xlsx": "^0.18.5"

+ 230 - 0
src/utils/Export2Excel.ts

@@ -0,0 +1,230 @@
+import { saveAs } from "file-saver";
+import * as XLSX from "xlsx";
+
+function generateArray(table) {
+  var out = [];
+  var rows = table.querySelectorAll("tr");
+  var ranges = [];
+  for (var R = 0; R < rows.length; ++R) {
+    var outRow = [];
+    var row = rows[R];
+    var columns = row.querySelectorAll("td");
+    for (var C = 0; C < columns.length; ++C) {
+      var cell = columns[C];
+      var colspan = cell.getAttribute("colspan");
+      var rowspan = cell.getAttribute("rowspan");
+      var cellValue = cell.innerText;
+      if (cellValue !== "" && cellValue === +cellValue) cellValue = +cellValue;
+
+      //Skip ranges
+      ranges.forEach(function (range) {
+        if (
+          R >= range.s.r &&
+          R <= range.e.r &&
+          outRow.length >= range.s.c &&
+          outRow.length <= range.e.c
+        ) {
+          for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);
+        }
+      });
+
+      //Handle Row Span
+      if (rowspan || colspan) {
+        rowspan = rowspan || 1;
+        colspan = colspan || 1;
+        ranges.push({
+          s: {
+            r: R,
+            c: outRow.length,
+          },
+          e: {
+            r: R + rowspan - 1,
+            c: outRow.length + colspan - 1,
+          },
+        });
+      }
+
+      //Handle Value
+      outRow.push(cellValue !== "" ? cellValue : null);
+
+      //Handle Colspan
+      if (colspan) for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
+    }
+    out.push(outRow);
+  }
+  return [out, ranges];
+}
+
+function datenum(v, date1904) {
+  if (date1904) v += 1462;
+  var epoch = Date.parse(v);
+  return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
+}
+
+function sheet_from_array_of_arrays(data, opts) {
+  var ws = {};
+  var range = {
+    s: {
+      c: 10000000,
+      r: 10000000,
+    },
+    e: {
+      c: 0,
+      r: 0,
+    },
+  };
+  for (var R = 0; R != data.length; ++R) {
+    for (var C = 0; C != data[R].length; ++C) {
+      if (range.s.r > R) range.s.r = R;
+      if (range.s.c > C) range.s.c = C;
+      if (range.e.r < R) range.e.r = R;
+      if (range.e.c < C) range.e.c = C;
+      var cell = {
+        v: data[R][C],
+      };
+      if (cell.v == null) continue;
+      var cell_ref = XLSX.utils.encode_cell({
+        c: C,
+        r: R,
+      });
+
+      if (typeof cell.v === "number") cell.t = "n";
+      else if (typeof cell.v === "boolean") cell.t = "b";
+      else if (cell.v instanceof Date) {
+        cell.t = "n";
+        cell.z = XLSX.SSF._table[14];
+        cell.v = datenum(cell.v);
+      } else cell.t = "s";
+
+      ws[cell_ref] = cell;
+    }
+  }
+  if (range.s.c < 10000000) ws["!ref"] = XLSX.utils.encode_range(range);
+  return ws;
+}
+
+function Workbook() {
+  if (!(this instanceof Workbook)) return new Workbook();
+  this.SheetNames = [];
+  this.Sheets = {};
+}
+
+function s2ab(s) {
+  var buf = new ArrayBuffer(s.length);
+  var view = new Uint8Array(buf);
+  for (var i = 0; i !== s.length; ++i) view[i] = s.charCodeAt(i) & 0xff;
+  return buf;
+}
+
+export function export_table_to_excel(id) {
+  var theTable = document.getElementById(id);
+  var oo = generateArray(theTable);
+  var ranges = oo[1];
+
+  /* original data */
+  var data = oo[0];
+  var ws_name = "SheetJS";
+
+  var wb = new Workbook(),
+    ws = sheet_from_array_of_arrays(data);
+
+  /* add ranges to worksheet */
+  // ws['!cols'] = ['apple', 'banan'];
+  ws["!merges"] = ranges;
+
+  /* add worksheet to workbook */
+  wb.SheetNames.push(ws_name);
+  wb.Sheets[ws_name] = ws;
+
+  var wbout = XLSX.write(wb, {
+    bookType: "xlsx",
+    bookSST: false,
+    type: "binary",
+  });
+
+  saveAs(
+    new Blob([s2ab(wbout)], {
+      type: "application/octet-stream",
+    }),
+    "test.xlsx"
+  );
+}
+
+export function export_json_to_excel({
+  multiHeader = [],
+  header,
+  data,
+  filename,
+  merges = [],
+  autoWidth = true,
+  bookType = "xlsx",
+} = {}) {
+  /* original data */
+  filename = filename || "excel-list";
+  data = [...data];
+  data.unshift(header);
+
+  for (let i = multiHeader.length - 1; i > -1; i--) {
+    data.unshift(multiHeader[i]);
+  }
+
+  var ws_name = "Sheet1";
+  var wb = new Workbook(),
+    ws = sheet_from_array_of_arrays(data);
+
+  if (merges.length > 0) {
+    if (!ws["!merges"]) ws["!merges"] = [];
+    merges.forEach((item) => {
+      ws["!merges"].push(XLSX.utils.decode_range(item));
+    });
+  }
+
+  if (autoWidth) {
+    /*设置worksheet每列的最大宽度*/
+    const colWidth = data.map((row) =>
+      row.map((val) => {
+        /*先判断是否为null/undefined*/
+        if (val == null) {
+          return {
+            wch: 10,
+          };
+        } else if (val.toString().charCodeAt(0) > 255) {
+          /*再判断是否为中文*/
+          return {
+            wch: val.toString().length * 2,
+          };
+        } else {
+          return {
+            wch: val.toString().length,
+          };
+        }
+      })
+    );
+    /*以第一行为初始值*/
+    let result = colWidth[0];
+    for (let i = 1; i < colWidth.length; i++) {
+      for (let j = 0; j < colWidth[i].length; j++) {
+        if (result[j]["wch"] < colWidth[i][j]["wch"]) {
+          result[j]["wch"] = colWidth[i][j]["wch"];
+        }
+      }
+    }
+    ws["!cols"] = result;
+  }
+
+  /* add worksheet to workbook */
+  wb.SheetNames.push(ws_name);
+  wb.Sheets[ws_name] = ws;
+
+  var wbout = XLSX.write(wb, {
+    bookType: bookType,
+    bookSST: false,
+    type: "binary",
+  });
+  saveAs(
+    new Blob([s2ab(wbout)], {
+      type: "application/octet-stream",
+    }),
+    `${filename}.${bookType}`
+  );
+}

+ 0 - 1
src/views/statisticalanalysis/components/echart/index.vue

@@ -51,7 +51,6 @@ export default {
     option: {
       deep: true,
       handler(newVal) {
-        console.log(newVal);
         const chartDom = document.getElementById(this.id);
         // 先移除之前的实例,保证重绘的流畅性
         chartDom.removeAttribute("_echarts_instance_");

+ 93 - 0
src/views/statisticalanalysis/specialgoods/index.vue

@@ -20,6 +20,7 @@
         :withSetting="false"
         :withExport="true"
         @getFormData="getFormData"
+        @export="tableToExcel"
       />
     </div>
     <div class="echart">
@@ -31,6 +32,7 @@
 <script>
 import Echarts from "../components/echart/index.vue";
 import StatisticsHeader from "../components/echart/statisticsHeader.vue";
+import { export_json_to_excel } from "@/utils/Export2Excel";
 import { Query } from "@/api/webApi";
 export default {
   name: "ChartsBar",
@@ -40,7 +42,11 @@ export default {
       dataid: "collection_ecahrt0",
       listqueryTemplateID: DATACONTENT_ID.modeLoadingweight,
       eledata: null,
+      set: "",
       isShow: Echarts,
+      tableList: [],
+      listname: "",
+      listHeader: [],
       tableData: {
         time: [],
         data1: [],
@@ -315,6 +321,7 @@ export default {
       this.tableData.data1 = [];
       this.tableData.data2 = [];
       if (this.action === 2) {
+        this.set = data.set;
         let option = [
           {
             fttp: data.fttp,
@@ -338,6 +345,53 @@ export default {
         ];
         this.getQuery(option, null);
       }
+      if (this.action === 0) {
+        this.listname =
+          "加货重量统计" +
+          data.fttp +
+          data.kht +
+          data.td +
+          data.dateTime[0] +
+          "--" +
+          data.dateTime[1];
+        this.listHeader = ["时间", "重量"];
+      } else if (this.action === 1) {
+        this.listname =
+          "航班量统计" +
+          data.fttp +
+          data.kht +
+          data.td +
+          data.dateTime[0] +
+          "--" +
+          data.dateTime[1];
+        this.listHeader = ["时间", "重量"];
+      } else if (this.action === 2) {
+        this.listname =
+          "特货统计" +
+          data.fttp +
+          data.kht +
+          data.td +
+          data.spe +
+          data.dateTime[0] +
+          "--" +
+          data.dateTime[1];
+        console.log();
+        if (data.set == 1) {
+          this.listHeader = ["时间", "单"];
+        } else if (data.set == 2) {
+          this.listHeader = ["时间", "重量"];
+        }
+      } else if (this.action === 3) {
+        this.listname =
+          "货量统计" +
+          data.fttp +
+          data.kht +
+          data.td +
+          data.dateTime[0] +
+          "--" +
+          data.dateTime[1];
+        this.listHeader = ["时间", "重量"];
+      }
     },
     //获取表格数据
     async getQuery(data, dat) {
@@ -347,6 +401,7 @@ export default {
           dataContent: data,
         });
         if (code == 0) {
+          this.tableList = returnData.listValues;
           returnData.listValues.forEach((element) => {
             if (this.action === 0) {
               this.tableData.data2.push(element.weight ? element.weight : 0);
@@ -398,6 +453,44 @@ export default {
         this.page--;
       }
     },
+    tableToExcel() {
+      import("../../../utils/Export2Excel").then((excel) => {
+        // 设置导出表格的头部
+        const tHeader = this.listHeader;
+        // 将要导出的数据进行一个过滤
+        /**
+         * 源数据导入到excel的数据每一条重新拼成一个数组,数组里的每个元素就是filterVal里的每个字段
+         */
+        const data = this.tableList.map((item, index) => {
+          if (this.action === 0) {
+            return [item.dat, item.weight];
+          } else if (this.action === 1) {
+            return [item.dat, item.flightNum];
+          } else if (this.action === 2) {
+            if (this.set == 1) {
+              return [item.dat, item.flightNum];
+            } else if (this.set == 2) {
+              return [item.dat, item.weight];
+            }
+          } else if (this.action === 3) {
+            return [item.fdt, item.weight];
+          }
+        });
+        // 调用我们封装好的方法进行导出Excel
+        excel.export_json_to_excel({
+          // 导出的头部
+          header: tHeader,
+          // 导出的内容
+          data,
+          // 导出的文件名称
+          filename: this.listname,
+          // 导出的表格宽度是否自动
+          autoWidth: true,
+          // 导出文件的后缀类型
+          bookType: "xlsx",
+        });
+      });
+    },
   },
   components: {
     Echarts,