From c997f662e871ae587ca3da1fb9b576b41b743e51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=9D=A8?= <1711467488@qq.com> Date: Fri, 9 Feb 2018 15:42:28 +0800 Subject: [PATCH] no message Former-commit-id: 408058fab164d62f8a60dcb3abbac19a0464dec1 Former-commit-id: ec41a7db6766d29a89679ed3769fad5ead12058a Former-commit-id: 0f4d0fbaa32e40973b79ad12a1a90c3035106a68 --- src/components/core/Icon/index.vue | 15 ++++ src/components/core/index.js | 1 + src/pages/demo/plugins/tableExport/demo.vue | 18 +++++ src/utils/csv.js | 62 ++++++++++++++++ src/utils/export-csv.js | 82 +++++++++++++++++++++ 5 files changed, 178 insertions(+) create mode 100644 src/components/core/Icon/index.vue create mode 100755 src/utils/csv.js create mode 100755 src/utils/export-csv.js diff --git a/src/components/core/Icon/index.vue b/src/components/core/Icon/index.vue new file mode 100644 index 00000000..130e662f --- /dev/null +++ b/src/components/core/Icon/index.vue @@ -0,0 +1,15 @@ + + + diff --git a/src/components/core/index.js b/src/components/core/index.js index eb482520..d52e9302 100644 --- a/src/components/core/index.js +++ b/src/components/core/index.js @@ -3,6 +3,7 @@ import Vue from 'vue' Vue.component('Container', resolve => { require(['@/components/core/Container'], resolve) }) Vue.component('CountUp', resolve => { require(['@/components/core/CountUp'], resolve) }) Vue.component('Highlight', resolve => { require(['@/components/core/Highlight'], resolve) }) +Vue.component('Icon', resolve => { require(['@/components/core/Icon'], resolve) }) Vue.component('IconSelect', resolve => { require(['@/components/core/IconSelect/index.vue'], resolve) }) Vue.component('Markdown', resolve => { require(['@/components/core/Markdown'], resolve) }) Vue.component('QuillEditor', resolve => { require(['@/components/core/QuillEditor'], resolve) }) diff --git a/src/pages/demo/plugins/tableExport/demo.vue b/src/pages/demo/plugins/tableExport/demo.vue index e764f249..ea6377e4 100644 --- a/src/pages/demo/plugins/tableExport/demo.vue +++ b/src/pages/demo/plugins/tableExport/demo.vue @@ -4,6 +4,12 @@ slot="header" title="基本示例"> +
+ + + exportCsv + +
diff --git a/src/utils/csv.js b/src/utils/csv.js new file mode 100755 index 00000000..d8f300b3 --- /dev/null +++ b/src/utils/csv.js @@ -0,0 +1,62 @@ +/* + inspired by https://www.npmjs.com/package/react-csv-downloader + now removed from Github + inspired by https://github.com/iview/iview +*/ + +/* eslint-disable */ + +const newLine = '\r\n'; +const appendLine = (content, row, { separator, quoted }) => { + const line = row.map(data => { + if (!quoted) return data; + // quote data + data = typeof data === 'string' ? data.replace(/"/g, '"') : data; + return `"${data}"`; + }); + content.push(line.join(separator)); +}; + +const defaults = { + separator: ',', + quoted: false +}; + +export default function csv(columns, datas, options, noHeader = false) { + options = Object.assign({}, defaults, options); + let columnOrder; + const content = []; + const column = []; + + if (columns) { + columnOrder = columns.map(v => { + if (typeof v === 'string') return v; + if (!noHeader) { + column.push(typeof v.title !== 'undefined' ? v.title : v.key); + } + return v.key; + }); + if (column.length > 0) appendLine(content, column, options); + } else { + columnOrder = []; + datas.forEach(v => { + if (!Array.isArray(v)) { + columnOrder = columnOrder.concat(Object.keys(v)); + } + }); + if (columnOrder.length > 0) { + columnOrder = columnOrder.filter((value, index, self) => self.indexOf(value) === index); + if (!noHeader) appendLine(content, columnOrder, options); + } + } + + if (Array.isArray(datas)) { + datas.forEach(row => { + if (!Array.isArray(row)) { + row = columnOrder.map(k => (typeof row[k] !== 'undefined' ? row[k] : '')); + } + appendLine(content, row, options); + }); + } + return content.join(newLine); +} diff --git a/src/utils/export-csv.js b/src/utils/export-csv.js new file mode 100755 index 00000000..edb4a74d --- /dev/null +++ b/src/utils/export-csv.js @@ -0,0 +1,82 @@ +/* + https://github.com/iview/iview +*/ + +/* eslint-disable */ + +function has (browser) { + const ua = navigator.userAgent; + if (browser === 'ie') { + const isIE = ua.indexOf('compatible') > -1 && ua.indexOf('MSIE') > -1; + if (isIE) { + const reIE = new RegExp('MSIE (\\d+\\.\\d+);'); + reIE.test(ua); + return parseFloat(RegExp['$1']); + } else { + return false; + } + } else { + return ua.indexOf(browser) > -1; + } +} + +const csv = { + _isIE11 () { + let iev = 0; + const ieold = (/MSIE (\d+\.\d+);/.test(navigator.userAgent)); + const trident = !!navigator.userAgent.match(/Trident\/7.0/); + const rv = navigator.userAgent.indexOf('rv:11.0'); + + if (ieold) { + iev = Number(RegExp.$1); + } + if (navigator.appVersion.indexOf('MSIE 10') !== -1) { + iev = 10; + } + if (trident && rv !== -1) { + iev = 11; + } + + return iev === 11; + }, + + _isEdge () { + return /Edge/.test(navigator.userAgent); + }, + + _getDownloadUrl (text) { + const BOM = '\uFEFF'; + // Add BOM to text for open in excel correctly + if (window.Blob && window.URL && window.URL.createObjectURL) { + const csvData = new Blob([BOM + text], { type: 'text/csv' }); + return URL.createObjectURL(csvData); + } else { + return 'data:attachment/csv;charset=utf-8,' + BOM + encodeURIComponent(text); + } + }, + + download (filename, text) { + if (has('ie') && has('ie') < 10) { + // has module unable identify ie11 and Edge + const oWin = window.top.open('about:blank', '_blank'); + oWin.document.charset = 'utf-8'; + oWin.document.write(text); + oWin.document.close(); + oWin.document.execCommand('SaveAs', filename); + oWin.close(); + } else if (has('ie') === 10 || this._isIE11() || this._isEdge()) { + const BOM = '\uFEFF'; + const csvData = new Blob([BOM + text], { type: 'text/csv' }); + navigator.msSaveBlob(csvData, filename); + } else { + const link = document.createElement('a'); + link.download = filename; + link.href = this._getDownloadUrl(text); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + } +}; + +export default csv; \ No newline at end of file