JS将获取到的JSON数据导出excel表

  JS将获取到的JSON数据导出到excel表中,通常有两种方法,导出.cvs纯文本格式,优点是导出速度快,当数据量很大时可以优先考虑,缺点是纯文本是不能进行格式排版的,需要导出带排版格式的文件时,就需要导出成二进制格式的.xls文件。

1. 导出为.cvs文件

相信很多萌新不知道什么是cvs的?我这里简单介绍一下:
  逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。
  CSV是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。最广泛的应用是在程序之间转移表格数据,而这些程序本身是在不兼容的格式上进行操作的(往往是私有的和/或无规范的格式)。

我们来写的例子:

<html>
<meta charset=utf-8" />
<head>
    <p style="font-size: 20px;color: red;">使用a标签方式将json导出csv文件</p>
    <button onclick='JSONToExcel()'>导出</button>
</head>
<body>
<script>

    function JSONToExcel(){
        // 要导出的json数据,这部分数据可以来自ajax请求
        const jsonData = [
            {
                "name": "常健",
                "dept": "移动研发部",
                "id": "1",
                "attendance": 10,
                "rest": 20
            },
            {
                "name": "陈熙文",
                "dept": "移动研发部",
                "id": "2",
                "attendance": 20,
                "rest": 10
            },
            {
                "name": "迟野",
                "dept": "移动研发部",
                "id": "3",
                "attendance": 0,
                "rest": 30
            }
        ]
        //列标题,逗号隔开
        let str = `姓名,部门,id,考勤天数,休息天数\n`;
        //增加\t为了不让表格显示科学计数法或者其他格式
        for(let i = 0; i < jsonData.length; i++){
            for(let item in jsonData[i]){
                str+=`${jsonData[i][item] + '\t'},`;
            }
            str+='\n';
        }
        //encodeURIComponent解决中文乱码, \ufeff是 ""
        let uri = 'data:text/csv;charset=utf-8,\ufeff' + encodeURIComponent(str);
        //通过创建a标签实现
        let link = document.createElement("a");
        link.href = uri;
        //对下载的文件命名
        link.download =  "考勤月度统计.csv";
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
    }

</script>
</body>
</html>

2. 导出为.xls文件

  JS是支持导出二进制的xls格式的,只需要我们用 Blob类转化下,来看看是具体怎么用的。

<html>
<meta charset=utf-8" />
<head>
    <p style="font-size: 20px;color: red;">使用table标签方式将json导出xls文件</p>
    <button onclick='tableToExcel()'>导出</button>
</head>
<body>
<script>

    function tableToExcel() {
        //要导出的json数据
        const jsonData = [
            {
                "name": "常健",
                "dept": "移动研发部",
                "id": "1",
                "attendance": 10,
                "rest": 20
            },
            {
                "name": "陈熙文",
                "dept": "移动研发部",
                "id": "2",
                "attendance": 20,
                "rest": 10
            },
            {
                "name": "迟野",
                "dept": "移动研发部",
                "id": "3",
                "attendance": 0,
                "rest": 30
            }
        ]
        //列标题
        let str = '<tr><td>姓名</td><td>部门</td><td>id</td><td>考勤天数</td><td>休息天数</td></tr>';
        //循环遍历,每行加入tr标签,每个单元格加td标签
        for (let i = 0; i < jsonData.length; i++) {
            str += '<tr>';
            for (let item in jsonData[i]) {
                //增加\t为了不让表格显示科学计数法或者其他格式
                str += `<td>${jsonData[i][item]}</td>`;
            }
            str += '</tr>';
        }
        let excelHtml = `
        <html>
            <head>
             <meta charset='utf-8' />
            </head>
             <body>
                <table>
                  ${str}
                </table>
             </body>
        </html>
  `
        let excelBlob = new Blob([excelHtml], {type: 'application/vnd.ms-excel'})

        // 创建一个a标签
        let oA = document.createElement('a');
        // 利用URL.createObjectURL()方法为a元素生成blob URL
        oA.href = URL.createObjectURL(excelBlob);
        // 给文件命名
        oA.download = '考勤月历统计表.xls';
        // 模拟点击
        oA.click()
    }
</script>
</body>
</html>

.xls是可以写入排版格式的,直接上例子:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style media="screen">
        .tableA {
            border-collapse: collapse;
        }
        .tableA .title th{
            height: 50px;
            font-size: 24px;
            font-family: '微软雅黑';
            font-weight: 700;
        }
        .tableA tr th {
            border: 1px #000 solid;
            height: 40px;
            background: #efefef;
        }
        .tableA tr td {
            padding: 0 40px;
            border: 1px #000 solid;
            height: 40px;
            text-align: center;
        }
        .tableA .footer td {
            font-size: 20px;
            font-weight: 700;
        }
    </style>
</head>
<body>
<table bordercolor="black" class="tableA">
    <tr class="title">
        <th colspan="4">学生信息</th>
    </tr>
    <tr>
        <th>名字</th>
        <th>性别</th>
        <th>年龄</th>
        <th>班级</th>
    </tr>
    <tr>
        <td>小明</td>
        <td>男</td>
        <td>19</td>
        <td>1班</td>
    </tr>
    <tr>
        <td>小黄</td>
        <td>男</td>
        <td>20</td>
        <td>2班</td>
    </tr>
    <tr>
        <td>老王</td>
        <td>男</td>
        <td>29</td>
        <td>3班</td>
    </tr>
    <tr class="footer">
        <td colspan="4">总人数:3人</td>
    </tr>
</table>
<script>
    let oHtml = document.getElementsByClassName('tableA')[0].outerHTML;
    let excelHtml = `
    <html>
      <head>
        <meta charset='utf-8' />
        <style>
          .tableA {
            border-collapse: collapse;
          }
          .tableA .title th{
            height: 50px;
            font-size: 24px;
            font-family: '微软雅黑';
            font-weight: 700;
          }
          .tableA tr th {
            border: 1px #000 solid;
            height: 40px;
            background: #efefef;
          }
          .tableA tr td {
            padding: 0 40px;
            border: 1px #000 solid;
            height: 40px;
            text-align: center;
          }
          .tableA .footer td {
            font-size: 20px;
            font-weight: 700;
          }
        </style>
      </head>
      <body>
        ${oHtml}
      </body>
    </html>
  `
    let excelBlob = new Blob([excelHtml], {type: 'application/vnd.ms-excel'})
    // 创建一个a标签
    let oA = document.createElement('a');
    // 利用URL.createObjectURL()方法为a元素生成blob URL
    oA.href = URL.createObjectURL(excelBlob);
    // 给文件命名
    oA.download = '学生名单.xls';
    // 模拟点击
    oA.click();
</script>
</body>
</html>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352