不用第三方库,说说纯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 来实现功能。

相关推荐
xy34536 分钟前
Axure 9.0 中继器创建与设置步骤
前端·ui·html·axure·原型·产品设计
FEF前端团队6 分钟前
01# Vibe Coding工作流设计思维:前端开发者的协作框架
前端·cursor·vibecoding
计算机魔术师14 分钟前
OpenAI 发布模型错位报告框架,披露未发布模型自行修改自身指令案例
前端
特创数字科技17 分钟前
公文Word一键批量排版工具|批量统一公文标准格式,办公自动化桌面小工具
前端·python
流水白开22 分钟前
JavaScript的原型链、类与类的继承
前端·javascript
PedroQue9925 分钟前
修复 .uvue 页面路径残留问题
前端·vite
颜进强33 分钟前
从零搭一套 WorkBuddy Skill 骨架:调接口 → 生成 HTML 报告的分层设计与流转拆解
前端·后端·ai编程
YHL38 分钟前
🔍 结构化输出:从 `JSON.parse` 到 `withStructuredOutput` 的三级火箭
前端·深度学习
YHL40 分钟前
🚰流式输出:把 LLM 的每个字,像水一样送到浏览器
前端·javascript