JavaScript前端读取Excel文件的实战指南
作者:夏曦安
简介:在前端开发中,JavaScript通过“js-xlsx”库实现Excel文件的解析与数据提取,支持从用户上传的.xlsx文件中读取内容并转换为JavaScript可操作的数据结构。本文介绍该库的基本使用流程,包括安装、文件读取、工作表解析、数据转换与处理,并提供完整示例代码,适用于需要在前端实现Excel数据处理的应用场景。
1. 前端读取Excel文件的需求背景
随着Web应用功能的不断拓展,前端直接处理Excel文件的需求日益增长。在数据导入、报表预览、用户信息上传等业务场景中,Excel因其结构清晰、操作便捷,成为企业数据交互的重要载体。传统做法是将文件上传至后端处理,但这种方式增加了 服务器负担,响应速度受限。随着JavaScript技术的成熟,特别是在File API和相关库(如js-xlsx)的支持下,浏览器端读取和解析Excel文件已成为现实。这不仅提升了应用响应速度,也优化了用户体验,为前端工程师带来了全新的技术挑战与实践机会。
2. js-xlsx库简介与安装方法
2.1 js-xlsx库概述
2.1.1 什么是js-xlsx
js-xlsx
是一个由SheetJS开发的开源JavaScript库,用于在前端或Node.js环境中读写Excel文件(支持 .xls
和 .xlsx
格式)。该库功能强大,支持多种Excel格式的解析与生成,能够将Excel文件转换为JSON、CSV、HTML等结构化数据格式,广泛应用于Web应用中的数据导入导出场景。
其核心优势在于:
- 纯JavaScript实现 ,无需依赖任何其他库(如jQuery)。
- 跨平台兼容 ,支持浏览器端与Node.js环境。
- 轻量级 ,压缩后体积小,适合嵌入到生产环境。
- 丰富的API接口 ,可灵活处理Excel中的Sheet、Cell、样式、公式等内容。
2.1.2 js-xlsx的核心功能
以下是 js-xlsx
的核心功能模块及其作用:
功能模块 | 功能描述 |
---|---|
XLSX.readFile | 读取本地Excel文件(支持同步与异步) |
XLSX.utils.aoa_to_sheet | 将二维数组转换为工作表对象 |
XLSX.utils.sheet_to_json | 将Sheet对象转换为JSON数组 |
XLSX.write | 生成Excel文件并支持下载或写入Node.js流 |
XLSX.SSF | 提供单元格格式化与解析功能 |
XLSX.utils.encode_cell | 将行列索引转换为Excel单元格地址(如 A1、B2 等) |
此外, js-xlsx
还支持多种格式的导出,包括CSV、HTML表格、ODS等。其灵活性使其成为前端Excel操作的首选库之一。
2.2 js-xlsx的安装与引入方式
2.2.1 使用npm安装js-xlsx
对于使用模块化构建工具(如Webpack、Vite、Rollup等)的现代前端项目,推荐使用npm方式安装:
npm install xlsx
安装完成后,在JavaScript文件中通过 import
引入:
import * as XLSX from 'xlsx';
注意 :部分构建工具可能需要额外配置,例如在Vue或React项目中确保 xlsx 被正确打包。
示例代码:读取并解析Excel文件
import * as XLSX from 'xlsx'; function handleFile(file) { const reader = new FileReader(); reader.onload = function(e) { const data = new Uint8Array(e.target.result); const workbook = XLSX.read(data, { type: 'array' }); const firstSheetName = workbook.SheetNames[0]; const worksheet = workbook.Sheets[firstSheetName]; const json = XLSX.utils.sheet_to_json(worksheet); console.log(json); }; reader.readAsArrayBuffer(file); }
代码逻辑说明 :
1. 使用 FileReader 读取用户上传的Excel文件。
2. 通过 XLSX.read 将文件内容转换为 workbook 对象。
3. 获取第一个工作表并通过 sheet_to_json 转换为JSON格式。
2.2.2 在HTML中直接引入CDN链接
对于不使用模块化构建的简单项目或静态页面,可以通过CDN引入 js-xlsx
:
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script>
此方式无需任何构建步骤,直接在浏览器中使用全局变量 XLSX
。
示例代码:HTML中使用CDN引入并读取Excel
<input type="file" id="excel-file" accept=".xlsx, .xls" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script> <script> document.getElementById('excel-file').addEventListener('change', function(e) { const file = e.target.files[0]; const reader = new FileReader(); reader.onload = function(evt) { const data = new Uint8Array(evt.target.result); const workbook = XLSX.read(data, { type: 'array' }); const sheetName = workbook.SheetNames[0]; const sheet = workbook.Sheets[sheetName]; const jsonData = XLSX.utils.sheet_to_json(sheet); console.log(jsonData); }; reader.readAsArrayBuffer(file); }); </script>
代码逻辑说明 :
1. 监听文件选择框的 change 事件,获取文件对象。
2. 使用 FileReader 读取文件内容。
3. 使用 XLSX.read 解析文件为工作簿对象。
4. 提取第一个工作表,并转换为JSON数组。
2.2.3 模块化开发中的导入方式
在使用模块化框架(如Vue、React、Angular)时,建议使用 import
方式引入 xlsx
,以便更好地管理依赖与打包体积。
Vue项目示例:
<template> <input type="file" @change="handleFileUpload" accept=".xlsx, .xls" /> </template> <script> import * as XLSX from 'xlsx'; export default { methods: { handleFileUpload(event) { const file = event.target.files[0]; const reader = new FileReader(); reader.onload = (e) => { const data = new Uint8Array(e.target.result); const workbook = XLSX.read(data, { type: 'array' }); const sheetName = workbook.SheetNames[0]; const sheet = workbook.Sheets[sheetName]; const jsonData = XLSX.utils.sheet_to_json(sheet); console.log(jsonData); }; reader.readAsArrayBuffer(file); } } } </script>
代码逻辑说明 :
1. 在Vue组件中绑定文件上传事件。
2. 使用 XLSX 库读取Excel文件并解析为JSON。
3. 打印解析结果到控制台。
2.3 js-xlsx的兼容性与注意事项
2.3.1 浏览器兼容性分析
js-xlsx
支持现代浏览器和IE11(部分功能需polyfill)。以下为兼容性表格:
浏览器 | 兼容性 | 备注 |
---|---|---|
Chrome | ✅ 完全支持 | 最新版本兼容性最佳 |
Firefox | ✅ 完全支持 | 需启用部分实验性功能(如 FileReaderSync ) |
Safari | ✅ 完全支持 | iOS Safari 也支持 |
Edge | ✅ 完全支持 | 版本需 ≥ Edge 12 |
IE11 | ⚠️ 部分支持 | 需引入polyfill处理 ArrayBuffer 、 TypedArray |
Mobile Safari | ✅ 完全支持 | 包括iOS 9及以上 |
Android Browser | ✅ 完全支持 | Android 4.4及以上 |
兼容性建议 :
- 对于IE11环境,建议引入 xlsx.core.min.js 并使用 FileReader polyfill。
- 使用 XLSX.set_cptable 以支持中文字符的正确解析。
2.3.2 常见问题及解决方案
问题1:读取文件时提示 Not a valid zip
错误
原因 :上传的文件格式不被支持或文件损坏。
解决方案 :
- 检查文件是否为 .xls
或 .xlsx
格式。
- 确保文件未损坏,尝试使用Excel重新保存文件。
- 使用 try-catch
捕获异常:
try { const workbook = XLSX.read(data, { type: 'array' }); } catch (error) { console.error("Excel文件解析失败:", error); }
问题2:读取中文内容乱码
原因 : js-xlsx
默认不处理字符编码,某些Excel文件可能包含非UTF-8编码。
解决方案 :
使用 cptable
插件处理编码转换:
import * as XLSX from 'xlsx'; import cptable from 'xlsx/dist/cpexcel.full.js'; XLSX.set_cptable(cptable); function handleFile(file) { const reader = new FileReader(); reader.onload = function(e) { const data = new Uint8Array(e.target.result); const workbook = XLSX.read(data, { type: 'array' }); const sheet = workbook.Sheets[workbook.SheetNames[0]]; const json = XLSX.utils.sheet_to_json(sheet); console.log(json); }; reader.readAsArrayBuffer(file); }
问题3:处理大文件时卡顿或崩溃
原因 : js-xlsx
是同步解析库,处理大文件时可能阻塞主线程。
解决方案 :
- 使用 Web Worker 异步处理大文件解析。
- 分页读取或限制读取的Sheet数量。
- 前端提示用户上传文件大小限制。
流程图:js-xlsx文件读取流程
graph TD A[用户选择Excel文件] --> B[通过FileReader读取文件] B --> C{判断文件类型} C -->| .xls | D[XLSX.read解析文件] C -->| .xlsx | D D --> E[获取Workbook对象] E --> F[获取SheetNames数组] F --> G[访问指定Sheet对象] G --> H[XLSX.utils.sheet_to_json转换数据] H --> I[输出JSON数组]
该流程图清晰地展示了 js-xlsx
从文件选择到最终数据解析的完整流程,有助于开发者理解其工作原理。
本章内容完整地介绍了 js-xlsx
的基本概念、安装方式及兼容性问题,为后续章节深入解析Excel数据结构和处理逻辑打下了坚实基础。
3. 使用XLSX.readFile读取Excel文件
在前端开发中,处理Excel文件已成为一种常见需求,尤其在数据导入、报表展示等场景中。 XLSX.readFile
是 js-xlsx
(也称 SheetJS
)库提供的一个核心方法,用于从本地文件系统读取 Excel 文件。本章将详细介绍如何结合 HTML5 的 input
元素获取用户上传的文件对象,并使用 XLSX.readFile
方法进行读取,同时对读取后的数据结构进行初步解析。
3.1 通过input元素获取文件对象
在 Web 应用中,用户通常通过 <input type="file">
元素上传文件。HTML5 提供了 File API
,使前端可以访问用户选择的本地文件内容。
3.1.1 HTML5中File API的基础知识
HTML5 的 File API
是一组用于处理本地文件的接口,主要包括:
File
:表示一个文件对象。FileList
:表示一组File
对象,通常由<input type="file">
元素返回。FileReader
:用于异步读取文件内容。
使用这些 API,前端可以访问用户上传的文件内容,并将其传递给 js-xlsx
进行解析。
3.1.2 事件监听与文件读取
我们可以为 <input type="file">
元素绑定 change
事件监听器,当用户选择文件后触发文件读取操作。
<input type="file" id="excelFile" accept=".xlsx,.xls" />
document.getElementById('excelFile').addEventListener('change', function(e) { const file = e.target.files[0]; // 获取用户选择的第一个文件 if (file) { const reader = new FileReader(); // 创建FileReader对象 reader.onload = function(event) { const data = new Uint8Array(event.target.result); // 转换为二进制数组 const workbook = XLSX.read(data, { type: 'array' }); // 使用js-xlsx解析 console.log(workbook); // 输出解析后的workbook对象 }; reader.readAsArrayBuffer(file); // 以ArrayBuffer形式读取文件 } });
注意: FileReader.readAsArrayBuffer() 是读取 Excel 文件的推荐方式,因为 Excel 文件是二进制格式。
代码逻辑分析
- 第 1 行 :为
<input>
元素绑定change
事件监听器。 - 第 2 行 :通过
e.target.files[0]
获取用户选择的第一个文件。 - 第 4 行 :创建
FileReader
实例,用于异步读取文件。 - 第 5 行 :定义
onload
事件回调,当文件读取完成后执行。 - 第 6 行 :将
result
转换为Uint8Array
,以便传给XLSX.read()
。 - 第 7 行 :调用
XLSX.read()
方法解析 Excel 文件。 - 第 10 行 :以
ArrayBuffer
格式读取文件内容。
3.2 XLSX.readFile方法详解
XLSX.readFile
是 js-xlsx
提供的另一个便捷方法,可以直接传入文件路径或文件对象进行解析,尤其适用于 Node.js 环境或 Electron 应用。
3.2.1 参数说明与使用方式
参数名 | 类型 | 必填 | 描述 |
---|---|---|---|
filename | string | 是 | 文件路径或文件名 |
opts | object | 否 | 配置选项,如 type , sheet , cellDates 等 |
常见配置选项:
选项名 | 类型 | 默认值 | 描述 |
---|---|---|---|
type | string | "base64" | 读取类型,可选 base64 , binary , buffer , array , file |
sheet | number 或 string | 无 | 指定读取的工作表索引或名称 |
cellDates | boolean | false | 是否将日期单元格转换为 JS Date 对象 |
示例代码
const workbook = XLSX.readFile('data.xlsx', { type: 'file', cellDates: true }); console.log(workbook);
代码逻辑分析
- 第 1 行 :调用
XLSX.readFile()
方法读取本地路径为data.xlsx
的文件。 - 第 2 行 :指定读取类型为
file
,即直接读取文件路径。 - 第 3 行 :将日期单元格转换为
Date
对象,便于后续处理。
注意: XLSX.readFile() 在浏览器中使用时需确保文件路径有效,通常用于 Electron 或本地文件系统环境。
3.2.2 读取不同格式的Excel文件(.xls与.xlsx)
js-xlsx
支持读取 .xls
(Excel 2003)和 .xlsx
(Excel 2007 及以上)两种格式,无需额外配置。
支持格式对比表:
文件格式 | 扩展名 | 说明 | 是否支持 |
---|---|---|---|
Excel 2003 | .xls | 二进制格式,BIFF8 | ✅ 支持 |
Excel 2007+ | .xlsx | 基于 ZIP 的 XML 格式 | ✅ 支持 |
CSV | .csv | 纯文本格式 | ✅ 支持(需手动处理) |
Excel 2016+(新功能) | .xlsm , .xlsx | 含宏或高级功能 | ✅ 基础功能支持 |
示例流程图(mermaid)
graph TD A[用户选择Excel文件] --> B{判断文件扩展名} B -->| .xls | C[使用XLSX.readFile读取] B -->| .xlsx | D[使用XLSX.readFile读取] C --> E[解析为Workbook对象] D --> E E --> F[输出解析结果]
3.3 文件读取后的数据结构初步解析
当 Excel 文件被成功读取后, XLSX.readFile
返回一个 workbook
对象,该对象包含了整个 Excel 文件的数据结构。
3.3.1 Workbook对象的结构
workbook
对象是一个 JavaScript 对象,其结构如下:
{ SheetNames: ['Sheet1', 'Sheet2'], Sheets: { Sheet1: { '!ref': 'A1:D10', A1: { v: 'Header1', t: 's' }, ... }, Sheet2: { '!ref': 'A1:C5', A1: { v: 'Data1', t: 's' }, ... } }, Props: { ... }, Custprops: { ... } }
属性名 | 类型 | 描述 |
---|---|---|
SheetNames | Array<string> | 所有工作表名称 |
Sheets | Object | 以工作表名称为键,对应工作表数据对象 |
Props | Object | 文档属性(如创建者、修改时间等) |
Custprops | Object | 自定义属性 |
3.3.2 常用属性与方法介绍
SheetNames 数组
SheetNames
是一个字符串数组,保存了 Excel 文件中所有工作表的名称。例如:
console.log(workbook.SheetNames); // ['Sheet1', 'Sheet2']
Sheets 对象
每个工作表数据以键值对形式存储在 Sheets
对象中,例如:
const sheet = workbook.Sheets['Sheet1']; console.log(sheet['A1']); // { v: 'Header1', t: 's' }
每个单元格数据对象包含以下属性:
属性 | 类型 | 描述 |
---|---|---|
v | any | 单元格值 |
t | string | 值的类型,如 'n' (数值)、 's' (字符串)、 'd' (日期)等 |
z | string | 数值格式(如日期格式) |
w | string | 格式化后的显示值 |
示例代码
const sheetName = workbook.SheetNames[0]; const worksheet = workbook.Sheets[sheetName]; for (let i = 1; i <= 10; i++) { const cell = worksheet['A' + i]; if (cell) { console.log(`A${i}:`, cell.v); } }
代码逻辑分析
- 第 1 行 :获取第一个工作表名称。
- 第 2 行 :根据名称获取工作表对象。
- 第 4 行 :遍历 A1 到 A10 单元格。
- 第 5 行 :判断单元格是否存在。
- 第 6 行 :输出单元格的值。
通过本章内容,我们已经掌握了如何使用 XLSX.readFile
方法读取 Excel 文件,并对其返回的 workbook
对象进行初步解析。下一章我们将深入探讨 workbook
对象的内部结构,包括 SheetNames
、 Sheets
和单元格数据的具体表示方式。
4. 解析Workbook对象结构
在使用 js-xlsx
库读取 Excel 文件后,返回的核心对象是一个 Workbook
对象。该对象包含了文件中所有工作表(Sheet)的名称列表(SheetNames)以及各个工作表的数据结构(Sheets)。为了有效提取和处理 Excel 文件中的数据,开发者必须深入理解 Workbook
对象的结构及其子对象的组织方式。本章将逐步解析 Workbook
的核心属性与数据结构,并通过代码示例说明如何遍历和访问其中的数据。
4.1 Workbook对象的核心属性
4.1.1 SheetNames数组的作用
SheetNames
是 Workbook
对象中的一个数组属性,用于存储 Excel 文件中所有工作表的名称。Excel 文件通常包含多个工作表(Sheet),例如“Sheet1”、“Sheet2”等。在前端处理文件时,通常需要根据名称动态访问特定的工作表。
const workbook = XLSX.readFile('example.xlsx'); console.log(workbook.SheetNames); // 输出类似 ["Sheet1", "Sheet2"]
代码逻辑分析:
XLSX.readFile('example.xlsx')
:读取本地 Excel 文件,返回一个Workbook
对象。workbook.SheetNames
:访问Workbook
中的SheetNames
属性,它是一个数组,包含所有工作表的名称。console.log(...)
:将名称数组输出到控制台,便于开发者查看和调试。
4.1.2 Sheets对象的组成与结构
Sheets
是 Workbook
对象中另一个核心属性,它是一个对象(Object),键(Key)为工作表名称,值(Value)为对应的工作表对象(Sheet Object)。每个 Sheet 对象中存储了该工作表中所有单元格的数据及其格式信息。
const sheetNames = workbook.SheetNames; const sheets = workbook.Sheets; sheetNames.forEach(sheetName => { const sheet = sheets[sheetName]; console.log(`Sheet: ${sheetName}`, sheet); });
代码逻辑分析:
workbook.Sheets
:获取Workbook
中的所有工作表对象。sheetNames.forEach(...)
:遍历所有工作表名称。sheets[sheetName]
:通过名称访问对应的 Sheet 对象。console.log(...)
:输出每个 Sheet 对象的内容,帮助开发者理解其内部结构。
4.2 Sheet对象的数据结构解析
4.2.1 单元格数据的表示方式(A1、B2等)
在 js-xlsx
中,Sheet 对象的每个单元格由其地址(如 A1、B2 等)作为键进行存储。每个单元格数据以对象形式存储,包含 .v
(值)、 .t
(类型)、 .w
(显示值)等字段。
const sheet = workbook.Sheets['Sheet1']; const cellA1 = sheet['A1']; console.log(cellA1);
输出示例:
{ "v": "姓名", "t": "s", "w": "姓名" }
参数说明:
v
:单元格的实际值(value)。t
:单元格的数据类型(s 表示字符串,n 表示数字,d 表示日期等)。w
:单元格的显示格式值(formatted value)。
4.2.2 各类型数据的存储格式(数值、字符串、日期等)
不同类型的单元格数据在 Sheet 对象中以不同的方式存储,开发者需要根据类型字段 .t
来判断如何处理数据。
类型标识符 | 数据类型 | 示例值 |
---|---|---|
"s" | 字符串 | "姓名" |
"n" | 数值 | 89.5 |
"d" | 日期 | "2023-01-01" |
"b" | 布尔值 | true / false |
"e" | 错误值 | #DIV/0! |
代码示例:根据类型解析单元格内容
function getCellValue(cell) { if (!cell) return ''; switch(cell.t) { case 's': // 字符串 return cell.v; case 'n': // 数值 return cell.v; case 'd': // 日期 return cell.w; case 'b': // 布尔值 return cell.v ? '是' : '否'; case 'e': // 错误 return '错误值: ' + cell.w; default: return ''; } }
逻辑分析:
- 函数
getCellValue(cell)
接收一个单元格对象。 - 使用
switch
判断.t
类型,返回对应的值。 - 若单元格为空或未定义,返回空字符串。
- 对于日期类型,使用
.w
获取格式化字符串而非原始时间戳。
4.3 遍历工作簿内容
4.3.1 遍历SheetNames获取工作表名称
遍历 SheetNames
是访问每个工作表的前提。通过名称访问对应的 Sheet 对象,可以进一步提取数据。
const workbook = XLSX.readFile('data.xlsx'); workbook.SheetNames.forEach((sheetName, index) => { console.log(`第 ${index + 1} 个工作表名称:${sheetName}`); });
流程图说明:
graph TD A[开始] --> B[读取Excel文件] B --> C[获取SheetNames数组] C --> D[遍历数组] D --> E[输出每个Sheet名称] E --> F[结束]
逻辑分析:
- 读取 Excel 文件后,遍历
SheetNames
数组。 - 使用
forEach
方法,传入当前名称与索引。 - 输出每个工作表名称,便于后续访问。
4.3.2 动态访问不同工作表的数据
在实际应用中,常常需要根据用户选择或业务逻辑动态访问不同工作表的数据。以下示例演示如何根据名称访问特定工作表并提取数据:
function getSheetData(sheetName) { const sheet = workbook.Sheets[sheetName]; const data = []; const range = XLSX.utils.decode_range(sheet['!ref']); for (let row = range.s.r; row <= range.e.r; row++) { const rowData = []; for (let col = range.s.c; col <= range.e.c; col++) { const cellAddress = XLSX.utils.encode_cell({ r: row, c: col }); const cell = sheet[cellAddress]; rowData.push(getCellValue(cell)); } data.push(rowData); } return data; }
表格展示:函数 getSheetData
返回结构示例
姓名 | 年龄 | 生日 |
---|---|---|
张三 | 28 | 1995-03-15 |
李四 | 32 | 1990-07-22 |
逻辑分析:
XLSX.utils.decode_range(sheet['!ref'])
:解析工作表的范围,如"A1:C3"
。- 使用双层循环遍历行和列。
- 通过
XLSX.utils.encode_cell
构建单元格地址。 - 调用
getCellValue
提取数据。 - 将每行数据组合为二维数组返回。
通过本章内容,我们深入解析了 Workbook
对象的核心属性与结构,掌握了 SheetNames
和 Sheets
的作用,并学会了如何遍历和提取单元格数据。下一章我们将进一步探讨如何获取工作表名称列表,并动态访问具体的工作表内容,为前端 Excel 数据处理打下坚实基础。
5. 获取SheetNames与访问具体工作表
在前端使用 js-xlsx
读取 Excel 文件后,开发者通常需要对工作簿中的多个工作表进行访问与处理。Excel 文件可以包含多个工作表(Sheet),每个工作表对应不同的数据集或业务逻辑。本章将详细介绍如何获取 Excel 文件中所有工作表的名称,以及如何访问特定名称的工作表,并实现数据的动态展示与切换。
5.1 获取Excel文件中的所有工作表名称
5.1.1 SheetNames数组的读取方法
在使用 js-xlsx
解析 Excel 文件后,会得到一个 workbook
对象,其中包含了一个名为 SheetNames
的数组,该数组中存储了该工作簿中所有工作表的名称。
const workbook = XLSX.read(data, { type: 'array' }); const sheetNames = workbook.SheetNames; console.log(sheetNames); // 输出所有工作表名称,例如:["Sheet1", "Sheet2"]
代码解析:
- XLSX.read(data, { type: 'array' }) :将二进制数据 data 转换为工作簿对象。
- workbook.SheetNames :获取所有工作表名称组成的数组。
- console.log(sheetNames) :输出工作表名称数组,用于调试或后续操作。
该数组可以用于生成工作表名称下拉框,或作为数据展示的入口。开发者可以通过遍历该数组,动态获取每个工作表的数据。
示例:遍历SheetNames并展示名称
sheetNames.forEach((name, index) => { console.log(`工作表${index + 1}名称为:${name}`); });
代码逻辑说明:
- 使用 forEach 遍历 SheetNames 数组。
- 输出每个工作表名称及其索引位置,便于后续选择。
5.1.2 多工作表文件的处理策略
对于包含多个工作表的 Excel 文件,处理策略主要包括:
处理方式 | 说明 |
---|---|
逐个读取 | 按照 SheetNames 顺序,依次读取每个工作表的数据 |
按需加载 | 用户选择工作表后,再读取对应数据,减少前端内存占用 |
合并数据 | 将多个工作表的数据合并为一个数据集进行展示 |
优化建议:
- 对于大型 Excel 文件,推荐采用按需加载策略,避免一次性读取所有数据导致性能下降。
- 可以结合前端组件(如 Tab 面板)实现多工作表切换。
5.2 访问指定名称的工作表
5.2.1 通过XLSX.utils.aoa_to_sheet解析Sheet对象
在获取 workbook
后,可以通过 workbook.Sheets[SheetName]
获取对应的工作表对象。该对象中包含了工作表的原始数据结构,包括单元格地址与值的映射。
const sheetName = sheetNames[0]; // 获取第一个工作表名称 const worksheet = workbook.Sheets[sheetName]; // 获取工作表对象 console.log(worksheet);
参数说明:
- sheetNames[0] :表示第一个工作表的名称,如 "Sheet1" 。
- worksheet :返回的工作表对象,结构为 { '!ref': 'A1:C3', A1: { v: '标题' }, B1: { v: 123 }, ... } 。
若需要将工作表数据转换为二维数组,可以使用 XLSX.utils.sheet_to_json
或 XLSX.utils.sheet_to_aoa
方法:
const aoa = XLSX.utils.sheet_to_aoa(worksheet); console.log(aoa);
代码解析:
- XLSX.utils.sheet_to_aoa(worksheet) :将工作表转换为二维数组。
- aoa :输出为二维数组,如 [['标题', '数值'], ['A', 10], ['B', 20]] 。
5.2.2 获取Sheet的原始数据格式
工作表对象(Sheet)的原始数据结构如下:
{ "!ref": "A1:C3", "A1": { "t": "s", "v": "姓名" }, "B1": { "t": "s", "v": "年龄" }, "C1": { "t": "s", "v": "性别" }, "A2": { "t": "s", "v": "张三" }, "B2": { "t": "n", "v": 28 }, "C2": { "t": "s", "v": "男" } }
字段说明:
- !ref :表示数据范围,这里是 A1:C3 。
- t :表示单元格数据类型,如:
- 's' :字符串(String)
- 'n' :数值(Number)
- 'd' :日期(Date)
- v :表示单元格的值。
开发者可以通过遍历该结构来手动解析数据,或使用 XLSX.utils.sheet_to_json
方法进行自动转换。
5.3 工作表数据的动态展示
5.3.1 将工作表数据渲染至HTML表格
将 Excel 数据渲染为 HTML 表格是常见的需求。以下是一个完整的实现示例:
<table id="excelTable" border="1"></table>
function renderTable(sheetData) { const table = document.getElementById('excelTable'); table.innerHTML = ''; // 清空旧数据 // 遍历二维数组 sheetData.forEach(row => { const tr = document.createElement('tr'); row.forEach(cell => { const td = document.createElement('td'); td.textContent = cell; tr.appendChild(td); }); table.appendChild(tr); }); } // 示例:读取第一个工作表并渲染 const sheetName = sheetNames[0]; const worksheet = workbook.Sheets[sheetName]; const aoa = XLSX.utils.sheet_to_aoa(worksheet); renderTable(aoa);
代码逻辑分析:
- renderTable(sheetData) :接收二维数组,将其渲染为 HTML 表格。
- sheetData.forEach(...) :遍历每一行。
- 创建 tr 和 td 元素,填充单元格内容。
- 最终将表格插入到页面中。
5.3.2 支持多Sheet切换的前端实现
为了实现多工作表切换功能,可以添加下拉框让用户选择工作表名称,然后动态加载并渲染对应数据。
<select id="sheetSelector"></select> <table id="excelTable" border="1"></table>
const sheetSelector = document.getElementById('sheetSelector'); // 填充下拉框 sheetNames.forEach(name => { const option = document.createElement('option'); option.value = name; option.textContent = name; sheetSelector.appendChild(option); }); // 监听下拉框变化 sheetSelector.addEventListener('change', () => { const selectedSheet = sheetSelector.value; const worksheet = workbook.Sheets[selectedSheet]; const aoa = XLSX.utils.sheet_to_aoa(worksheet); renderTable(aoa); });
代码说明:
- 使用 select 元素创建下拉框。
- 遍历 sheetNames ,为每个工作表名称创建一个 option 。
- 添加事件监听器,当下拉框选项改变时,重新加载并渲染对应工作表数据。
流程图:多Sheet切换实现逻辑
graph TD A[用户选择工作表] --> B[获取工作表名称] B --> C[从workbook中获取对应Sheet] C --> D[转换为二维数组] D --> E[渲染为HTML表格]
流程图说明:
- 用户通过下拉框选择工作表名称。
- 获取该名称对应的工作表对象。
- 将工作表数据转换为二维数组。
- 渲染为 HTML 表格展示给用户。
本章深入讲解了如何获取 Excel 文件中的所有工作表名称、访问指定工作表以及实现数据的动态展示与切换。通过 SheetNames
数组可以获取所有工作表名称,结合 workbook.Sheets[name]
可以访问具体工作表的数据。此外,使用 XLSX.utils.sheet_to_aoa
可将数据转换为二维数组,并结合 HTML 动态渲染为表格。最后,通过下拉框实现了多工作表切换功能,为后续的数据展示与交互奠定了基础。
6. 使用sheet_to_json转换数据为数组
在前端处理 Excel 文件的过程中,一个非常关键的步骤是将 Excel 中的工作表数据转化为 JavaScript 可操作的格式。 sheet_to_json
是 js-xlsx
库提供的一个核心方法,用于将 Sheet 对象转换为 JSON 数组形式,便于后续的数据处理、展示或上传。
6.1 sheet_to_json方法的基本用法
sheet_to_json
是 XLSX.utils
模块下的一个工具函数,能够将一个 Sheet 对象(即工作表)转换为 JavaScript 数组对象。
6.1.1 参数配置与字段映射
const worksheet = workbook.Sheets[sheetName]; const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1, // 设置第一行为表头 defval: null, // 空值用 null 填充 raw: true // 禁止自动转换数据类型 });
参数名 | 类型 | 默认值 | 描述 |
---|---|---|---|
header | number / array | 1 | 设置哪一行作为字段名(如 header: 1 表示第一行为字段名) |
defval | any | undefined | 当单元格为空时填充的默认值 |
raw | boolean | false | 是否保留原始数据类型(不转换数字、日期等) |
range | number | 0 | 指定读取的行范围(如只读取前5行) |
6.1.2 数据转换的格式规范
当 header: 1
时, sheet_to_json
会将第一行作为字段名,后续每一行对应一个对象。例如:
[ { "姓名": "张三", "年龄": 25 }, { "姓名": "李四", "年龄": 30 } ]
若 header: 0
,则默认以 A、B、C 作为字段名,输出如下:
[ { "A": "姓名", "B": "年龄" }, { "A": "张三", "B": 25 } ]
6.2 数据转换的进阶技巧
6.2.1 忽略空行与无效数据
可以通过 sheet_to_json
的 blankrows
参数来控制是否忽略空行,默认为 true
,表示不忽略。若要忽略空行,可以结合 JavaScript 的 filter
方法处理:
const filteredData = jsonData.filter(row => Object.values(row).some(cell => cell !== null && cell !== ""));
6.2.2 自定义列名与字段命名
如果你希望将 Excel 中的列头映射为自定义字段名,可以在读取后手动重命名字段:
const renamedData = jsonData.map(row => ({ name: row['姓名'], age: row['年龄'] }));
或者使用 sheet_to_json
前对 Sheet 对象进行预处理,替换原始列名。
6.3 数据处理与JavaScript数组操作结合
6.3.1 使用filter、map等方法处理转换后的数据
一旦数据被转换为 JSON 数组,就可以使用常见的数组方法进行处理:
// 筛选年龄大于25的数据 const adults = renamedData.filter(person => person.age > 25); // 提取所有名字 const names = renamedData.map(person => person.name);
6.3.2 数据验证与错误处理机制
在数据处理过程中,应加入数据校验逻辑,防止非法数据导致运行错误:
const validData = renamedData.filter(person => { if (typeof person.age !== 'number') { console.warn('年龄字段错误:', person); return false; } return true; });
也可以结合 try-catch
捕获转换过程中的异常:
try { const jsonData = XLSX.utils.sheet_to_json(worksheet); } catch (e) { console.error('数据转换失败:', e); }
6.4 示例代码实现完整读取流程
6.4.1 完整代码结构与逻辑说明
以下是一个完整的前端读取 Excel 文件并转换为 JSON 数组的示例代码:
<input type="file" id="excelFile" accept=".xlsx, .xls" /> <table id="dataTable"></table> <script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script> <script> document.getElementById('excelFile').addEventListener('change', function(e) { const file = e.target.files[0]; const reader = new FileReader(); reader.onload = function(event) { const data = new Uint8Array(event.target.result); const workbook = XLSX.read(data, { type: 'array' }); const sheetName = workbook.SheetNames[0]; const worksheet = workbook.Sheets[sheetName]; // 转换为JSON数组 const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 }); // 手动映射字段 const renamedData = jsonData.slice(1).map(row => ({ name: row[0], age: row[1] })); // 渲染到HTML表格 const table = document.getElementById('dataTable'); table.innerHTML = ''; renamedData.forEach(person => { const tr = document.createElement('tr'); tr.innerHTML = `<td>${person.name}</td><td>${person.age}</td>`; table.appendChild(tr); }); }; reader.readAsArrayBuffer(file); }); </script>
6.4.2 实际运行效果与调试技巧
上述代码实现了一个完整的流程:
1. 用户选择 Excel 文件;
2. 通过 FileReader
读取文件;
3. 使用 XLSX.read
解析为 Workbook;
4. 使用 sheet_to_json
转换为 JSON;
5. 映射字段并渲染到 HTML 表格。
调试时建议在控制台打印中间变量:
console.log('原始数据:', jsonData); console.log('映射后数据:', renamedData);
通过浏览器开发者工具(F12)查看控制台输出和 DOM 元素,可以快速定位问题所在。
以上就是JavaScript前端读取Excel文件的实战指南的详细内容,更多关于JavaScript读取Excel文件的资料请关注脚本之家其它相关文章!