使用SheetJS读写Excel文件

2023-11-14

目的

项目中有一个Excel转JSON的工具,之前这个工具一直使用 Pythonopenpyxl 库来编写的,然后使用 pyinstaller 打包成 .exe 文件。之前这个工具只是个命令行工具,不带界面的。现在项目升级,打算使用Web前端方式重写这个工具,调整部分功能并新增图形界面。这篇文章中将使用 SheetJS 来操作Excel文件,对相关操作进行简单记录。
在这里插入图片描述

基础说明

前端操作Excel文件比较常用的库有 SheetJSExcelJS

先说说 ExcelJS

项目地址:https://github.com/exceljs/exceljs

这个库是完全开源的,所有功能都开放使用,这是它相比 SheetJS 的优势。不过最后我没有使用这个库的原因有二:

  • 取单元格使用 ws.getCell('A1') 方式,和 openpyxl 使用 ws['A1'] 方式取单元格相比稍显复杂;
  • 没从文档中找到获取所有合并的单元格信息的方法(虽然最后查看源码可以用 ws._merges 方式来获取合并单元格信息);

再说说 SheetJS

官方页面:https://sheetjs.com/
项目地址:https://github.com/SheetJS/sheetjs

这个库最大的问题就是分为社区版(CE)和专业版(Pro),专业版才是完整功能的版本,支持完整的样式设置、图表、图像处理等功能。当然只是一般的数据读写等操作的话社区版也够用了。

这个库可以使用 ws['A1'] 方式取单元格,操作上人性化些。

SheetJS 可以直接在前端页面中使用,也可以以构建方式使用或是后端使用,这里以接在前端页面中使用进行说明。

<!-- use version 0.19.1 -->
<script lang="javascript" src="https://cdn.sheetjs.com/xlsx-0.19.1/package/dist/xlsx.full.min.js"></script>

<!-- use the latest version -->
<script lang="javascript" src="https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js"></script>

读取

读取Excel文件操作比较简单,从原始数据中获取工作簿,从工作簿中获取工作表,从工作表中获取单元格数据,基本上就是这个流程了。下面是示例代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <script src="https://cdn.sheetjs.com/xlsx-0.19.1/package/dist/xlsx.full.min.js"></script>
    <script>
        // 从文件数据中解析出excel内容
        function parse(data) {
            const workbook = XLSX.read(data); // 从原始数据获取工作簿
                                              // 后端使用可以使用 readFile() 方法直接读取文件

            var first_sheet_name = workbook.SheetNames[0]; // 获得第一个工作表名称

            const worksheet = workbook.Sheets[first_sheet_name]; // 获取工作表

            console.log(worksheet['A1']); // 读取并打印A1端元格数据

            console.log(worksheet['!merges']); // 打印所有合并单元格信息数组
            
            console.log(worksheet['!ref']); // 打印输出当前工作表使用的范围
        }

        // 读取文件数据
        function read(file) {
            let reader = new FileReader();
            reader.onload = function (e) {
                parse(e.target.result);
            };
            reader.readAsArrayBuffer(file);
        }
    </script>
</head>

<body>
    <input type="file" onchange="read(this.files[0])" /><br>
</body>

</html>

下面是单元格数据获取演示:
获取单元格数据时,如果有内容会返回一个对象,对象中 t 表示数据类型( s 表示字符串、 n 表示数值……), v 为原始数据, w 为格式化后的文本……。更多内容可以参考下面链接:
https://docs.sheetjs.com/docs/csf/cell/
如果单元格为空则返回 undefined 。对于合并单元格而言其内容位于左上角的格子。
在这里插入图片描述

下面是获取合并单元格信息的演示:
下图中 s 表合并单元格的左上格子,e 表示右下格子; c 表示列序号(从0开始), r 表示行序号(从0开始)。
在这里插入图片描述

事实上 A1 C3 这种表达是Excel中对于单元格的描述,在SheetJS中使用的是 {r:x, c:x} 的方式,两者之间可以通过下面方式转换:

let jsaddr = XLSX.utils.decode_cell("A2"); // 得到{r:1, c:0}
let rawaddr = XLSX.utils.encode_cell({r:1, c:0}); // 得到A2

let jsaddrr = XLSX.utils.decode_range("A1:D3"); // 得到{ s: { c: 0, r: 0 }, e: { c: 3, r: 2 } }
let rawaddrr = XLSX.utils.encode_range({ s: { c: 0, r: 0 }, e: { c: 3, r: 2 } }); // 得到A1:D3

写入

写入操作主要也是处理工作簿、工作表、单元格子等内容,常用的一些操作如下:

let workbook = XLSX.utils.book_new(); // 新建工作簿
let workbook = XLSX.utils.table_to_book(table); // 从dom的table元素新建工作簿

// 也可以直接操作现有的工作簿

