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

网站设计的主要内容个人简历word可编辑

网站设计的主要内容,个人简历word可编辑,蒙古文政务网站群建设工作方案,手机网站开发成本文章目录 前言一、为什么需要封装 Excel 组件?二、技术选型三、核心实现1. 安装依赖2. 封装Excel导出3. 封装导入组件 (UploadExcel) 总结 前言 在 React 项目中,处理 Excel 文件的导入和导出是常见的业务需求。无论是导出报表数…

文章目录

  • 前言
    • 一、为什么需要封装 Excel 组件?
    • 二、技术选型
    • 三、核心实现
      • 1. 安装依赖
      • 2. 封装Excel导出
      • 3. 封装导入组件 (UploadExcel)
  • 总结


前言

在 React 项目中,处理 Excel 文件的导入和导出是常见的业务需求。无论是导出报表数据供用户下载,还是让用户上传 Excel 文件进行数据解析,一个高效、易用的组件都能极大提升开发效率和用户体验。本文将分享如何在 React 项目中封装一个通用的 Excel 导入导出组件,涵盖核心实现思路、代码示例以及最佳实践。


一、为什么需要封装 Excel 组件?

  1. 统一处理逻辑:避免在多个页面重复编写 Excel 解析或生成代码。
  2. 提升用户体验:通过统一的 UI 和交互,降低用户学习成本。
  3. 减少错误:集中处理文件格式校验、数据转换等易错环节。
  4. 可扩展性:支持自定义配置(如列映射、样式调整等)。

二、技术选型

  • 导出 Excel:使用 xlsx 库 & file-saver
  • 导入 Excel:使用 xlsx 库解析文件内容。
  • UI 框架:基于 Ant Design 的 Upload 组件或自定义按钮。

三、核心实现

1. 安装依赖

	npm install xlsx file-saver @ant-design/icons# 或使用 yarnyarn add xlsx file-saver @ant-design/icons

2. 封装Excel导出

根据泛型传入不同的data数据类型和动态传递header表头

import * as XLSX from "xlsx";
import { saveAs } from "file-saver";/***  导出Excel* @param data* @param header*/
export function exportExcel<T>(data: T[], header: string[]) {const worksheet = XLSX.utils.json_to_sheet(data, { header });// 创建工作簿const workbook = XLSX.utils.book_new();// 将工作表添加到工作簿XLSX.utils.book_append_sheet(workbook, worksheet, "Sheet1");// 将工作簿转换为二进制数据const excelBuffer = XLSX.write(workbook, { bookType: "xlsx", type: "array" });// 创建 Blob 对象const blob = new Blob([excelBuffer], { type: "application/octet-stream" });// 使用 file-saver 库保存文件saveAs(blob, "exported_data.xlsx");
}

使用示例

import {useState} from 'react'
import { exportExcel } from "@/utils/exprotExcel";
// 这个是antd的table组件的表格多选框 selectedRowKeys, setSelectedRowKeys要绑定的状态值
const [selectedRowKeys, setSelectedRowKeys] = useState<React.Key[]>([]); 
const [selectRows, setSelectRows] = useState<IBill[]>([]); 
const header = ["accountNo","status","roomNo","carNo","tel","costName1","costName2","costName3","startDate","endDate","preferential","money","pay",
];// 多选const onSelectChange = (selectedRowKeys: React.Key[],selectedRows: IBill[]) => {setSelectedRowKeys(selectedRowKeys);setSelectRows(selectedRows);};// 多选框配置项const rowSelection = {selectedRowKeys,onChange: onSelectChange,preserveSelectedRowKeys: true,};// 这下面是结构
<Tableloading={loading}dataSource={billList}columns={columns}pagination={false}rowKey={(record) => record.accountNo}scroll={{ x: 1200 }}rowSelection={rowSelection}/><Button// 使用封装好的Excel导出组件type="primary"onClick={() => exportExcel(selectRows, header)}icon={<DownloadOutlined />}disabled={disabled}>导出为Excel
</Button>

在这里插入图片描述
在这里插入图片描述


3. 封装导入组件 (UploadExcel)

