前端读取与导出XLSX文件的完整指南

 更新时间:2025年12月19日 09:53:50   作者:小明记账簿  
在实际业务场景中,我们经常需要处理Excel文件的导入导出,本文将以React+Ant Design项目为例,演示如何通过xlsx库实现XLSX文件的读取与导出,需要的朋友可以参考下

一、前言

在实际业务场景中,我们经常需要处理Excel文件的导入导出。本文将以React+Ant Design项目为例,演示如何通过xlsx库实现以下功能:

  1. 读取本地XLSX文件并解析为表格数据
  2. 将表格数据导出为XLSX文件

二、技术栈

  • React: 构建用户界面
  • Ant Design: UI组件库
  • xlsx (SheetJS): Excel文件处理库

三、准备工作

1. 创建React项目

npx create-react-app antd-xlsx --template typescript
cd antd-xlsx

2. 安装依赖

npm install antd @ant-design/icons xlsx

3. 目录结构

src/
├── components/
│   └── XlsxHandler.tsx
├── App.tsx
├── index.tsx

四、核心实现

1. 文件读取模块

import React, { useState } from 'react';
import { Upload, Table, Button } from 'antd';
import * as XLSX from 'xlsx';
import { InboxOutlined } from '@ant-design/icons';

const XlsxHandler = () => {
  const [dataSource, setDataSource] = useState<any[]>([]);
  const [headers, setHeaders] = useState<string[]>([]);

  // 文件读取处理
  const handleFileChange = (info: any) => {
    const file = info.file;
    if (!file) return;
    
    // 校验文件类型
    const isXlsx = file.name.endsWith('.xlsx') || file.name.endsWith('.xls');
    if (!isXlsx) {
      info.status = 'error';
      info.response = '请选择正确的Excel文件';
      return;
    }

    const reader = new FileReader();
    reader.onload = (e: any) => {
      const binaryStr = e.target.result;
      const workbook = XLSX.read(binaryStr, { type: 'binary' });
      const firstSheetName = workbook.SheetNames[0];
      const sheet = workbook.Sheets[firstSheetName];
      
      // 提取表头
      const jsonData = XLSX.utils.sheet_to_json(sheet);
      if (jsonData.length > 0) {
        setHeaders(Object.keys(jsonData[0]))
        setDataSource(jsonData);
      }
    };
    reader.readAsBinaryString(file);
  };

  // 数据导出功能
  const exportToExcel = () => {
    const ws = XLSX.utils.json_to_sheet(dataSource);
    const wb = XLSX.utils.book_new();
    XLSX.utils.book_append_sheet(wb, ws, 'ExportedData');
    
    XLSX.writeFile(wb, `export_${Date.now()}.xlsx`);
  };

  return (
    <div style={{ padding: 20 }}>
      <Upload 
        beforeUpload={handleFileChange} 
        showUploadList={false}
        maxCount={1}
        accept=".xlsx,.xls"
      >
        <Button icon={<InboxOutlined />}>选择Excel文件</Button>
      </Upload>

      {headers.length > 0 && (
        <Table 
          dataSource={dataSource} 
          rowKey="id" 
          pagination={{ pageSize: 10 }} 
          style={{ marginTop: 20 }}
        >
          {headers.map((header) => (
            <Table.Column key={header} title={header} dataIndex={header} />
          ))}
        </Table>
      )}

      <Button 
        type="primary" 
        onClick={exportToExcel} 
        disabled={!headers.length} 
        style={{ marginTop: 20 }}
        icon={<DownloadOutlined />}
      >
        导出当前数据
      </Button>
    </div>
  );
};

export default XlsxHandler;

2. 主应用集成

import React from 'react';
import './App.css';
import { ConfigProvider } from 'antd';
import XlsxHandler from './components/XlsxHandler';
import { DownloadOutlined } from '@ant-design/icons';

