From 4b5b0a6e6ba115adb1f327eb18e202e348e2e091 Mon Sep 17 00:00:00 2001
From: Pan <panfree23@gmail.com>
Date: Sun, 17 Mar 2019 16:52:11 +0800
Subject: [PATCH] feature[Excel]: add export merge header excel demo

---
 src/lang/en.js                  |   1 +
 src/lang/es.js                  |   1 +
 src/lang/zh.js                  |   7 ++-
 src/router/index.js             |   6 ++
 src/views/excel/exportExcel.vue |  39 +++++-------
 src/views/excel/mergeHeader.vue | 101 ++++++++++++++++++++++++++++++++
 6 files changed, 128 insertions(+), 27 deletions(-)
 create mode 100644 src/views/excel/mergeHeader.vue

diff --git a/src/lang/en.js b/src/lang/en.js
index caed5c5b..963c60d3 100644
--- a/src/lang/en.js
+++ b/src/lang/en.js
@@ -57,6 +57,7 @@ export default {
     excel: 'Excel',
     exportExcel: 'Export Excel',
     selectExcel: 'Export Selected',
+    mergeHeader: 'Merge Header',
     uploadExcel: 'Upload Excel',
     zip: 'Zip',
     pdf: 'PDF',
diff --git a/src/lang/es.js b/src/lang/es.js
index f0d7de41..31fa8303 100755
--- a/src/lang/es.js
+++ b/src/lang/es.js
@@ -57,6 +57,7 @@ export default {
     excel: 'Excel',
     exportExcel: 'Exportar a Excel',
     selectExcel: 'Export seleccionado',
+    mergeHeader: 'Merge Header',
     uploadExcel: 'Subir Excel',
     zip: 'Zip',
     pdf: 'PDF',
diff --git a/src/lang/zh.js b/src/lang/zh.js
index 9bea838e..574cba11 100644
--- a/src/lang/zh.js
+++ b/src/lang/zh.js
@@ -55,9 +55,10 @@ export default {
     page404: '404',
     errorLog: '错误日志',
     excel: 'Excel',
-    exportExcel: 'Export Excel',
-    selectExcel: 'Export Selected',
-    uploadExcel: 'Upload Excel',
+    exportExcel: '导出 Excel',
+    selectExcel: '导出 已选择项',
+    mergeHeader: '导出 多级表头',
+    uploadExcel: '上传 Excel',
     zip: 'Zip',
     pdf: 'PDF',
     exportZip: 'Export Zip',
diff --git a/src/router/index.js b/src/router/index.js
index 529c1ab2..fcff584e 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -279,6 +279,12 @@ export const asyncRoutes = [
         name: 'SelectExcel',
         meta: { title: 'selectExcel' }
       },
+      {
+        path: 'export-merge-header',
+        component: () => import('@/views/excel/mergeHeader'),
+        name: 'MergeHeader',
+        meta: { title: 'mergeHeader' }
+      },
       {
         path: 'upload-excel',
         component: () => import('@/views/excel/uploadExcel'),
diff --git a/src/views/excel/exportExcel.vue b/src/views/excel/exportExcel.vue
index 8e969386..253f1641 100644
--- a/src/views/excel/exportExcel.vue
+++ b/src/views/excel/exportExcel.vue
@@ -19,22 +19,20 @@
           {{ scope.$index }}
         </template>
       </el-table-column>
-      <el-table-column label="主要信息" align="center">
-        <el-table-column label="Title">
-          <template slot-scope="scope">
-            {{ scope.row.title }}
-          </template>
-        </el-table-column>
-        <el-table-column label="Author" width="110" align="center">
-          <template slot-scope="scope">
-            <el-tag>{{ scope.row.author }}</el-tag>
-          </template>
-        </el-table-column>
-        <el-table-column label="Readings" width="115" align="center">
-          <template slot-scope="scope">
-            {{ scope.row.pageviews }}
-          </template>
-        </el-table-column>
+      <el-table-column label="Title">
+        <template slot-scope="scope">
+          {{ scope.row.title }}
+        </template>
+      </el-table-column>
+      <el-table-column label="Author" width="110" align="center">
+        <template slot-scope="scope">
+          <el-tag>{{ scope.row.author }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="Readings" width="115" align="center">
+        <template slot-scope="scope">
+          {{ scope.row.pageviews }}
+        </template>
       </el-table-column>
       <el-table-column align="center" label="Date" width="220">
         <template slot-scope="scope">
@@ -49,12 +47,10 @@
 <script>
 import { fetchList } from '@/api/article'
 import { parseTime } from '@/utils'
-
 // options components
 import FilenameOption from './components/FilenameOption'
 import AutoWidthOption from './components/AutoWidthOption'
 import BookTypeOption from './components/BookTypeOption'
-
 export default {
   name: 'ExportExcel',
   components: { FilenameOption, AutoWidthOption, BookTypeOption },
@@ -82,17 +78,13 @@ export default {
     handleDownload() {
       this.downloadLoading = true
       import('@/vendor/Export2Excel').then(excel => {
-        const multiHeader = [['Id', '主要信息', '', '', 'Date']]
-        const tHeader = ['', 'Title', 'Author', 'Readings', '']
+        const tHeader = ['Id', 'Title', 'Author', 'Readings', 'Date']
         const filterVal = ['id', 'title', 'author', 'pageviews', 'display_time']
         const list = this.list
         const data = this.formatJson(filterVal, list)
-        const merges = ['A1:A2', 'B1:D1', 'E1:E2']
         excel.export_json_to_excel({
-          multiHeader,
           header: tHeader,
           data,
-          merges,
           filename: this.filename,
           autoWidth: this.autoWidth,
           bookType: this.bookType
@@ -121,4 +113,3 @@ export default {
   padding: 0 12px 0 30px;
 }
 </style>
-
diff --git a/src/views/excel/mergeHeader.vue b/src/views/excel/mergeHeader.vue
new file mode 100644
index 00000000..81d12a89
--- /dev/null
+++ b/src/views/excel/mergeHeader.vue
@@ -0,0 +1,101 @@
+<template>
+  <div class="app-container">
+
+    <el-button :loading="downloadLoading" style="margin-bottom:20px" type="primary" icon="document" @click="handleDownload">Export</el-button>
+
+    <el-table
+      v-loading="listLoading"
+      ref="multipleTable"
+      :data="list"
+      element-loading-text="Loading"
+      border
+      fit
+      highlight-current-row
+    >
+      <el-table-column align="center" label="Id" width="95">
+        <template slot-scope="scope">
+          {{ scope.$index }}
+        </template>
+      </el-table-column>
+      <el-table-column label="Main Information" align="center">
+        <el-table-column label="Title">
+          <template slot-scope="scope">
+            {{ scope.row.title }}
+          </template>
+        </el-table-column>
+        <el-table-column label="Author" width="110" align="center">
+          <template slot-scope="scope">
+            <el-tag>{{ scope.row.author }}</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="Readings" width="115" align="center">
+          <template slot-scope="scope">
+            {{ scope.row.pageviews }}
+          </template>
+        </el-table-column>
+      </el-table-column>
+      <el-table-column align="center" label="Date" width="220">
+        <template slot-scope="scope">
+          <i class="el-icon-time"/>
+          <span>{{ scope.row.timestamp | parseTime('{y}-{m}-{d} {h}:{i}') }}</span>
+        </template>
+      </el-table-column>
+    </el-table>
+
+  </div>
+</template>
+
+<script>
+import { fetchList } from '@/api/article'
+import { parseTime } from '@/utils'
+
+export default {
+  name: 'MergeHeader',
+  data() {
+    return {
+      list: null,
+      listLoading: true,
+      downloadLoading: false
+    }
+  },
+  created() {
+    this.fetchData()
+  },
+  methods: {
+    fetchData() {
+      this.listLoading = true
+      fetchList(this.listQuery).then(response => {
+        this.list = response.data.items
+        this.listLoading = false
+      })
+    },
+    handleDownload() {
+      this.downloadLoading = true
+        import('@/vendor/Export2Excel').then(excel => {
+          const multiHeader = [['Id', 'Main Information', '', '', 'Date']]
+          const header = ['', 'Title', 'Author', 'Readings', '']
+          const filterVal = ['id', 'title', 'author', 'pageviews', 'display_time']
+          const list = this.list
+          const data = this.formatJson(filterVal, list)
+          const merges = ['A1:A2', 'B1:D1', 'E1:E2']
+          excel.export_json_to_excel({
+            multiHeader,
+            header,
+            merges,
+            data
+          })
+          this.downloadLoading = false
+        })
+    },
+    formatJson(filterVal, jsonData) {
+      return jsonData.map(v => filterVal.map(j => {
+        if (j === 'timestamp') {
+          return parseTime(v[j])
+        } else {
+          return v[j]
+        }
+      }))
+    }
+  }
+}
+</script>