前端纯拼接的方法拼成Excel


1.自己定义一个函数transform函数

var idTmr
//自己定义一个函数transform,在里面写我们的业务逻辑
function transform(table, name, callback) {
  //table为表格数据,name为导出文件名,
  //callback为导出完毕回调,方便你知道导出完成了(可根据自己需求决定是否需要)
  let tableInnerHTML = ''
  let headerData = ['序号', '姓名', '年龄', '性别', '爱好', '发量', '薪水']
  let bodyData = table //这里对应是表格数据,我们只需要传过来即可
  //拼接完全使用thead、tbody、tr、td、th,并且相应的tr、th、td里可以写一些类似colspan(决定占几列)
  //rowspan(决定占几行)的属性、可以用作合并行、合并列等高级操作
  tableInnerHTML += '<thead><tr>' //头部部分开始拼接!
  tableInnerHTML +=
    `<th colspan=${headerData.length} 
    style='background:#CCFFFF;border:solid;'>` +
    '程序员的将来' +
    '</th></tr>'
  tableInnerHTML += '<tr>'
  headerData.forEach(item => {
    tableInnerHTML +=
      "<th rowspan='1' style='background:#FFFFCC;border:solid'>" +
      item +
      '</th>'
  })
  tableInnerHTML += '</tr></thead>' //头部部分结束
  tableInnerHTML += '<tbody>' //身体部分开始
  bodyData.forEach(item => {
    tableInnerHTML += '<tr>'
    tableInnerHTML +=
      "<td align='center' style='border:solid'>" + item.index + '</td>'
    tableInnerHTML +=
      "<td align='center' style='border:solid'>" + item.name + '</td>'
    tableInnerHTML +=
      "<td align='center' style='border:solid'>" + item.age + '</td>'
    tableInnerHTML +=
      "<td align='center' style='border:solid'>" + item.sex + '</td>'
    tableInnerHTML +=
      "<td align='center' style='border:solid'>" + item.hobby + '</td>'
    tableInnerHTML +=
      "<td align='center' style='border:solid'>" + item.hair + '</td>'
    tableInnerHTML +=
      "<td align='center' style='border:solid'>" + item.salaried + '</td>'
    tableInnerHTML += '</tr>'
  })
  tableInnerHTML += '</tbody>' //身体结束
  //------------OK,到此为止拼接工作做完,也就是基本的数据已经被拼接成表格了--------------------
  //tip开始(下面还有个tip结束的位置)
  /*-------从tip开始到tip结束的过程是判断浏览器类型步骤,做兼容性处理!对于你来说你完全可以不用
深入理解这里面的逻辑,直接复制到自己的项目里去,不会存在任何浏览器兼容性的问题!*/
  function getExplorer() {
    var explorer = window.navigator.userAgent
    if (explorer.indexOf('MSIE') >= 0) {
      return 'ie' // ie
    } else if (explorer.indexOf('Firefox') >= 0) {
      return 'Firefox' // firefox
    } else if (explorer.indexOf('Chrome') >= 0) {
      return 'Chrome' // Chrome
    } else if (explorer.indexOf('Opera') >= 0) {
      return 'Opera' // Opera
    } else if (explorer.indexOf('Safari') >= 0) {
      return 'Safari' // Safari
    }
  }

  if (getExplorer() !== 'Safari' && name.substr(-1, 4) !== '.xls') {
    name += '.xls'
  }
  if (getExplorer() === 'ie') {
    var curTbl = table
    var oXL = new ActiveXObject('Excel.Application')
    var oWB = oXL.Workbooks.Add()
    var xlsheet = oWB.Worksheets(1)
    var sel = document.body.createTextRange()
    sel.moveToElementText(curTbl)
    sel.select()
    sel.execCommand('Copy')
    xlsheet.Paste()
    oXL.Visible = true
    try {
      var fname = oXL.Application.GetSaveAsFilename(
        'Excel.xls',
        'Excel Spreadsheets (*.xls), *.xls'
      )
    } catch (e) {
      print('Nested catch caught ' + e)
    } finally {
      oWB.SaveAs(fname)
      // oWB.Close(savechanges = false);
      oXL.Quit()
      oXL = null
      idTmr = setInterval(Cleanup(), 1)
    }
  } else {
    tableToExcel(
      tableInnerHTML,
      name,
      callback
    ) /*在这调用下面的一个方法,传入拼接完成
                                          的表格,文件名,回调函数。该方法是干嘛的请往下看*/
  }
  //tip结束
} //此括号结束,我们自己封装的transform方法也结束了!90%的逻辑完成了!

/*下面的两个函数对于你来说你也完全不用深入理解里面的逻辑,你只要知道,他是在帮助你做转换,帮助你
  将拼接好的HTML字符串模板真正地转换并且输出到Excel里面去,直接当成固定书写方法,直接拿来用即可*/
