javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > JavaScript读取Excel文件

JavaScript前端读取Excel文件的实战指南

作者:夏曦安

在前端开发中,JavaScript通过js-xlsx库实现Excel文件的解析与数据提取,支持从用户上传的.xlsx文件中读取内容并转换为JavaScript可操作的数据结构,本文介绍该库的基本使用流程,需要的朋友可以参考下

简介:在前端开发中,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应用中的数据导入导出场景。

其核心优势在于:

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 是一组用于处理本地文件的接口,主要包括:

使用这些 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 文件是二进制格式。

代码逻辑分析

3.2 XLSX.readFile方法详解

XLSX.readFile js-xlsx 提供的另一个便捷方法,可以直接传入文件路径或文件对象进行解析,尤其适用于 Node.js 环境或 Electron 应用。

3.2.1 参数说明与使用方式

参数名类型必填描述
filenamestring 文件路径或文件名
optsobject 配置选项,如  type  ,  sheet  ,  cellDates  等

常见配置选项:

选项名类型默认值描述
typestring "base64" 读取类型,可选  base64  ,  binary  ,  buffer  ,  array  ,  file 
sheetnumber  或  string 指定读取的工作表索引或名称
cellDatesboolean false 是否将日期单元格转换为 JS Date 对象

示例代码

const workbook = XLSX.readFile('data.xlsx', {
    type: 'file',
    cellDates: true
});
console.log(workbook);

代码逻辑分析

注意:  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: { ... }
}
属性名类型描述
SheetNamesArray<string> 所有工作表名称
SheetsObject 以工作表名称为键,对应工作表数据对象
PropsObject 文档属性(如创建者、修改时间等)
CustpropsObject 自定义属性

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' }

每个单元格数据对象包含以下属性:

属性类型描述
vany 单元格值
tstring 值的类型,如 'n' (数值)、 's' (字符串)、 'd' (日期)等
zstring 数值格式(如日期格式)
wstring 格式化后的显示值

示例代码

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);
    }
}

代码逻辑分析

通过本章内容,我们已经掌握了如何使用 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"]

代码逻辑分析:

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);
});

代码逻辑分析:

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": "姓名"
}

参数说明:

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 '';
    }
}

逻辑分析:

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[结束]

逻辑分析:

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 返回结构示例

姓名年龄生日
张三281995-03-15
李四321990-07-22

逻辑分析:

通过本章内容,我们深入解析了 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 / array1设置哪一行作为字段名(如 header: 1 表示第一行为字段名)
defval anyundefined当单元格为空时填充的默认值
raw booleanfalse是否保留原始数据类型(不转换数字、日期等)
range number0指定读取的行范围(如只读取前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文件的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文