vue项目使用xlxs导出excel

export2excel.js
这里引入了两个分别为1和2

/* eslint-disable */
require('script-loader!file-saver');
require('script-loader!./Blob');
require('script-loader!xlsx/dist/xlsx.core.min');
require('script-loader!xlsx/dist/xlsx.full.min');
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);
    console.log('a')
    var oo = generateArray(theTable);
    var ranges = oo[1];

    /* original data */
    var data = oo[0];
    var ws_name = "SheetJS";
    console.log(data);

    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_get_title_time () {
    var date = new Date();
    var seperator1 = "";
    var year = date.getFullYear();
    var month = date.getMonth() + 1;
    var strDate = date.getDate();
    var hour = date.getHours(); //获取当前小时数(0-23)
    var min = date.getMinutes(); //获取当前分钟数(0-59)
    var second = date.getSeconds(); //获取当前秒数(0-59)
    if (month >= 1 && month <= 9) {
        month = "0" + month;
    }
    if (strDate >= 0 && strDate <= 9) {
        strDate = "0" + strDate;
    }
    if (hour >= 1 && hour <= 9) {
        hour = "0" + hour;
    }
    if (min >= 0 && min <= 9) {
        min = "0" + min;
    }
    if (second >= 0 && second <= 9) {
        second = "0" + second;
    }
    var currentdate = year + seperator1 + month + seperator1 + strDate + hour + seperator1 + min + seperator1 + second;
    return currentdate;
};
function formatJson (jsonData) {
    return jsonData.map(v => filterVal.map(j => {
        if (v[j]) {
            if (j === 'timestamp') {
                return parseTime(v[j])
            } else {
                return v[j]
            }
        } else {
            return ""
        }
    }))
}
export function export_json_to_excel (th, jsonData, defaultTitle) {

    /* original data */

    var data = jsonData;
    data.unshift(th);
    var ws_name = "SheetJS";

    var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);


    /* 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' });
    var title = defaultTitle || '列表'
    saveAs(new Blob([s2ab(wbout)], { type: "application/octet-stream" }), title + ".xlsx")
}
//树形数据用此方法
export function export_json_to_excel2 (header, data, filename, merges) {
    /* original data */
    filename = filename || 'excel-list'
    data = [...data]
    for (var i = 0; i < header.length; i++) {
        data.unshift(header[i]);
    }
    var ws_name = "SheetJS";
    var wb = new Workbook(),
        ws = sheet_from_array_of_arrays(data);
    //====设置xlsx单元格样式
    for (var b = 0; b < header.length; b++) {
        for (var i = 0; i < header[b].length; i++) {
            var str = String.fromCharCode((65 + i));//A B C D....
            //设备表头样式
            var head = str + "1";
            ws[head].s = { font: { sz: 12, bold: true, color: { rgb: "000000" } }, alignment: { vertical: "center", horizontal: "center" }, fill: { bgColor: { indexed: 64 }, fgColor: { rgb: "FFFF00" } } }
            //设置内容样式
            for (let j = 2; j < data.length; j++) {
                var body = str + j;
                ws[body].s = { font: { sz: 12 }, alignment: { vertical: "center", horizontal: "center" } }
            }
        }
    }
    if (merges) {
        //合并单元格
        ws["!merges"] = merges
    }
    let autoWidth = true
    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: 'xlsx',
        bookSST: false,
        type: 'binary'
    });

    saveAs(new Blob([s2ab(wbout)], {
        type: "application/octet-stream"
    }), filename + ".xlsx");
}
/* eslint-disable */
require('script-loader!file-saver');
// require('script-loader!@/vendor/Blob');
require('script-loader!xlsx/dist/xlsx.core.min');
require('script-loader!xlsx/dist/xlsx.full.min');
 
// import XLSX from 'xlsx'
// import XLSX1 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 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_get_title_time() {
  var date = new Date();
  var seperator1 = "";
  var year = date.getFullYear();
  var month = date.getMonth() + 1;
  var strDate = date.getDate();
  var hour =  date.getHours(); //获取当前小时数(0-23)
  var min = date.getMinutes(); //获取当前分钟数(0-59)
  var second = date.getSeconds(); //获取当前秒数(0-59)
  if (month >= 1 && month <= 9) {
      month = "0" + month;
  }
  if (strDate >= 0 && strDate <= 9) {
      strDate = "0" + strDate;
  }
  if (hour >= 1 && hour <= 9) {
    hour = "0" + hour;
  }
  if (min >= 0 && min <= 9) {
    min = "0" + min;
  }
  if (second >= 0 && second <= 9) {
    second = "0" + second;
  }
  var currentdate = year + seperator1 + month + seperator1 + strDate+hour+seperator1+min+seperator1+second;
  return currentdate;
};
//解析数据
export function format_json(filterVal, jsonData) {
  return jsonData.map(v => filterVal.map(j => {
      if(v[j]){
          if (j === 'timestamp') {
              return parseTime(v[j])
          } else {
                  return v[j]
          }
      }else{
          return ""
      }
  }))
};
export function export_json_to_excel(header,data,filename,merges) {
  /* original data */
  filename = filename || 'excel-list'
  data = [...data]
  for(var i = 0;i < header.length; i++){
    data.unshift(header[i]);
  }
  var ws_name = "SheetJS";
  var wb = new Workbook(),
    ws = sheet_from_array_of_arrays(data);
      //====设置xlsx单元格样式
      for(var i=0;i<header.length;i++){
        var str = String.fromCharCode((65+i));//A B C D....
        //设备表头样式
        var head = str + "1";
        ws[head].s =  { font: { sz: 12, bold: true, color: { rgb: "000000" } },alignment:{vertical:"center",horizontal:"center"}, fill: { bgColor: { indexed: 64 }, fgColor: { rgb: "FFFF00" } } }
        //设置内容样式
        for (let j = 2; j < data.length; j++) {
          var body =  str + j;
          ws[body].s =  { font: { sz: 12},alignment:{vertical:"center",horizontal:"center"} }
        }
      }
      if(merges){
        //合并单元格
        ws["!merges"] = merges
      }
  let autoWidth = true
  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: 'xlsx',
    bookSST: false,
    type: 'binary'
  });
   
  saveAs(new Blob([s2ab(wbout)], {
    type: "application/octet-stream"
  }), filename + ".xlsx");
}

