Excel 与 Web 的完美融合:从导入到导出,前端 Excel 处理技术浅析
#2025/09/16
目录
- 1. 背景
- 2. 技术本质:为什么 Web 版本的 Excel 这么复杂?
- 3. 导入:主流导入库技术选型
- 4. Web 上 Excel 展示能力选型
- 5. Excel 在线编辑能力
- 6. 导出与还原能力深度解析
- 7. 云服务 API 方案分析
- 8. 最终选择
1. 背景
- 在现代前端开发中,处理 Excel文件已成为业务系统的基础需求。
- 从
数据导入
到在线编辑
,从完美展示
到高质量导出
,每个环节都面临着技术选型的挑战
本文将深入分析主流技术方案,为你的项目选型提供全面参考
内部纵横系统就有大量这种场景,这里可以展示下系统及线下 excel 表格
2. 技术本质:为什么 Web 版本的 Excel 这么复杂?
- 关键挑战
- Excel有自己的文件格式和渲染引擎
- Web浏览器有自己的 HTML/CSS 渲染体系
- 两者之间需要“翻译“和“转换“
2.1. Excel文件的本质 - 它到底是什么?
Excel文件其实是一个压缩包,当你双击打开一个.xlsx
文件,看到的是表格界面,但实际上:
Excel文件 = 一个ZIP压缩包,里面包含:
├── [Content_Types].xml # 文件类型定义
├── _rels/ # 关系文件夹
├── xl/ # Excel核心数据
│ ├── workbook.xml # 工作簿信息
│ ├── worksheets/ # 工作表数据
│ │ ├── sheet1.xml # 第一个工作表
│ │ └── sheet2.xml # 第二个工作表
│ ├── styles.xml # 样式定义
│ ├── sharedStrings.xml # 共享字符串
│ └── media/ # 图片等媒体文件
└── docProps/ # 文档属性
举个例子:
<!-- sheet1.xml中的一个单元格 -->
<c r="A1" s="1" t="inlineStr">
<is><t>销售额</t></is>
</c>
翻译成人话就是:
r="A1"
: 这个单元格在A1位置s="1"
: 使用第1号样式t="inlineStr"
: 内容是文本<t>销售额</t>
: 实际内容是“销售额“
Excel的样式系统,样式信息单独存储
<!-- styles.xml中的样式定义 -->
<!-- 这个样式使用1号字体、2号填充、1号边框,并且居中对齐。
这就是为什么Excel处理复杂的原因:数据和样式是分离的!-->
<cellXfs>
<xf fontId="1" fillId="2" borderId="1">
<alignment horizontal="center" vertical="center"/>
</xf>
</cellXfs>
2.2. 导入:把Excel“拆解“成Web能懂的格式
导入的技术本质
Excel文件 → 解压缩 → 解析XML → 重组数据 → 转换格式 → JavaScript对象
- 浏览器文件读取:input file → 内存中(以ArrayBuffer形式)
- 解压缩和解析
- 数据结构转换:Excel内部数据 → JavaScript对象
- 所以
- 每个翻译都要要准确映射,不能丢失信息
- 特殊处理较多
- 数字格式处理
- 公式处理
- 图片等
2.3. 展示: 让浏览器“画“出Excel的样子
1、把Excel样式转换成CSS样式
Excel样式对象 → CSS规则 → HTML元素 → 浏览器渲染
- 复杂样式的处理
- 单元格合并
- 边框样式
- Excel字体样式 → CSS字体样式
- 渐变背景
2、渲染引擎的选择
- 方案1:HTML表格渲染
- 方案2:Canvas渲染
- 方案 3:SVG渲染
- 优势与劣势分析?
2.4. 编辑:让Web页面具备Excel的交互能力
- 编辑的本质:状态管理 + 界面更新
- 编辑 = 用户操作 → 数据变更 → 界面同步 → 状态保存
一些控件
- 编辑 = 用户操作 → 数据变更 → 界面同步 → 状态保存
- 颜色选择器的实现
- 公式系统的实现
- 公式输入和识别
- 公式计算引擎
- 选择和拖拽功能
- 编辑操作的撤销重做
- 历史记录系统
2.5. 导出:把Web数据重新“包装“成Excel
- 导出的本质:逆向转换
- 导出 = Web数据 → Excel格式 → 文件生成 → 用户下载
JavaScript对象 → Excel内部结构 → XML文件 → 压缩打包 → 文件下载
打包时,有一些专门的 比如
JSZip
库来支持
导出过程中的技术挑战
- 挑战1:样式精确还原
- 挑战2:数据类型处理
- 挑战3:文件大小优化
2.6. 性能优化 - 让一切运行得更快更流畅
- 内存容易爆:一个包含10万个单元格的Excel文件,每个单元格的JavaScript对象可能占用几百字节内存
- 优化策略
- 虚拟渲染(Virtual Rendering)
- 核心思想:只渲染用户看得到的部分
- 样式缓存和复用
- 增量更新策略
- 传统方式:全量重新渲染
- 优化方式:只更新变化的部分
- Web Workers异步处理 复杂计算阻塞UI线程
- 内存管理和垃圾回收
- 虚拟渲染(Virtual Rendering)
2.7. 总结 → 自建不可能
3. 导入:主流导入库技术选型
核心诉求:能够本地 Excle 导入查看即可
- SheetJS CE(社区版)
- 开源状态:完全开源(MIT许可证)
- 格式支持:XLSX、XLS、CSV等50+种格式
- 样式支持: ❌ 完全不支持样式读取
- 数据完整性:✅ 100%准确读取数据内容
- 适用场景:纯数据导入,不关心样式的场景
- SheetJS Pro(商业版)
- 开源状态:商业授权(年费$2000-$15000+)
- 样式支持:✅ 完整的样式、颜色、边框支持
- 高级功能:✅ 图片、图表、条件格式支持
- 技术支持:专业团队维护
- 适用场景:企业级应用,对样式保真度要求极高
- ExcelJS
- 开源状态:完全开源(MIT许可证)
- API设计:面向对象,直观易用
- 样式支持:✅ 完整的 Excel样式系统支持
- 功能完整性:单元格合并、富文本、条件格式等
- 性能表现:中等,但功能无阉割
- 社区活跃度:GitHub 12k+ stars,持续维护
- Luckysheet
- 开源状态:完全开源
- 导入方式:需配合其他库或使用内置导入插件
- 样式兼容:导入时样式转换有损失
- 用户体验:提供完整的表格编辑界面
- 中文支持:国产项目,中文文档友好
- Univer(现代化表格方案) → 和 Luckysheet 一家共送出
- 开源状态:开源核心 + 商业增强功能
- 技术架构:基于Canvas渲染,性能优异
- 导入能力:样式保持度约 80-85%
- 现代特性:支持协作编辑、版本管理、实时同步
- 中文支持:国产项目,中文文档友好
- 商业模式:核心功能免费,高级功能需授权
3.1. 导入能力评分对比
库名称 | 开源程度 | 样式支持 | 格式兼容 | 学习成本 | 推荐指数 |
---|---|---|---|---|---|
SheetJS CE | ⭐⭐⭐⭐⭐ | ❌ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
SheetJS Pro | ❌ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
ExcelJS | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
Luckysheet | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
Univer | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
- ❌ SheetJS CE,导入后样式丢失
- ❌ ExcelJS 支持导入,但导入后展示还需要开发
- 我们的诉求是,导入后能够快速展示
- ❌ SheetJS Pro 价格不允许
- ❌ Univer 导入功能有限制
- ✅ Luckysheet 导入后且可以快速展示本地 excel ,满足诉求
3.2. Demo 演示
4. Web 上 Excel 展示能力选型
4.1. 展示方案技术路线
- ❌自建:纯HTML表格方案
- 基于ExcelJS解析后生成HTML表格,通过CSS还原Excel样式。
- 样式还原度可达90-95%,但需要大量的样式映射工作。
- ❌ 自建:Canvas/SVG渲染方案
- 将 ExcelJS解析容渲染到Canvas或SVG上,可实现接近100%的视觉还原,但是
- 但失去了文本选择和搜索能力
- 大量的研发工作
- 将 ExcelJS解析容渲染到Canvas或SVG上,可实现接近100%的视觉还原,但是
- ✅ Luckysheet:
- 提供最接近Excel的展示效果,支持工作表切换、缩放等功能
- ❌ x-spreadsheet:
- 轻量级选择,体积小性能好,但功能相对简单
- 另外社区不怎么维护了
- ❌ Univer:
- 现代化架构,Canvas渲染,性能优秀,
- 但核心功能可能需要商业授权
- ❌ 其他
- 如 OnlyOffice:企业级方案,兼容性最好但需要部署复杂
4.2. 展示能力对比分析
方案类型 | 样式还原度 | 交互能力 | 移动端支持 | 开发成本 | 维护难度 |
---|---|---|---|---|---|
HTML表格 | 90-95% | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ |
Canvas渲染 | 100% | ⭐⭐ | ⭐⭐⭐ | ⭐ | ⭐⭐ |
Luckysheet | 85% | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
Univer | 90% | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
x-spreadsheet | 80% | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
5. Excel 在线编辑能力
Web编辑功能的技术本质
是在浏览器中重新实现Excel的编辑逻辑
- 状态管理:维护表格的完整状态(数据、样式、选择状态等)
- 事件系统:处理键盘、鼠标交互,实现Excel般的操作体验
- 渲染引擎:高效的视图更新和重绘机制
- 公式引擎:实现Excel公式的解析、计算和依赖管理
- 协作同步:
- 多人编辑时的冲突解决和状态同步
- 多版本
编辑功能 | Luckysheet | x-spreadsheet | OnlyOffice | 自建方案 |
---|---|---|---|---|
基础编辑 | ✅ | ✅ | ✅ | ❌ |
样式设置 | ✅ | ✅ | ✅ | ❌ |
公式计算 | ✅ | ⚠️ | ✅ | ❌ |
条件格式 | ✅ | ❌ | ✅ | ❌ |
图表制作 | ✅ | ❌ | ✅ | ❌ |
协作编辑 | ✅ | ❌ | ✅ | ❌ |
结论:使用 Luckysheet 最优
当前其实业务其实没有在线编辑的诉求,但是可以提请技术方案的储备或共识
6. 导出与还原能力深度解析
6.1. 技术本质
技术本质:js 对象(数据和样式等) → Excel 格式
- 数据序列化:将 JavaScript 对象转换为 Excel 可识别的数据格式
- 样式映射:Web CSS 样式 与 Excel样式的双向转换
- 二进制生成:构建符合 Excel 规范的二进制文件
- 压缩打包:Excel 文件本质是 ZIP 压缩的XML文档集合
6.2. 业务核心诉求
- 富文本
- 单元格宽高
- 单元格背景
- 合并单元格
- 等等
6.3. 技术方案
- ❌ 自建
- 成本不允许,也没这个必要,有开源的方案 excel
- ✅ ExcelJS - 专业级导出能力
-
字体系统:字体族、大小、颜色、粗体、斜体等完整支持
-
填充样式:纯色、渐变、图案填充完全支持
-
边框处理:四边独立边框,支持多种样式和颜色
-
对齐方式:水平、垂直对齐,文本换行等格式完整支持
-
ExcelJS原生支持多种图片格式的插入
- base64
-
富文本满足诉求
-
图表可以转成图片后通过图片导入
-
文件兼容性
- Excel版本:支持Excel 2007+所有版本
- 第三方软件:LibreOffice、WPS等软件良好兼容
- 移动端:生成的文件在移动Excel应用中正常显示
-
- ❌ xlsx-js-style - SheetJS样式增强版
- 基本关系:基于SheetJS的fork版本,专门添加样式支持
- 样式能力:支持字体、背景、边框、对齐等基础样式
- 局限性:基于较旧版本SheetJS,更新较慢,复杂样式支持有限
- 适用场景:需要基础样式但不需要图片、图表等高级功能
- 之前用过
- ❌ Luckysheet 导出分析 → 还是会有授权的限制
- 基础样式导出:支持字体、颜色、背景等基础样式,成功率约85%
- 图片支持:❌ 完全不支持图片和图表导出
- 条件格式:仅保留当前显示效果,条件规则丢失
- 富文本:支持基础富文本,复杂格式会简化
导出功能 | ExcelJS | xlsx-js-style | Luckysheet | Univer |
---|---|---|---|---|
基础样式 | ✅ 100% | ✅ 90% | ✅ 85% | ✅ 90% |
单元格合并 | ✅ 100% | ✅ 95% | ✅ 100% | ✅ 100% |
图片插入 | ✅ 90% | ❌ 0% | ❌ 0% | ✅ 70% |
图表支持 | ⚠️ 需转图片 | ❌ 0% | ❌ 0% | ⚠️ 基础支持 |
条件格式 | ✅ 85% | ❌ 0% | ⚠️ 30% | ✅ 90% |
数据验证 | ✅ 90% | ❌ 0% | ❌ 0% | ✅ 85% |
富文本 | ✅ 100% | ⚠️ 20% | ⚠️ 40% | ✅ 100% |
7. 云服务 API 方案分析
云服务API的本质是将Excel处理能力托管到云端,通过HTTP接口提供服务:
云服务 | 样式兼容性 | 功能完整性 | 集成难度 | 成本水平 | 适用场景 |
---|---|---|---|---|---|
Microsoft | 100% | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | 高 | 企业级应用 |
WPS开放平台 | 95% | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 中 | 国内企业 |
腾讯文档API | 90% | ⭐⭐⭐ | ⭐⭐⭐⭐ | 低 | 中小企业 |
主要问题还是开发成本上和 费用上,不可取 ❌
8. 最终选择
- 导入:Luckysheet
- 查看:Luckysheet
- 在线编辑:Luckysheet
- 导出:
- 没有样式要求:Sheet
- ExcelJS
以上只是列举了一些前端相关的库,其实其他语言比如 Java 、go 解析 excel 成熟的库很多