前端读取和生成excel文件

1. 基于 xlsx 的js库读取和生成excel文件

  • 可以用于生成和读取 excel表格
  • 前端和node端均可使用
  • 支持单元格合并
  • 支持数组数据和对象格式数据生成excel, html, csv 文件
  • 参考博客: https://blog.csdn.net/lgd1917/article/details/122449774
  • npm 上有详细教程和相关api

2. 下载

  • cdn <script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script>

  • es module yarn add xlsx

  • 引入 import * as XLSX from 'xlsx'

  • node const XLSX = require('xlsx')

3. 读取excel 内容

  • 上传excel文件,并读取内容
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input type="file" id="excel-file">
</body>
</html>
<script src="xlsx.core.min.js"></script>
<script>
    const excelDom = document.getElementById('excel-file')
    excelDom.onchange = function(e) {
            var files = e.target.files; // 文件对象
            var fileReader = new FileReader();
            fileReader.onload = function(ev) {
                try {
                    var data = ev.target.result// 文件内容
                     const   workbook = XLSX.read(data, {
                            type: 'binary'
                        }) // 以二进制流方式读取得到整份excel表格对象
                      console.log('111222333',workbook)

                } catch (e) {
                    console.log('文件类型不正确');
                    return;
                }

            };
            // 以二进制方式打开文件
            fileReader.readAsBinaryString(files[0]);
        };
</script>

4. 前端导出excel文件

  • 点击按钮导出excel文件
  • 支持数组数据和对象格式数据
  • 合并单元格
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <button onclick="excelDownload()">点击下载</button>
</body>
</html>
<script src="xlsx.core.min.js"></script>
<script>

function excelDownload(){
    const arrData = [
        ['姓名','年龄','性别'],
        ['剌世勇','25','男'],
        ['王小明','36','女'],
        ['王小红','72','人妖']
    ]
    const jsonData = [
        { A:"表头1", B:"表头2", C:"表头3", D:"表头4", E:"表头5", F:"表头6", G:"表头7" },
        { A: 1,  B: 2,  C: 3,  D: 4,  E: 5,  F: 6,  G: 7  },
        { A: 2,  B: 3,  C: 4,  D: 5,  E: 6,  F: 7,  G: 8  }
    ]
    const jsonOptions = {
        skipHeader:true  // 默认会用object key作为表头,true 不输出表头
    }
    var workbook = XLSX.utils.book_new(); // 创建一个工作簿 // 可以比作一个excel文件
    var worksheet1 = XLSX.utils.aoa_to_sheet(arrData); // 添加数据到sheet表中 生成 sheet 表
    var worksheet2 = XLSX.utils.json_to_sheet(jsonData,jsonOptions);
       worksheet2['!merges'] = [
                // 设置A1-C1的单元格合并
               {
                s: {//s为开始
                    c: 0, //  开始列
                    r: 0  //  开始行
                },
                e: {//e结束
                    c: 2,  // 结束列
                    r: 0   // 结束行
                }
               }
            ];
    XLSX.utils.book_append_sheet(workbook, worksheet1, 'sheet_name_1');// 将sheet表添加到工作簿中,可以添加多个
    XLSX.utils.book_append_sheet(workbook, worksheet2, 'sheet_name_2');
    var wopts = {
            // 要生成的文件类型
            bookType: 'xlsx',
            bookSST: false,
            type: 'array'
        };
        var wbout = XLSX.write(workbook, wopts); // 将工作簿 以二进制写进内存中//生成文件数据
        const blob = new Blob([wbout]); // 生成 blob对象
        const url = URL.createObjectURL(blob);// 创建一个url 用于 a链接下载
        const aDom = document.createElement('a') // 创建a标签
        aDom.href = url; // 指向下载地址
        // 指定download属性为下载
        aDom.download="xx.xlsx" // 指定下载文件名称 // 指明文件后缀 否则会是txt文件
        // 自动触发点击事件
        aDom.click()
}
</script>

5. node端 生成 execl文件

var XLSX = require("xlsx");
const path = require('path')
function excelDownload(){
    const arrData = [
        ['姓名','年龄','性别'],
        ['剌世勇','25','男'],
        ['王小明','36','女'],
        ['王小红','72','人妖']
    ]
    const jsonData = [
        { A:"表头1", B:"表头2", C:"表头3", D:"表头4", E:"表头5", F:"表头6", G:"表头7" },
        { A: 1,  B: 2,  C: 3,  D: 4,  E: 5,  F: 6,  G: 7  },
        { A: 2,  B: 3,  C: 4,  D: 5,  E: 6,  F: 7,  G: 8  }
    ]
    const jsonOptions = {
        skipHeader:true  // 默认会用object key作为表头,true 不输出表头
    }
    var workbook = XLSX.utils.book_new(); // 创建一个工作簿 // 可以比作一个excel文件
    var worksheet1 = XLSX.utils.aoa_to_sheet(arrData); // 添加数据到sheet表中 生成 sheet 表
    var worksheet2 = XLSX.utils.json_to_sheet(jsonData,jsonOptions);
       worksheet2['!merges'] = [
                // 设置A1-C1的单元格合并
               {
                s: {//s为开始
                    c: 0, //  开始列
                    r: 0  //  开始行
                },
                e: {//e结束
                    c: 2,  // 结束列
                    r: 0   // 结束行
                }
               }
            ];
    XLSX.utils.book_append_sheet(workbook, worksheet1, 'sheet_name_1');// 将sheet表添加到工作簿中,可以添加多个
    XLSX.utils.book_append_sheet(workbook, worksheet2, 'sheet_name_2');
    var wopts = {
            // 要生成的文件类型
            bookType: 'xlsx',
            bookSST: false,
            type: 'array'
        };
    const _path = path.resolve(__dirname,'xx.xlsx')
    // XLSX.writeFile(workbook, _path,wopts); //同步写入 将工作簿 以二进制写进文件中 
    XLSX.writeFileAsync(_path, workbook,wopts, (...arr) =>{// 异步写入文件
            console.log('112233',arr)
    })
}

excelDownload()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值