前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >前端导出excel

前端导出excel

作者头像
EchoROne
发布2022-08-15 08:27:36
2.7K0
发布2022-08-15 08:27:36
举报
文章被收录于专栏:玩转大前端

公司做项目需要前端导出 excel,因此查了许多,总结出前端导出 excel 的三种方法(如不全面,请更正)

  1. 通过传入 tableId 导出excel,此时 table 已生成

2. 通过传入 json 数据导出excel

3. 通过后端导出excel

一、通过传入tableId导出excel

寻找到了一个用法简单而且输出的excel表格也好看的excel插件,这是用法链接 http://www.jq22.com/jquery-info19771导出的excel如下

![image.png](https://upload-images.jianshu.io/upload_images/4573742-338d1c40b7f8753e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

在ie9下会报blob不存在,可以通过下载jquery.base64.js https://github.com/yckart/jquery.base64.js解决,然后在报错的地方中插入代码即可

代码语言:javascript
复制
if (!window.btoa) window.btoa = $.base64.btoa
if (!window.atob) window.atob = $.base64.atob

但是在ie9下还是有其他兼容问题,比如promise等(排除一个兼容又有一个,在ie9还是导不出来),最后采用ie9独有的ActiveXObject来导出,而其他浏览器则还是采用ExcelGen插件导出

代码语言:javascript
复制
    // 导出excel
    function exportExcel(tableId, fileName) {
        // ie导出excel需用activex
        if (window.ActiveXObject) {
            var curTbl = document.getElementById(tableId);
            var oXL = new ActiveXObject("Excel.Application");

            //创建AX对象excel 
            var oWB = oXL.Workbooks.Add();
            //获取workbook对象 
            var xlsheet = oWB.Worksheets(1);
            //激活当前sheet 
            var sel = document.body.createTextRange();
            sel.moveToElementText(curTbl);
            //把表格中的内容移到TextRange中 
sel.select;
            //全选TextRange中内容 
            sel.execCommand("Copy");
            //复制TextRange中内容  
            xlsheet.Paste();
            //粘贴到活动的EXCEL中       
            oXL.Visible = true;
            //设置excel可见属性

            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);
//xls.visible = false;
                oXL.Quit();
                oXL = null;
                //结束excel进程,退出完成
//window.setInterval("Cleanup();",1);
                idTmr = window.setInterval("Cleanup();", 1);

            }

        } else {
            excel = new ExcelGen({
                "src_id": tableId,
                "show_header": true,
                "file_name": fileName
            })
            excel.generate();

        }
    }

最后虽然已经兼容ie9了但是缺点是得用户允许开启activex控件而且输出的样式也不够美观。

另外这个方法有个弊端,就是所要导出的table必须已经在dom中渲染出来,因此也只能导出一页的表格数据。自己想了个不太优雅但能完美解决但的方法是点击导出按钮时在html中插入一个隐藏的不做分页的表格,然后根据这个tableid来导出(点击导出再渲染表格能提高一点性能),数据量过大时就性能会差

二、通过传入json数据导出excel

通过将json遍历进行字符串拼接,将字符串输出到csv文件,输出的文件不会再是html类型的文件而是真正的csv文件,代码如下

代码语言:javascript
复制
<html>
<head>
  <p style="font-size: 20px;color: red;">使用a标签方式将json导出csv文件</p>
  <button onclick='tableToExcel()'>导出</button>
</head>
<body>
  <script>
    function tableToExcel(){
      //要导出的json数据
      var jsonData = [
        {
          name:'路人甲',
          phone:'123456789',
          email:'000@123456.com'
        },
        {
          name:'炮灰乙',
          phone:'123456789',
          email:'000@123456.com'
        },
        {
          name:'土匪丙',
          phone:'123456789',
          email:'000@123456.com'
        },
        {
          name:'流氓丁',
          phone:'123456789',
          email:'000@123456.com'
        },
      ]
      //列标题,逗号隔开,每一个逗号就是隔开一个单元格
      let str = `姓名,电话,邮箱\n`;
      //增加\t为了不让表格显示科学计数法或者其他格式
      for(let i = 0 ; i < jsonData.length ; i++ ){
        for(let item in jsonData[i]){
            str+=`${jsonData[i][item] + '\t'},`;     
        }
        str+='\n';
      }
      //encodeURIComponent解决中文乱码
      let uri = 'data:text/csv;charset=utf-8,\ufeff' + encodeURIComponent(str);
      //通过创建a标签实现
      var link = document.createElement("a");
      link.href = uri;
      //对下载的文件命名
link.download =  "json数据表.csv";
      document.body.appendChild(link);
link.click();
      document.body.removeChild(link);
    }
</script>
</body>
</html>

这个方法同样在ie9上兼容性差,亲测导出的excel会带上meta、head等标签信息

三、后端导出excel

其实下载以及导出文件基本上都是后端操作,这样不用考虑兼容性,也只有后端才能读取下载文件。可以用nodejs来导出excel,本人正在学习中,后期更新

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-11-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、通过传入tableId导出excel
  • 二、通过传入json数据导出excel
  • 三、后端导出excel
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档