let worksheet = XLSX.utils.aoa_to_sheet(data); // 从二维数组新建工作表
let worksheet = XLSX.utils.json_to_sheet(data); // 从json数据新建工作表
let worksheet = XLSX.utils.table_to_sheet(table); // 从dom的table元素新建工作表

XLSX.utils.book_append_sheet(workbook, worksheet, "sheet1"); // 将工作表添加到工作簿

XLSX.utils.sheet_add_aoa(worksheet, data, { origin: "A1" }); // 将二维数组添加到工作表
XLSX.utils.sheet_add_json(worksheet, data, { origin: "A1" }); // 将json数据添加到工作表
XLSX.utils.sheet_add_dom(worksheet, table, { origin: "A1" }); // 将dom的table元素添加到工作表

// 合并单元格就是设置其合并的信息
if(!worksheet["!merges"]) worksheet["!merges"] = [];
worksheet["!merges"].push(XLSX.utils.decode_range("B3:D4"));

let html = XLSX.utils.sheet_to_html(worksheet); // 将工作表内容转成html
let json= XLSX.utils.sheet_to_json(worksheet); // 将工作表内容转成json
let csv = XLSX.utils.sheet_to_csv(worksheet); // 将工作表内容转成csv格式文本
let txt = XLSX.utils.sheet_to_txt(worksheet); // 将工作表内容转成UTF16文本

let data = XLSX.write(workbook, opts); // 生成文档数据
XLSX.writeFile(workbook, filename, opts); // 生成文档文件,浏览器环境中将直接下载
XLSX.writeFileAsync(filename, workbook, opts, cb); // 生成文档文件,浏览器环境中将直接下载
XLSX.writeFileXLSX(workbook, filename, opts); // 生成.xlsx格式文件,浏览器环境中将直接下载

下面是个简单的写入操作示例代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <script src="https://cdn.sheetjs.com/xlsx-0.19.1/package/dist/xlsx.full.min.js"></script>
    <script>
        function download() {
            const workbook = XLSX.utils.book_new(); // 新建工作簿

            const worksheet = XLSX.utils.aoa_to_sheet([[22, 333]]); // 从二维数组新建工作表

            XLSX.utils.sheet_add_aoa(worksheet, [["Naisu"]], { origin: 'C2' }); // 向单元格写数据
            XLSX.utils.sheet_add_aoa(worksheet, [[233]], { origin: 'A3' }); // 向单元格写数据
            
            worksheet["!merges"] = [XLSX.utils.decode_range("B3:D4")]; // 合并单元格

            XLSX.utils.book_append_sheet(workbook, worksheet, "sheet1"); // 将工作表添加到工作簿

            XLSX.writeFileXLSX(workbook, 'myfile.xlsx'); // 将工作簿数据建立为./xlsx文件(浏览器环境下会直接下载)
        }
    </script>
</head>

<body>
    <button onclick="download()">下载</button>
</body>

</html>

在这里插入图片描述

总结

SheetJS 的基础使用是比较简单的,更多内容可以参考官方文档。另外也有中文文档可供参考:
https://github.com/rockboom/SheetJS-docs-zh-CN

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用SheetJS读写Excel文件 的相关文章

