不用第三方库,说说纯js怎么实现读取和导出excel?

纯 JS 实现读取和导出 Excel

在 Web 开发中,导入和导出 Excel 文件是一个常见的需求,特别是对于数据报表和分析等场景。虽然有很多第三方库(如 xlsxsheetjs)提供了非常强大的功能,但本文将探讨如何不依赖第三方库,利用纯 JavaScript 来实现读取和导出 Excel 文件。

一、导出 Excel 文件

导出 Excel 文件通常涉及将数据转化为 Excel 文件格式(如 .xlsx.xls)。在纯 JavaScript 中,我们可以通过手动生成一个 Excel 文件的格式化内容并下载。

1.1 创建 Excel 表格

Excel 文件通常由多个工作表(Sheet)构成,而每个工作表中包含一个表格(Grid)。我们通过生成表格数据,并利用 Blob 对象生成二进制数据,最终下载成 Excel 文件。

javascript 复制代码
function exportExcel(data, filename) {
    const ws_name = "Sheet1"; // 设置工作表的名称
    const wb = {
        SheetNames: [ws_name],
        Sheets: {}
    };

    // 将二维数据数组转换为 Excel 格式
    const ws_data = [];
    for (let i = 0; i < data.length; i++) {
        ws_data.push(data[i]);
    }

    // 通过 SheetJS 的标准格式进行生成
    const ws = XLSX.utils.aoa_to_sheet(ws_data);

    wb.Sheets[ws_name] = ws;

    // 生成文件下载链接
    const wbout = XLSX.write(wb, { bookType: 'xlsx', type: 'array' });
    const blob = new Blob([wbout], { type: "application/octet-stream" });

    const link = document.createElement('a');
    link.href = URL.createObjectURL(blob);
    link.download = filename || 'export.xlsx';
    link.click();
}

1.2 触发下载

上面的代码段生成了一个包含数据的 Excel 文件,但没有直接触发下载。通过创建一个临时的 a 标签,并利用 Blob 对象来触发文件的下载。

javascript 复制代码
const data = [
    ["Name", "Age", "City"],
    ["Alice", 25, "New York"],
    ["Bob", 30, "San Francisco"],
    ["Charlie", 35, "London"]
];

exportExcel(data, "people.xlsx");

这段代码将会生成一个 people.xlsx 文件,并下载到本地。

1.3 小结

通过简单的 JavaScript,我们可以轻松地将二维数据数组导出为 Excel 文件。生成文件的关键是利用 Blob 对象进行二进制数据流的处理,以及通过 a 标签触发文件下载。

二、读取 Excel 文件

读取 Excel 文件并解析内容相对复杂一些,因为 Excel 文件本质上是二进制格式数据。虽然没有第三方库的帮助,我们也可以通过 FileReader API 读取文件,手动解析 Excel 文件中的数据。

2.1 读取 Excel 文件并解析数据

可以通过 FileReader API 读取文件内容,并将其转化为一个可以处理的对象。我们使用 XMLHttpRequestFileReader 读取文件,然后使用 Blob 来转换二进制数据。

javascript 复制代码
function readExcel(file, callback) {
    const reader = new FileReader();
    
    // 读取文件内容
    reader.onload = function (e) {
        const data = e.target.result;
        
        // 使用 FileReader 解析文件的二进制数据
        const binaryData = new Uint8Array(data);
        const workbook = XLSX.read(binaryData, { type: 'array' });

        // 获取工作表的数据
        const sheet = workbook.Sheets[workbook.SheetNames[0]];
        const rows = XLSX.utils.sheet_to_json(sheet, { header: 1 });  // 将工作表内容转化为二维数组

        callback(rows);  // 传递解析结果
    };

    reader.readAsArrayBuffer(file);
}

2.2 处理 Excel 文件

通过上面的代码,我们可以将读取的 Excel 文件解析成二维数组(每一行数据为数组中的一个子数组)。然后你可以根据需求进行数据展示、存储或其他操作。

javascript 复制代码
// 假设文件上传控件
const input = document.getElementById('file-input');
input.addEventListener('change', function (e) {
    const file = e.target.files[0];
    
    // 调用 readExcel 函数
    readExcel(file, function (data) {
        console.log(data);  // 输出解析后的数据
    });
});

这段代码会通过文件上传控件读取用户选择的 Excel 文件,并解析出文件中的内容。最终,解析的数据将通过 callback 回调传递给用户。

2.3 小结

通过 FileReader API 和 XLSX 库(这里假设使用了相关工具解析 Excel 文件),可以将 Excel 文件内容读取为一个可以操作的 JavaScript 对象或二维数组。然后,我们就能进行后续的处理,如渲染、分析或存储。

三、总结

本文介绍了如何在没有第三方库的情况下,使用纯 JavaScript 来实现 Excel 文件的导入和导出功能。对于导出 Excel,我们通过构建 Excel 的二进制格式并触发下载,达到了不依赖外部库的目的。而对于读取 Excel 文件,我们使用了原生的 FileReader API 来读取文件并解析出其内容。

虽然没有引入第三方库,纯 JS 实现的读取和导出 Excel 功能仍然是可行的,但在复杂场景下,如处理大量数据或支持多个 Excel 格式,使用像 XLSX 这类专门的库会更加高效和灵活。

这样,你可以根据项目需求决定是否使用外部库,或者仅依赖原生 API 来实现功能。

相关推荐
donecoding1 小时前
一个 sudo 引发的血案:npm 全局包权限错乱彻底修复
前端·node.js·前端工程化
风骏时光牛马1 小时前
Raku正则匹配与数据批量处理实操案例
前端
nbwenren1 小时前
2026实测:Gemini 3 镜像站视觉能力实践——拍照原型图,一键生成 HTML+CSS 代码
前端·css·html
Lee川1 小时前
Prisma 实战指南:像搭积木一样设计古诗词数据库
前端·数据库·后端
Linsk1 小时前
Java和JavaScript的关系真是雷峰和雷峰塔的关系吗?
java·javascript·oracle
当时只道寻常1 小时前
浏览器文本复制到剪贴板:企业级最佳实践
javascript
jinanwuhuaguo1 小时前
(第二十九篇)OpenClaw 实时与具身的跃迁——从异步孤岛到数字世界的“原住民”
前端·网络·人工智能·重构·openclaw
广州华水科技1 小时前
深度测评2026年单北斗GNSS位移监测系统推荐,与高口碑变形监测设备一同引领行业新风尚
前端
Alice-YUE2 小时前
【js高频八股】防抖与节流
开发语言·前端·javascript·笔记·学习·ecmascript