import { Upload, message } from "antd";
import type { UploadProps } from "antd";
import { InboxOutlined } from "@ant-design/icons";
const { Dragger } = Upload;import * as XLSX from "xlsx";interface ExcelRowItem {[key: number]: string; // 索引签名,允许任意数字键
}interface IParms<U> {setStaffList: (staffList: (prev: U[]) => U[]) => void;headers: (keyof U)[];
}
// 处理导入的Excel数据
function handleImpotedJson<T>(jsonArr: ExcelRowItem[],headers: (keyof T)[] // 将 headers 明确为 T 的键数组
) {// 去掉表头jsonArr.splice(0, 1);const jsonArrData: T[] = jsonArr.map((item: ExcelRowItem) => {console.log(item, "item");// 这样做可以避免不用初始化对象,不用硬编码Partialconst jsonObj: Partial<T> = {};// const jsonObj: T = {//   key: Math.floor(Math.random() * 10000000),//   name: item[0],//   region: item[1],//   role: item[2],//   phone: item[3],// };// 动态生成表头headers.forEach((header, index) => {const value = item[index];if (value !== undefined) {jsonObj[header] = value as T[keyof T];}});return jsonObj as T;});console.log(jsonArrData, "jsonArrData");return jsonArrData;
}/***  Excel上传组件* @param param0  传参需要:1.useState表格数据列表 2.表头信息 3.传表头的泛型* @returns*/
function UploadExcel<U>({ setStaffList, headers }: IParms<U>) {const props: UploadProps = {name: "file",multiple: true,accept: ".xls,.xlsx", // 只允许上传 Excel 文件action: "https://www.demo.com/import",onChange(info) {console.log("我同时触发了onChange和onDrop");const { status } = info.file;if (status !== "uploading") {const file = info.file.originFileObj; //if (file) {const reader = new FileReader();reader.onload = (e) => {const target = e.target?.result as ArrayBuffer;if (target) {const data = target; // 安全访问const workbook = XLSX.read(data, { type: "binary" });const first_worksheet = workbook.Sheets[workbook.SheetNames[0]];const jsonArr = XLSX.utils.sheet_to_json(first_worksheet, {header: 1,});const res = handleImpotedJson<U>(jsonArr as ExcelRowItem[],headers);console.log(res, "我是最后的结果");setStaffList((prevStaffList) => {return [...prevStaffList, ...res];});// 添加这一行,开始读取文件reader.readAsArrayBuffer(file);}}if (status === "done") {message.success(`${info.file.name} 文件已成功上传.`);} else if (status === "error") {message.error(`${info.file.name} 文件上传失败.`);}},onDrop(e) {console.log("我开始拖拽了", e.dataTransfer.files);},};return (//  这个是antd的上传组件<><Dragger {...props}><p className="ant-upload-drag-icon"><InboxOutlined /></p><p className="ant-upload-text">点击或拖拽上传文件哦!!!</p><p className="ant-upload-hint">支持单个文件或批量上传。严禁上传公司数据或其他受禁文件。</p></Dragger></>);
}export default UploadExcel;

使用示例:
也是引入组件,传表头,和你的修改状态的setState

import UploadExcel from "@/components/UploadExcel";
import {useState} from 'react'const [staffList, setStaffList] = useState<IStaff[]>([]);const header: StaffKeys[] = ["name", "region", "role", "phone"];<UploadExcel<StaffMemberData>headers={header}setStaffList={setStaffList}/>

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

通过封装 Excel 导入导出组件,我们可以将重复的逻辑抽象为可复用的模块,提升开发效率和代码质量。关键点包括:

  • 使用 xlsx 库处理核心逻辑。
  • 结合 Ant Design 等 UI 框架提升交互体验。
  • 通过配置化(如列映射、泛型约束)满足不同场景需求。

文章转载自:

http://KAZ05dNQ.hzryL.cn
http://BnpkTRK8.hzryL.cn
http://lWx81VrV.hzryL.cn
http://Tnfd8U22.hzryL.cn
http://LBgREqPq.hzryL.cn
http://n8B1KljQ.hzryL.cn
http://aXH0Zq9m.hzryL.cn
http://UArc03fk.hzryL.cn
http://ZVr1tPC7.hzryL.cn
http://QKF1qbzg.hzryL.cn
http://A8O6CxOF.hzryL.cn
http://SC3Xs628.hzryL.cn
http://V4VEqArc.hzryL.cn
http://A2115q0D.hzryL.cn
http://qSGfybzR.hzryL.cn
http://ERL8AMOo.hzryL.cn
http://xwQpQk3i.hzryL.cn
http://QRxg1OFd.hzryL.cn
http://wj4RpU1d.hzryL.cn
http://SxJTBHBi.hzryL.cn
http://29soNre6.hzryL.cn
http://AgNqPXeo.hzryL.cn
http://iSiqAwrl.hzryL.cn
http://9PylJYYe.hzryL.cn
http://8JpAGGUO.hzryL.cn
http://Gk4dOtzJ.hzryL.cn
http://AgsyHP43.hzryL.cn
http://WYvfrtIP.hzryL.cn
http://HqA7F2l0.hzryL.cn
http://CfkQE99R.hzryL.cn
http://www.dtcms.com/wzjs/735105.html

相关文章:

  • 有人做家具网站中介吗接效果图做网站
  • 做网站对外贸有什么用微信做的地方门户网站
  • 上海网站建设网开什么网店简单又挣钱
  • 无锡网站营销推广网络工程师做什么的
  • 佛山建网站哪家好网络域名是什么
  • 网站制作 番禺ps网站建设教程视频
  • 企业网站 阿里云大连做网站哪里好
  • 河南网站关键词优化代理wordpress手机版侧栏导航条
  • 做视频网站需要哪些条件京东企业采购平台
  • 西部数码网站工具wordpress如何修改页脚
  • seo网站模版内蒙古兴安盟建设局网站
  • 监控设备网站制作公司做环评的网站
  • wordpress网站编辑深圳品牌营销策划机构
  • 磁力屋torrentkitty济南seo网站建站
  • 网站开发基本语言做网站找景安
  • wordpress 批量建站吴忠住房和城乡建设局网站
  • 门户网站集群建设公司logo免费生成器
  • 科站网站网站开发所遵循
  • asp网站开发技术总结与收获推荐网站网页
  • 关于网站开发的创业计划书泰州城乡建设局网站
  • 做汽车配件网站的公司黄岛网站建设哪家专业
  • 网站做镜像是什么浙江网站建设和制作
  • 骨科医院网站模板asp做网站基本过程
  • wordpress邮箱配置stmp昆明seo网站排名
  • 做美食推广的网站wordpress 屏蔽搜索
  • 常见的制作网站的工具2020中国企业500强榜单
  • 网站特色页面建设自创网站怎么赚钱
  • 网站建设模板素材有哪些专门做展会创意的网站
  • 网站推广经验大丰网站建设公司
  • 爱站网seo工具查询俄罗斯在线 网站制作