随机推荐

  • matlab作图两侧留白太多的问题

    用matlab作图时 经常发生图片两侧留白太多的情况 用LaTeX写论文时 插入图片如果两侧留白太多 会使图片整体变小 格式排版以及图片清晰度都大打折扣 下面总结两种解决方式 1 当图片为单张图片时 直接选择文件 gt 导出设置 在导出设置
  • 用空闲时间做了一个小程序

    一直在摸鱼中赚钱的大家好呀 自从接触了小程序开发之后 就想做一个自己的小程序项目 这不 从摸鱼时间中挤出了部分空闲时间不断完善和踩坑 一点点的墨迹出来了 由于我自己做出来的界面不能说富丽堂皇 但是确实也上不了台面 所以高价聘请知名设计师设计
  • zookeeper基础环境搭建及启动脚本

    zookeeper功能 1 可以为客户端管理少量数据 数据库 2 可以为客户端监听节点的状态 并在数据节点发生变化时通知客户端 3 场景 动态增加服务器 1 上传安装包 解压 tar zxvf name C apps 2 改名字 cp zo
  • 金山云AI新突破:集智高清让带宽降下去让画质升上来

    眼观六路 耳听八方 大脑 情绪和注意力均处在亢奋状态 运用各种招术攻击对手的同时也能巧妙防御 游戏直播为万千玩家提供了观摩高手过招的绝好机会 很多职业选手也由此拥有了大批粉丝 进一步增添了游戏的魅力 游戏如今已从亚文化向主流文化蔓延 而对于
  • 【构建ML驱动的应用程序】第 2 章 :制定计划

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 25 道常见的 TypeScript 面试题及答案

    前端Q 我是winty 专注分享前端知识和各类前端资源 乐于分享各种有趣的事 关注我 一起做个有趣的人 公众号 点击上方 前端Q 关注公众号 回复加群 加入前端Q技术交流群 编辑整理 杨小爱 TypeScript 是一种静态类型的 面向对象
  • Python爬虫获取Csdn文章

    request获取html 安装 pip install requests 使用 import requests HTTP请求 GET POST PUT DELETE HEAD OPTIONS get res requests get ht
  • YOLOv5(PyTorch)目标检测:原理与源码解析

    PyTorch版YOLOv5目标检测 原理与源码解析 课程链接 https edu csdn net course detail 31428 Linux创始人Linus Torvalds有一句名言 Talk is cheap Show me
  • ReentrantLock实现PV操作-模拟多线程竞争数据库连接池资源场景

    使用ReentrantLock Condition模拟PV操作 实现多线程竞争数据库连接池资源 资源耗尽后阻塞等待 归还资源后唤醒阻塞线程的场景 代码中为10个线程竞争5个数据库连接资源 ConnectionPool class 连接池 C
  • 极光推送 别名

    今天做极光推送 做完了 总结一下 方便下次查看 极光推送 别名推送 可以点对点通讯 使用别名 用于给某特定用户推送消息 例如 注册帐号完成后 可以用别名推送的方式 把账户名当作别名推送给极光服务器 然后 服务器请求一下极光服务器发一条极光推
  • 线性回归与逻辑回归的联系与区别

    1 联系 线性回归 sigmoid函数 逻辑回归 2 区别 1 功能不同 线性回归是做回归的 逻辑回归是做分类的 2 参数求解方法不同 线性回归是用最小二乘法求解参数 逻辑回归是用梯度上升法求解参数 后续补充
  • 因为干过外包,我脏了简历!大厂HR透露:干过外包就刷掉

    最近一位网友问了一个问题 做过外包 甲方就不要了吗 引起了一大波疯狂劝退 并且不少人还总结了不选外包的3个理由 1 外包会成为简历污点 去过外包 很难再进大厂了 2 外包岗稳定性极差 项目说没就没 被裁几率很大 3 外包福利待遇差 外包和正
  • 文件的上传(图片、PDF、视频)

    提示 本文仅记录本人工作中遇到的难点与个人见解 仅供参考 如有问题请见谅 目录 前言 一 创建UploadUtil工具类 二 需要在yml中定义上传到系统的路径 三 创建UploadControlle 前言 文件上传 也称为upload 是
  • [云原生专题-62]:Kubesphere云治理-DevOps-持续集成与pipeline自动上云工具Jenkins

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 123021850 目录 第1章 Jen
  • 【每日一问】computed、methods、watch有什么区别?

    来自官方文档的解释 找他们三个来做比较 说明他们还是有相同点的 1 computed VS methods computed有缓存 methods没有缓存 computed方法 不管调用多少次 只要值不修改 它就会走第一次的缓存 后面3次被
  • 贝叶斯网络(belief network)及相关知识整理

    贝叶斯网络 belief network 及相关知识 频率派 认为theta是个固定的未知常数 认为样本是随机的 重点研究样本分布 贝叶斯派 认为theta是不确定的未知数 认为样本是固定的 重点研究参数theta的分布 贝叶斯的思考方式不
  • 程序员失业后应做的五件事

    当金融危机席卷全球市场的时候 解雇通知书就象雪片一样飞出 虽然IT职业保障令人担忧 但是某些人还是能在失业后找到新的就业机会 Robert Fleming在两个月前失去了他在渥太华某软件公司的IT管理员工作 他花了3个星期的时间来调整自己的
  • python爬虫程序之百度翻译,pyexecjs模块的用法(python里的js解析库)

    目录 百度翻译爬虫程序 1 需求分析 2 URL分析 3 难点 请求参数分析 4 如何生成sign值 5 pyexecjs模块 6 程序设计 7 程序改进思路 pyexecjs模块是python爬虫库里关于javaScript的一套程序 它
  • **亲测有效**:VSCode “终端将被任务重用,按任意键关闭”/vscode 终端运行npm弹出选择程序对话框/尝试新的跨平台 PowerShell

    亲测有效 尝试新的跨平台 PowerShell VSCode 终端将被任务重用 按任意键关闭 vscode 终端运行npm弹出选择程序对话框解决方法 最近遇到一个新的问题 所以对于几个问题有了新的认识 修改补充 vscode终端运行npm总
  • 使用SheetJS读写Excel文件

    文章目录 目的 基础说明 读取 写入 总结 目的 项目中有一个Excel转JSON的工具 之前这个工具一直使用 Python 的 openpyxl 库来编写的 然后使用 pyinstaller 打包成 exe 文件 之前这个工具只是个命令行