drew 5 лет назад
Родитель
Сommit
963cabfd68
2 измененных файлов с 51 добавлено и 0 удалено
  1. 2 0
      src/main/vue/src/main.js
  2. 49 0
      src/main/vue/src/plugins/dataExport.js

+ 2 - 0
src/main/vue/src/main.js

@@ -4,6 +4,7 @@ import router from './router';
 import store from './store';
 import ElementUI from 'element-ui';
 import http from './plugins/http';
+import dataExport from '@/plugins/dataExport';
 import SortableHeader from '@/components/SortableHeader';
 import MultiUpload from '@/components/MultiUpload';
 import SingleUpload from '@/components/SingleUpload';
@@ -36,6 +37,7 @@ import 'element-ui/lib/theme-chalk/index.css';
 Vue.config.productionTip = false;
 Vue.use(ElementUI, { size: 'small' });
 Vue.use(http);
+Vue.use(dataExport);
 Vue.component('sortable-header', SortableHeader);
 Vue.component('multi-upload', MultiUpload);
 Vue.component('single-upload', SingleUpload);

+ 49 - 0
src/main/vue/src/plugins/dataExport.js

@@ -0,0 +1,49 @@
+import XLSX from 'xlsx';
+function getPropByPath(obj, path, strict) {
+    let tempObj = obj;
+    path = path.replace(/\[(\w+)\]/g, '.$1');
+    path = path.replace(/^\./, '');
+
+    let keyArr = path.split('.');
+    let i = 0;
+    for (let len = keyArr.length; i < len - 1; ++i) {
+        if (!tempObj && !strict) break;
+        let key = keyArr[i];
+        if (key in tempObj) {
+            tempObj = tempObj[key];
+        } else {
+            if (strict) {
+                throw new Error('please transfer a valid prop path to form item!');
+            }
+            break;
+        }
+    }
+    return {
+        o: tempObj,
+        k: keyArr[i],
+        v: tempObj ? tempObj[keyArr[i]] : null
+    };
+}
+export default {
+    install(Vue, option) {
+        Vue.prototype.$exportTable = (ref, filename) => {
+            if (!ref) {
+                throw new Error('ref cannot be emtpy');
+            }
+            if (!filename) {
+                throw new Error('filename cannot be empty');
+            }
+            filename = filename.replace(/.xlsx$/i, '');
+            const columns = ref.columns.filter(i => !!i.property);
+            let workbook = XLSX.utils.book_new();
+            let sheet = XLSX.utils.aoa_to_sheet([
+                columns.map(c => c.label),
+                ...ref.tableData.map(i => {
+                    return columns.map(c => getPropByPath(i, c.property).v);
+                })
+            ]);
+            XLSX.utils.book_append_sheet(workbook, sheet, filename);
+            XLSX.writeFile(workbook, filename + '.xlsx');
+        };
+    }
+};