function Cleanup() {
  window.clearInterval(idTmr)
}
let tableToExcel = (function() {
  let template =
    '<html><head><meta charset="UTF-8"></head><body><table>{table}</table></body></html>'
  let format = function(s, c) {
    return s.replace(/{(\w+)}/g, function(m, p) {
      return c[p]
    })
  }
  return function(table, name, callback) {
    let ctx = { worksheet: name || 'Worksheet', table: table }
    let blob = new Blob([format(template, ctx)])
    let a = document.createElement('a')
    a.href = URL.createObjectURL(blob)
    a.download = name //这里这个name就是对应的文件名!
    a.click()
    a.remove()
    callback(
      'success'
    ) /*这里调用我们自己传入的回调方法,这样导出Excel完成后你就能
        在外面知道导出完毕,并且再往下做自己其他的逻辑*/
  }
})()
export default transform //导出自己封装的transform方法

2.使用

<template>
  <div>
    <a>用纯拼接的方法拼成Excel</a>
    <el-table :data="tableData" style="width: 100%">
      <el-table-column prop="name" label="姓名" width="180"></el-table-column>
      <el-table-column prop="age" label="年龄"></el-table-column>
      <el-table-column prop="sex" label="性别"></el-table-column>
      <el-table-column prop="hobby" label="爱好"></el-table-column>
      <el-table-column prop="hair" label="发量"></el-table-column>
      <el-table-column prop="salaried" label="薪水"></el-table-column>
    </el-table>
    <button @click="toExcel">导出表格数据到Excel</button>
  </div>
</template>
<script>
import transform from '../assets/js/exportToExcel' //这个方法来源于二步骤封装的方法,往下看
export default {
  name: 'App', //这是一个父组件,名称为App.vue
  data() {
    return {
      tableData: [], //表格数据
      column: [] //表格的列
    }
  },
  methods: {
    toExcel() {
      //调用我们封装好的方法,传3个参数过去,分别为:数据,文件名,回到函数(可根据自己需求决定回调是否需要)
      transform(this.tableData, '我是文件名', this.callback)
    },
    callback(info) {
      console.log(info)
    }
  },
  created() {
    //模拟网络请求
    this.tableData = [
      {
        index: 1,
        name: '我是1号',
        age: 18,
        sex: '男',
        hobby: 'web',
        hair: 'thick',
        salaried: '99999999'
      },
      {
        index: 2,
        name: '我是2号',
        age: 18,
        sex: '男',
        hobby: 'web',
        hair: 'thick',
        salaried: '99999999'
      },
      {
        index: 3,
        name: '我是3号',
        age: 18,
        sex: '男',
        hobby: 'web',
        hair: 'thick',
        salaried: '99999999'
      },
      {
        index: 4,
        name: '我是4号',
        age: 18,
        sex: '男',
        hobby: 'web',
        hair: 'thick',
        salaried: '99999999'
      },
      {
        index: 5,
        name: '我是5号',
        age: 18,
        sex: '男',
        hobby: 'web',
        hair: 'thick',
        salaried: '99999999'
      },
      {
        index: 6,
        name: '我是6号',
        age: 18,
        sex: '女',
        hobby: 'web',
        hair: 'thick',
        salaried: '99999999'
      },
      {
        index: 7,
        name: '我是7号',
        age: 18,
        sex: '女',
        hobby: 'web',
        hair: 'thick',
        salaried: '99999999'
      },
      {
        index: 8,
        name: '我是8号',
        age: 18,
        sex: '女',
        hobby: 'web',
        hair: 'thick',
        salaried: '99999999'
      },
      {
        index: 9,
        name: '我是9号',
        age: 18,
        sex: '女',
        hobby: 'web',
        hair: 'thick',
        salaried: '99999999'
      },
      {
        index: 10,
        name: '我是10号',
        age: 18,
        sex: '女',
        hobby: 'web',
        hair: 'thick',
        salaried: '99999999'
      },
      {
        index: 11,
        name: '我是11号',
        age: 18,
        sex: '男',
        hobby: 'web',
        hair: 'thick',
        salaried: '99999999'
      },
      {
        index: 12,
        name: '我是12号',
        age: 18,
        sex: '男',
        hobby: 'web',
        hair: 'thick',
        salaried: '99999999'
      },
      {
        index: 13,
        name: '我是13号',
        age: 18,
        sex: '女',
        hobby: 'web',
        hair: 'thick',
        salaried: '99999999'
      },
      {
        index: 14,
        name: '我是14号',
        age: 18,
        sex: '女',
        hobby: 'web',
        hair: 'thick',
        salaried: '99999999'
      },
      {
        index: 15,
        name: '我是15号',
        age: 18,
        sex: '男',
        hobby: 'web',
        hair: 'thick',
        salaried: '99999999'
      }
    ]
    this.column = [
      { key: 'index', title: '序号', width: 120 },
      { key: 'name', title: '姓名', width: 120 },
      { key: 'age', title: '年龄', width: 120 },
      { key: 'sex', title: '性别', width: 120 },
      { key: 'hobby', title: '爱好', width: 120 },
      { key: 'hair', title: '发量', width: 120 },
      { key: 'salaried', title: '薪水', width: 120 }
    ]
  }
}
</script>
<style lang="scss">
a {
  color: pink;
  font-size: 36px;
}
</style>

10日18日,星期五,在这里每天60秒读懂世界!

10日15日,星期二,在这里每天60秒读懂世界!

评 论
更换验证码