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

使用 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 文件,并将表头信息以表格形式展示。这个功能在数据管理和报表生成中非常有用。希望本文能帮助你快速实现类似功能,提升你的开发效率!

相关文章:

  • 《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(27)混元幡遮天机 - 第一个错误版本(二分边界)
  • Java 学习记录:基础到进阶之路(一)
  • 如何实现pinia的持久化存储
  • 前端项目 Node.js 与 node-sass 版本兼容问题
  • Linux rpcbind漏洞
  • FlinkCDC3.3 使用 Mysql 8.4 报错
  • C# 委托中 Invoke/BeginInvoke/EndInvoke和DynamicInvoke 方法
  • 机器学习中的梯度下降是什么意思?
  • 数据结构 -并查集
  • makefile详解
  • SpringBoot加载配置文件的优先级
  • Windows编程----结束进程
  • echarts使用记录
  • 东林复试数据库原理总结
  • 嵌入式c学习四
  • 通道注意力机制、空间注意力机制、混合注意力机制
  • 高效自动化测试:打造Python+Requests+Pytest+Allure+YAML的接口测试框架
  • 燃气对我们生活的重要性体现在哪里?
  • kali linux更新sqlmap
  • C#中多线程访问对象锁问题的总结及解决方案
  • 建邦高科赴港上市,大股东陈子淳系山东建邦集团董事长陈箭之子
  • 全国共有共青团员7531.8万名,共青团组织439.7万个
  • 国铁集团去年收入12830亿元增3%,全年铁路运输利润总额创新高
  • 鲁迅先生儿媳、周海婴先生夫人马新云女士逝世,享年94岁
  • 气候资讯|4月全球前沿气候科学研究&极端天气气候事件
  • 普京与卢卡申科举行会晤,将扩大在飞机制造等领域合作