function App() {
  return (
    <ConfigProvider>
      <div className="App">
        <h1>Excel文件处理示例</h1>
        <XlsxHandler />
      </div>
    </ConfigProvider>
  );
}

export default App;

五、技术要点解析

1. 文件读取流程

  1. 使用HTML5的File API获取文件对象
  2. 通过FileReader读取二进制内容
  3. 使用SheetJS解析二进制流生成工作簿
  4. 提取第一个工作表的数据
  5. 转换为JSON格式渲染表格

2. 数据导出流程

  1. 将JSON数据转换为工作表
  2. 创建新的工作簿并添加工作表
  3. 使用writeFile方法生成Excel文件

3. 关键技术点

  • 二进制处理:必须使用readAsBinaryString方法读取文件
  • 键值映射:JSON字段名对应Excel列名
  • 类型校验:严格校验文件扩展名防止格式错误
  • 内存优化:及时释放FileReader实例避免内存泄漏

六、常见问题排查

问题现象解决方案
文件读取失败确保使用readAsBinaryString而非readAsArrayBuffer
中文乱码设置工作簿编码为utf-8
IE浏览器兼容添加polyfill支持FileReader API
大数据量卡顿采用Web Workers进行异步处理

七、扩展方向

  1. 支持多工作表选择
  2. 自定义导出模板
  3. 在线预览Excel内容
  4. 复杂公式计算支持

到此这篇关于前端读取与导出XLSX文件的完整指南的文章就介绍到这了,更多相关前端读取与导出XLSX内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 全面解析js中的原型,原型对象,原型链

    全面解析js中的原型,原型对象,原型链

    这篇文章主要介绍了图解js中的原型,原型对象,原型链,帮助大家更好的理解和使用JavaScript,感兴趣的朋友可以了解下
    2021-01-01
  • 微信开发之微信jssdk录音功能开发示例

    微信开发之微信jssdk录音功能开发示例

    这篇文章主要介绍了微信开发之微信jssdk录音功能开发示例,在微信浏览器内打开的页面,制作一个按钮,用户按住按钮后开始录音,松手后停止录音,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • 小程序实现搜索框

    小程序实现搜索框

    搜索框无论是在电商网站还是小程序中都很常见,这篇文章主要就为大家详细介绍了小程序如何实现搜索框,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • Javascript动画效果(4)

    Javascript动画效果(4)

    这篇文章主要为大家详细介绍了第四篇Javascript动画效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • 纯JS实现弹性导航条效果

    纯JS实现弹性导航条效果

    本文主要介绍了纯JS实现弹性导航条效果的实例,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • javascript实现编写网页版计算器

    javascript实现编写网页版计算器

    这篇文章主要为大家详细介绍了javascript实现编写网页版计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • js的各种数据类型判断的介绍

    js的各种数据类型判断的介绍

    今天小编就为大家分享一篇关于js的各种数据类型判断的介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • javascript中setAttribute()函数使用方法及兼容性

    javascript中setAttribute()函数使用方法及兼容性

    这篇文章主要介绍了javascript中setAttribute()函数使用方法及兼容性的相关资料,需要的朋友可以参考下
    2015-07-07
  • JavaScript包装对象使用详解

    JavaScript包装对象使用详解

    javascript代码运行的过程中基本类型会找到对应的包装对象,然后包装对象把所有的属性和方法给了基本类型,然后包装对象被系统进行销毁,所以理解了包装对象可以很好的理解之前写的代码为什么可以这样做了。
    2015-07-07
  • JavaScript事件监听器addEventListener()方法和一些基本事件详解

    JavaScript事件监听器addEventListener()方法和一些基本事件详解

    这篇文章主要介绍了JavaScript事件监听器addEventListener()方法和一些基本事件,这篇文章主要介绍了JavaScript事件监听器addEventListener()方法和一些基本事件的相关资料,需要的朋友可以参考下
    2024-10-10

最新评论