123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- import { saveAs } from 'file-saver'
- import XLSX from 'xlsx'
- const jsontoExcel = {
- downloadExl: function (header, data, fileName) {
- // var keys = Object.keys(data[0]);
- let copyData = JSON.parse(JSON.stringify(data))
- let firstRow = {};
- let keys = header.map((item) => {
- this.setDataForKey(firstRow, item.fieldName, item.headerName);
- return item.fieldName
- });
- // header.forEach(function (item) {
- // firstRow[item] = item;
- // });
- copyData.unshift(firstRow);
- let content = {};
- // 把json格式的数据转为excel的行列形式
- let sheetsData = copyData.map((item, rowIndex) => {
- return keys.map((key, columnIndex) => {
- return Object.assign({}, {
- value: this.dataForKey(item, key),
- // value: item[key],
- position: (columnIndex > 25 ? this.getCharCol(columnIndex) : String.fromCharCode(65 + columnIndex)) + (rowIndex + 1),
- });
- });
- }).reduce(function (prev, next) {
- return prev.concat(next);
- });
- sheetsData.forEach((item) => {
- content[item.position] = {
- v: item.value
- };
- });
- //设置区域,比如表格从A1到D10,SheetNames:标题,
- let coordinate = Object.keys(content);
- let workBook = {
- SheetNames: ["Sheet1"],
- Sheets: {
- "Sheet1": Object.assign({}, content, { "!ref": coordinate[0] + ":" + coordinate[coordinate.length - 1] }),
- }
- };
- //这里的数据是用来定义导出的格式类型
- var excelData = XLSX.write(workBook, { bookType: "xlsx", bookSST: false, type: "binary" });
- var blob = new Blob([this.string2ArrayBuffer(excelData)], { type: "" });
- saveAs(blob, `${fileName}.xlsx`);
- },
- //字符串转字符流
- string2ArrayBuffer: function (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;
- },
- // 将指定的自然数转换为26进制表示。映射关系:[0-25] -> [A-Z]。
- getCharCol: function (n) {
- let s = "",
- m = 0
- while (n > 0) {
- m = n % 26 + 1
- s = String.fromCharCode(m + 64) + s
- n = (n - m) / 26
- }
- return s
- },
- //根据key值去对象中取对应的值
- dataForKey: function (data, key) {
- let arr = key.split(".")
- if (arr && arr[0]) {
- for (let i = 0; i < arr.length; i++) {
- if (arr[i] && data[arr[i]]) {
- data = data[arr[i]]
- } else {
- return ''
- }
- }
- return data
- }
- },
- //根据key值去设置对象的值
- setDataForKey: function (data, key, value) {
- let arr = key.split(".")
- if (arr && arr[0]) {
- for (let i = 0; i < arr.length; i++) {
- if (!(arr[i] && data[arr[i]])) {
- data[arr[i]] = {}
- }
- if (value !== undefined) {
- if (i == arr.length - 1) {
- data[arr[i]] = value
- }
- }
- data = data[arr[i]]
- }
- }
- }
- }
- export default jsontoExcel
|