创建一个工具

export function export2Excel(columns, list, title) {
  require.ensure([], () => {
    const { export_json_to_excel } = require('../../vendor/Export2Excel2');
    const { export_get_title_time } = require('@/vendor/Export2Excel2')
    let tHeader = []
    let filterVal = []
    console.log(columns)
    if (!columns) {
      return;
    }
    columns.forEach(item => {
      tHeader.push(item.title)
      filterVal.push(item.key)
    })
    const data = list.map(v => filterVal.map(j => v[j]))
    export_json_to_excel(tHeader, data, title + '-' + export_get_title_time());
  })
}
// 复杂表头合并数据
export function downloadOutline(tHeader, list, title, merges) {
  console.log(tHeader)
  console.log(merges)
  console.log(list)
  import('@/vendor/Export2Excel3').then(excel => {
    const currentdate = excel.export_get_title_time()
    excel.export_json_to_excel(tHeader, list, title + '(' + currentdate + ')', merges)
  })
}

data () {
    return {
    tableData: [],
      filterVal: [],
      multiHeader: [],
      merges: [],
      header: [],
	message: {
        '': [
          { title: '姓名', key: 'persionName' },
          { title: '证件号', key: 'zjh' },
          { title: '行政区', key: 'cxdqbm' },
          { title: '地址名称', key: 'cxdqmc' }
        ],
        房地产权: [{ title: '不动产单元号', key: 'fdcbdcdyh' },
        { title: '房地坐落', key: 'fdcfdzl' },
        { title: '建筑面积', key: 'fdcjzmj' },
        { title: '规划用途', key: 'fdcghyt' },
        { title: '房屋性质', key: 'fdcfwxz' },
        { title: '不动产权证号', key: 'fdcbdcqzh' },
        { title: '土地使用起始时间', key: 'fdctdsyqssj' },
        { title: '土地使用结束时间', key: 'fdctdsyjssj' },
        { title: '共有方式', key: 'fdcgyfs' },
        { title: '共有人', key: 'fdcgyr' },
        { title: '共有情况', key: 'fdcgyqk' },
        { title: '权属状态', key: 'fdcqszt' },
        { title: '登记时间', key: 'fdcdjsj' },
        { title: '登记机构', key: 'fdcdjjg' }
        ]
 }
methods:{
// 导出
    exportEX () {
      // import('@/vendor/Export2Excel3').then(excel => {
      const header = this.header
      const merges = this.merges
      // const multiHeader = this.multiHeader
      // const data = excel.format_json(filterVal, this.tableData)
      var date = new Date();
      const title = '超期量统计' + date.toLocaleString() + '/' + newguid();
      //   excel.export_json_to_excel(multiHeader, header, data, , merges)
      // })
      const data = this.format_json(this.tableData)
      downloadOutline(header, data, title, merges)
    },
    format_json () {
      var data = []
      for (var i = 0; i < this.tableData.length; i++) {
        var item = []
        for (var key in this.tableData[i]) {
          item.push(this.tableData[i][key])
        }
        data.push(item)
      }
      return data
    },
    intHead () {
      var multiHeader = [];
      var multiHeader2 = [];
      for (var key in this.message) {
        if (key !== '') {
          multiHeader.push(key)
          for (var i = 0; i < this.message[key].length; i++) {
            // this.filterVal.push(this.message[key][i].key)
            multiHeader2.push(this.message[key][i].title)
          }
          for (var i = 0; i < this.message[key].length - 1; i++) {
            multiHeader.push('')
          }
        } else {
          for (var c = 0; c < this.message[key].length; c++) {
            // this.filterVal.push(this.message[key][c].key)
            multiHeader.push(this.message[key][c].title)
            multiHeader2.push('')
          }
        }
      }
      this.header.push(multiHeader2)
      this.header.push(multiHeader)
      // console.log(this.header)
      // console.log(this.multiHeader)
    },
    initMerges () {
      this.merges = []
      for (var i = 0; i < this.message[''].length; i++) {
        this.merges.push({
          s: {
            c: i, // 开始列
            r: 0 // 可以看成开始行,实际是取值范围
          },
          e: {//  e结束
            c: i, // 结束列
            r: 1 // 结束行
          }
        })
      }
      var length = this.message[''].length - 1;
      for (var key in this.message) {
        if (key !== '') {
          length++
          this.merges.push({
            s: {
              c: length,
              r: 0
            },
            e: {
              c: length + this.message[key].length - 2,
              r: 0
            }
          })
          length = length + this.message[key].length - 1
        }
      }
    },
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

犇儿犇儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值