当前位置: 首页 > article >正文

使用 React 和 Ant Design 处理 Excel 和 CSV 文件

       在现代 Web 开发中,文件上传和解析是常见的需求。本文将介绍如何使用 React 和 Ant Design 库来处理 Excel 和 CSV 文件的上传,并将提取的表头信息展示在表格中。 

1. 项目基础

确保你已经创建了一个 React 项目,并安装了必要的依赖。可以使用以下命令安装 Ant Design 和 ExcelJS:

npm install antd exceljs

2. 组件结构

我们将构建一个名为 Demo 的组件,该组件包含文件上传功能,并在上传后展示表头信息。

代码结构

import Authority from '@/util/Authority';
import { Button, Table, Upload } from 'antd';
import { ColumnsType } from 'antd/es/table';
import Excel, { CellValue } from 'exceljs';
import { useState } from 'react';

const Demo = () => {
    const [headers, setHeaders] = useState<CellValue[]>([]);
    const authority = Authority.getInstance();
    
    const columns: ColumnsType<Record<string, any>> = [
        {
            title: '序号',
            dataIndex: 'index',
            key: 'index',
            align: 'center',
            render: (text: string, record: any, index: number) => index + 1,
        },
        {
            title: '名称',
            dataIndex: 'name',
            align: 'center',
            key: 'name',
        },
    ];

    return (
        <>
            <Upload
                maxCount={1}
                accept=".xlsx,.csv"
                showUploadList={false}
                action="请求地址"
                headers={{
                    Authorization: 你的token,
                }}
                data={(file) => {
                    return {
                        fileName: file.name,
                        mimeType: file.type,
                    };
                }}
                onChange={async (info) => {
                    if (info.file.status === 'done') {
                        const file = info.file.originFileObj;
                        const workbook = new Excel.Workbook();
                        const reader = new FileReader();
                        reader.onload = async (e) => {
                            const result = e.target?.result;
                            if (info.file.name.endsWith('.csv')) {
                                // 处理 CSV 文件
                                const lines = (result as string)?.split('\n');
                                const headers = lines[0].split(',');
                                const newHeaders = headers.map((header) => header.trim());
                                setHeaders(newHeaders);
                            } else {
                                // 处理 Excel 文件
                                const buffer = result as ArrayBuffer;
                                if (buffer) await workbook.xlsx.load(buffer);
                                const worksheet = workbook.getWorksheet(1);
                                const headers: CellValue[] = [];
                                worksheet?.getRow(1).eachCell((cell) => {
                                    headers.push(cell.value);
                                });
                                setHeaders(headers);
                            }
                        };
                        if (info.file.name.endsWith('.csv')) {
                            reader.readAsText(file!);
                        } else {
                            reader.readAsArrayBuffer(file!);
                        }
                    }
                }}
            >
                <Button id="upload">上传</Button>
            </Upload>
            {headers.length > 0 && (
                <Table
                    style={{ width: 500 }}
                    rowKey={(record, index) => `header${index}`}
                    columns={columns}
                    dataSource={headers.map((elem, index) => ({
                        index,
                        name: elem,
                    }))}
                    pagination={false}
                />
            )}
        </>
    );
};
export default Demo;

3. 代码解析

3.1 组件导入

       我们首先导入了需要的组件和库,包括 Ant Design 的 Upload 和 Table 组件,以及 ExcelJS 用于处理 Excel 文件。

3.2 状态管理

使用 useState 钩子来管理表头数据:

const [headers, setHeaders] = useState<CellValue[]>([]);

3.3 列配置

我们定义了表格列配置,包含序号和名称两列:

const columns: ColumnsType<Record<string, any>> = [
    {
        title: '序号',
        dataIndex: 'index',
        key: 'index',
        align: 'center',
        render: (text: string, record: any, index: number) => index + 1,
    },
    {
        title: '名称',
        dataIndex: 'name',
        align: 'center',
        key: 'name',
    },
];

3.4 文件上传和解析

Upload 组件用于实现文件上传。我们通过 onChange 事件处理文件的读取和解析:

  • CSV 文件:读取文本并提取表头。
  • Excel 文件:使用 exceljs 库解析并获取第一行内容。

3.5 表格展示

在文件上传并成功解析后,使用 Table 组件展示表头信息。表格的 dataSource 通过 headers 数组动态生成,包含序号和名称。

4.运行效果

上传的源文件:

解析之后的表格

5. 总结

       本文展示了如何使用 React 和 Ant Design 处理文件上传,解析 Excel 和 CSV 文件,并将表头信息以表格形式展示。这个功能在数据管理和报表生成中非常有用。希望本文能帮助你快速实现类似功能,提升你的开发效率!


http://www.kler.cn/a/581783.html

相关文章:

  • upload-labs-master通关攻略(1~4)
  • 本地部署 OpenManus 保姆级教程(Windows 版)
  • C语言零基础入门教程(1)
  • 关于sqlalchemy的ORM的使用
  • R语言中byrow参数的作用
  • 【GIT】non-fast-forward错误
  • 大白话react第十九章React 与 WebGL 项目的深度拓展和优化
  • 计算机图形学交互式技术实验(鼠标、拾取操作和菜单)——绘制可用鼠标进行修改颜色的五角星和矩形
  • Linux rpcbind漏洞
  • Python----计算机视觉处理(Opencv:自适应二值化,取均值,加权求和(高斯定理))
  • GitHub 项目版本管理与 Release 发布流程记录
  • 学习文章:Spring Boot 中 Redis 配置与序列化管理
  • 软件工程概述
  • 消息队列MQ使用场景有哪些?
  • 逐梦DBA:基本的SELECT语句
  • C#运算符详解
  • GStreamer —— 2.15、Windows下Qt加载GStreamer库后运行 - “播放教程 1:Playbin 使用“(附:完整源码)
  • AI重构私域增长:从流量收割到终身价值运营的三阶跃迁
  • AutoMQ x OSS 的 Iceberg 数据入湖的最佳实践
  • 深度评测DeepSeek、ChatGPT O1和谷歌Gemini AI应用开发场景 - DeepSeek性能完胜!