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

相关推荐
2501_920931703 小时前
React Native鸿蒙跨平台采用ScrollView的horizontal属性实现横向滚动实现特色游戏轮播和分类导航
javascript·react native·react.js·游戏·ecmascript·harmonyos
0思必得05 小时前
[Web自动化] Selenium处理动态网页
前端·爬虫·python·selenium·自动化
东东5165 小时前
智能社区管理系统的设计与实现ssm+vue
前端·javascript·vue.js·毕业设计·毕设
catino5 小时前
图片、文件的预览
前端·javascript
2501_920931707 小时前
React Native鸿蒙跨平台实现推箱子游戏,完成玩家移动与箱子推动,当所有箱子都被推到目标位置时,玩家获胜
javascript·react native·react.js·游戏·ecmascript·harmonyos
layman05287 小时前
webpack5 css-loader:从基础到原理
前端·css·webpack
半桔7 小时前
【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典
前端·css·html
AI老李7 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·postcss
_OP_CHEN7 小时前
【前端开发之CSS】(一)初识 CSS:网页化妆术的终极指南,新手也能轻松拿捏页面美化!
前端·css·html·网页开发·样式表·界面美化
啊哈一半醒8 小时前
CSS 主流布局
前端·css·css布局·标准流 浮动 定位·flex grid 响应式布局