【sheetjs】纯前端如何实现Excel导出下载和上传解析?

简介: 本文介绍了如何使用`sheetjs`的`xlsx`库在前端实现Excel的导出和上传。项目依赖包括Vite、React、SheetJS和Arco-Design。对于导出,从后端获取JSON数据,通过`json_to_sheet`、`book_new`和`writeFile`函数生成并下载Excel文件。对于上传,使用`read`函数将上传的Excel文件解析为JSON并发送至后端。完整代码示例可在GitHub仓库[fullee/sheetjs-demo](https://github.com/fullee/sheetjs-demo)中查看。

最近忙着做项目,Rust精华小册忙完项目就更新😁。近期文章总结一下项目中遇到的一些好玩的点。

本文介绍的是sheetjs下面的xlsx库, 它有付费版和开源版。付费版可以为表格设置好看的样式,开源版则没有这些功能。

Github仓库停留在两年前的版本了,最新的版本是自托管的,仓库地址如下:
https://git.sheetjs.com/sheetjs/sheetjs

首先,我们基于vite创建一个react的项目,然后将xlsx安装到我们的项目:

npm i --save https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz

整个项目用到了vite、react、sheetjs、arco-design(字节的ReactUI框架,类似antd)。

前端实现Excel导出下载

先说一下需求,我们从后端取到的json数据,经由前端处理成Excel的二进制格式,然后点击Button完成下载。

20240518113033_rec_.gif

这个需求比较简单,但要我们从零实现,还是会费一些功夫。好在有xlsx帮我们简化这个实现过程。

import {read, utils, writeFile} from "xlsx";

<button onClick={() => {
    // 假设我们从后端获取到的json如下
    const json = [
        {name: "George Washington", birthday: "1732-02-22"},
        {name: "John Adams", birthday: "1735-10-19"},
    ];
    // 构造sheet
    const worksheet = utils.json_to_sheet(json);
    // 构造workbook
    const workbook = utils.book_new();
    utils.book_append_sheet(workbook, worksheet, "Dates");
        // 默认使用json结构中的name和birthday作为表头,也可以使用下面代码自定义表头
        utils.sheet_add_aoa(worksheet, [['ID', '指标名称']], { origin: 'A1' });

    // 下载文件
    writeFile(workbook, "Presidents.xlsx", {compression: true});
}}>
    Download Excel
</button>

总结上面代码的步骤:

  1. 从后端获取json数据
  2. 将json构造为worksheet,并起一个名字叫做Dates。如图,可以将worksheet理解为一个Tab页。

Pasted image 20240518201947.png

  1. 将worksheet放到workbook中,一个workbook就是一个excel文件了。
  2. 最后一步就是下载Excel。

前端实现Excel上传解析

上传的需求是,点击上传按钮选择文件,然后通过xlsx这个库解析成json,整个都是过程是在浏览器中进行的。最后将json传给后端即可。示意图如下:

20240518113324_rec_.gif

同样,我们这里用到的解析库也是sheetjs提供的xlsx库。

import {read, utils, writeFile} from "xlsx";
import {Message, Upload} from "@arco-design/web-react";
import '@arco-design/web-react/dist/css/arco.min.css'

<Upload
    multiple
    action='https://developer.aliyun.com/'
    beforeUpload={async (file) => {
                // 将file对象转换为一个arrayBuffer
        const fileBuffer = await file.arrayBuffer()
                // 使用read函数解析为workbook对象
        const workbook = read(fileBuffer)

        console.log(workbook.SheetNames)
        console.log(workbook.Sheets)
                // 获取到第一个worksheet
        const first_sheet = workbook.Sheets[workbook.SheetNames[0]];
                // 将worksheet中的数据转换为json结构的数据
        const json = utils.sheet_to_json(first_sheet)
        Message.success(JSON.stringify(json))
        return Promise.reject();
    }}
/>

总结一下上面代码的步骤:

  1. 想办法获取到File对象,可以用input标签设为file类型,也可以像我这样使用UI提供的Upload组件。
  2. 将file对象转换为一个ArrayBuffer
  3. 使用read函数解析为workbook对象
  4. 获取到第一个worksheet
  5. 将worksheet中的数据转换为json结构的数据

详细的源码可以查看代码仓库:https://github.com/fullee/sheetjs-demo

好啦,如果文章对您有帮助,欢迎点赞收藏加关注,点赞越多更新越快,哈哈。下篇文章计划是总结一下项目中用到的React状态库zustand。

目录
相关文章
|
存储 前端开发 安全
前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
本文全面解析前端三种数据存储方式:Cookie、LocalStorage与SessionStorage。涵盖其定义、使用方法、生命周期、优缺点及典型应用场景,帮助开发者根据登录状态、用户偏好、会话控制等需求,选择合适的存储方案,提升Web应用的性能与安全性。(238字)
607 0
|
6月前
|
Web App开发 前端开发 JavaScript
前端性能优化利器:图片懒加载实战解析
前端性能优化利器:图片懒加载实战解析
|
5月前
|
人工智能 JSON 前端开发
如何解决后端Agent和前端UI之间的交互问题?——解析AG-UI协议的神奇作用
三桥君指出AG-UI协议通过SSE技术实现智能体与前端UI的标准化交互,解决流式传输、实时进度显示、数据同步等开发痛点。其核心功能包括结构化事件流、多Agent任务交接和用户中断处理,具有"一次开发到处兼容"、"UI灵活可扩展"等优势。智能体专家三桥君认为协议将AI应用从聊天工具升级为实用软件,适用于代码生成、多步骤工作流等场景,显著提升开发效率和用户体验。
1385 0
|
7月前
|
存储 前端开发 JavaScript
|
8月前
|
存储 前端开发 JavaScript
调用DeepSeek API增强版纯前端实现方案,支持文件上传和内容解析功能
本方案基于DeepSeek API增强版,提供纯前端实现的文件上传与内容解析功能。通过HTML和JavaScript,用户可选择文件并调用API完成上传及解析操作。方案支持多种文件格式(如PDF、TXT、DOCX),具备简化架构、提高响应速度和增强安全性等优势。示例代码展示了文件上传、内容解析及结果展示的完整流程,适合快速构建高效Web应用。开发者可根据需求扩展功能,满足多样化场景要求。
2768 64
|
6月前
|
JSON 前端开发 安全
前端开发中常用的鉴权方式解析与实践要点
本文深入探讨了前端开发中常用的鉴权方式,包括HTTP基本鉴权、Session-Cookie鉴权、Token验证、JWT(JSON Web Tokens)、单点登录(SSO)和OAuth等。文章首先明确了认证、授权、鉴权和权限控制的概念及关系,随后详细解析每种鉴权方式的工作原理、优缺点及适用场景。例如,HTTP基本鉴权简单但安全性低,适合内部网络;Session-Cookie鉴权易受CSRF攻击,适用于同域Web应用;Token和JWT无状态且扩展性好,适合分布式系统;SSO提升用户体验,适用于多系统统一登录;OAuth安全方便,适合第三方授权接入。
578 2
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
2881 65
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
10月前
|
前端开发
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
312 1
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
|
9月前
|
数据采集 存储 数据库连接
Requests与BeautifulSoup:高效解析网页并下载资源
Requests与BeautifulSoup:高效解析网页并下载资源
|
人工智能 搜索推荐 API
Cobalt:开源的流媒体下载工具,支持解析和下载全平台的视频、音频和图片,支持多种视频质量和格式,自动提取视频字幕
cobalt 是一款开源的流媒体下载工具,支持全平台视频、音频和图片下载,提供纯净、简洁无广告的体验
1972 9
Cobalt:开源的流媒体下载工具,支持解析和下载全平台的视频、音频和图片,支持多种视频质量和格式,自动提取视频字幕