【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='/'
    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。

相关文章
|
8天前
|
机器学习/深度学习 编解码 前端开发
探索无界:前端开发中的响应式设计深度解析####
【10月更文挑战第29天】 在当今数字化时代,用户体验的优化已成为网站与应用成功的关键。本文旨在深入探讨响应式设计的核心理念、技术实现及最佳实践,揭示其如何颠覆传统布局限制,实现跨设备无缝对接,从而提升用户满意度和访问量。通过剖析响应式设计的精髓,我们将一同见证其在现代Web开发中的重要地位与未来趋势。 ####
33 7
|
10天前
|
编解码 前端开发 UED
探索无界:前端开发中的响应式设计深度解析与实践####
【10月更文挑战第29天】 本文深入探讨了响应式设计的核心理念,即通过灵活的布局、媒体查询及弹性图片等技术手段,使网站能够在不同设备上提供一致且优质的用户体验。不同于传统摘要概述,本文将以一次具体项目实践为引,逐步剖析响应式设计的关键技术点,分享实战经验与避坑指南,旨在为前端开发者提供一套实用的响应式设计方法论。 ####
35 4
|
14天前
|
前端开发 Java easyexcel
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
53 8
|
17天前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
24 4
|
19天前
|
缓存 前端开发 JavaScript
"面试通关秘籍:深度解析浏览器面试必考问题,从重绘回流到事件委托,让你一举拿下前端 Offer!"
【10月更文挑战第23天】在前端开发面试中,浏览器相关知识是必考内容。本文总结了四个常见问题:浏览器渲染机制、重绘与回流、性能优化及事件委托。通过具体示例和对比分析,帮助求职者更好地理解和准备面试。掌握这些知识点,有助于提升面试表现和实际工作能力。
54 1
|
19天前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
27 1
|
20天前
|
前端开发 API
前端界面生成PDF并导出下载
【10月更文挑战第21天】利用合适的第三方库,你可以在前端轻松实现界面生成 PDF 并导出下载的功能,为用户提供更方便的文档分享和保存方式。你还可以根据具体的需求进一步优化和定制生成的 PDF 文件,以满足不同的业务场景要求。
|
24天前
|
缓存 前端开发 JavaScript
前端的全栈之路Meteor篇(二):容器化开发环境下的meteor工程架构解析
本文详细介绍了使用Docker创建Meteor项目的准备工作与步骤,解析了容器化Meteor项目的目录结构,包括工程准备、环境配置、容器启动及项目架构分析。提供了最佳实践建议,适合初学者参考学习。项目代码已托管至GitCode,方便读者实践与交流。
|
22天前
|
人工智能 资源调度 数据可视化
【AI应用落地实战】智能文档处理本地部署——可视化文档解析前端TextIn ParseX实践
2024长沙·中国1024程序员节以“智能应用新生态”为主题,吸引了众多技术大咖。合合信息展示了“智能文档处理百宝箱”的三大工具:可视化文档解析前端TextIn ParseX、向量化acge-embedding模型和文档解析测评工具markdown_tester,助力智能文档处理与知识管理。

推荐镜像

更多