lulujianglab / blog

:bento:lulujiang blog
https://lulujianglab.com/
83 stars 4 forks source link

web端导出csv文件 #9

Open lulujianglab opened 6 years ago

lulujianglab commented 6 years ago

前言

导出文件,大部分方式还是服务端来处理的,通过服务端的方式生成文件,然后传递到客户端

但是,有时候可能就想使用web前端直接把页面上的内容导出来

前段时间做了一个多行多列导出页面的table表格,用的是a标签(支持firefox和Chrome)实现的(IE可以使用ActiveXObiect实现

忽视点

exportData(list) {
    let tableHeader = [{
       type: 'theme',
       name: '报表名称'
      },{...},...]
     let tableBody = []
     for (let item of list) {
        let object = {theme:'',...}
        object.theme = item.title.replace('{DATE}','')+'('+item.info+')'
         ...
         for (let to of item.to) {
           object.to += to + ";\n"
         }
         ...
        tableBody.push({
           theme : object.theme || '',
          ...
       })
    }  
    var csv = '\ufeff'
    var keys= []
    tableHeader.forEach(function(item){
       csv+='"'+item.name+'",'
       keys.push(item.type)
   })
   csv=csv.replace(/\,$/, '\n')
   tableBody.forEach(function(item){
      keys.forEach(function(key){
        csv+='"'+item[key] +'",'
     })
     csv=csv.replace(/\,$/, '\n')
  })
  csv=csv.replace(/"null"/g, '""') 
  var  blob=new Blob([csv],{
     type:'text/csv,charset=UTF-8'
  })
  var csvUrl=window.URL.createObjectURL(blob)
  var a=document.createElement('a')
  var now=newDate()
  function to2(num) {
     returnnum>9?num:'0'+num
  }
  a.download='报表信息导出'+now.getFullYear() +to2((now.getMonth() +1)) +to2(now.getDate()) 
  +to2(now.getHours()) +to2(now.getMinutes()) +to2(now.getSeconds()) +'.csv'
   a.href=csvUrl
   document.body.appendChild(a)
   a.click()
   document.body.removeChild(a)
 }

注:tableHead存放表头,tableBody存放表格内容 download设置下载的文件名 点击click是下载文件