qidao123.com ToB IT社区-企服评测·应用市场

标题: Rust赋能前端: 纯血前端将 Table 导出 Excel [打印本页]

作者: 半亩花草    时间: 2025-11-21 19:26
标题: Rust赋能前端: 纯血前端将 Table 导出 Excel
人的本事靠自己,人的发展靠网络
  各人好,我是柒八九。一个专注于前端开发技能/Rust及AI应用知识分享的Coder
   此篇文章所涉及到的技能有
    由于,行笔墨数所限,有些概念大概会一带而过亦大概提供对应的学习资料。请各人酌情观看。
<hr> 媒介

自从前次更文Rust赋能前端: 给我0.02秒,天生一套Vite/Rsbuild前端项目已已往半个月之久了。
不是偷懒和怠惰了。而是年底了,工作有点多。以是,导致更文的速率和频率有点降落。
想必各人在平常业务开发的时间,或多或少都有过将前端页面中的table导出excel的需求。
通例的方案有几种
而,本日呢,我们提供一种方案,用Rust来处理处罚前端表格的导出(excel)。末了的结果就是,我们既可以实时得到导出结果,也能针对大数据表格实现高性能导出。而且还可以实现表格归并(静态/动态)。
运行结果

静态表格


静态长表格(1万条数据)


静态表格归并


动态表格归并


<hr> 好了,天不早了,干点正事哇。

<hr> 我们能所学到的知识点

     <hr> 1. 初志

着实呢,我们公司对于前端表格的导出,是走的纯后端处理处罚的模式。也就是
但是呢,迩来接到一个需求。这个需求可谓是Buff叠满。
然后,更诡异的是,后端同砚说他实现不了excel的动态归并。 这你能受的了吗。
既然,锅已经甩过来了,那没有不接的原理。正所谓,我不入地狱,谁入地狱?。那还是由我来哇。
更深的逻辑

着实,大部分业务场景中,各人对导出Table为Excel的通例做法都是通过异步接口来实现的。如许做也是有肯定的利益的。对于部分业务场景,我们须要记任命户的导出记录,这个利用就须要后端将记录入库。
但是呢,对于一些非后端记录的导出,我们就可以利用纯前端的方式了。着实针对这类的业务处理处罚,是有很多利益的。
   最好最快的哀求就是没有哀求
     以是,如果上天给我一种可以或许在前端环境中,又快又好的导出excel。我会绝不夷由的利用它
  <hr> 2. 案例展示

写在最前面

由于,我们是先讲我们wasm的本领,背面才会涉及到源码部分。但是呢,由于我们这个wasm兼容了很多环境,以是参数也是有很多传人方式和格式。以是,我们在讲示例之前,先讲讲参数的寄义。
我们在Rust中界说了和参数相干的Struct用于网络相干信息。
#[derive(Deserialize)] pub?struct?CellCoords?{ ????pub?column:?u32, ????pub?row:?u32, } #[derive(Deserialize)] pub?struct?MergedCell?{ ????pub?from:?CellCoords, ????pub?to:?CellCoords, } #[derive(Debug,?Serialize,?Deserialize)] struct?Column?{ ????title:?String, ????width:?serde_json::Value, ????dataIndex:?String, } #[derive(Deserialize)] struct?InputJson?{ ????name:?String, ????columns:?Vec<Column>, ????source:?Vec<std::collections::HashMap<String,?serde_json::Value>>, ????merge:?Option<Vec<MergedCell>>, ????correlation:?Option<Vec<String>>, }
   关于在Rust中怎样利用JSON相干的,可以看我们之前写的如安在Rust中利用JSON
  <hr> 项目初始化

还是熟悉的套路,我们利用npx f_cli_f create table2excel的前端项目。(发布到npm的f_cli_f的rspack版本的.gitignore缺失了,有空我重新发布一版)
我们选择rspack+antd+react+tailwind的前端模板。(下面的方案,着实和框架无关,也就是说我们可以在React/Vue中无痛利用该方案)
然后,我们将项目中的pages/Home中的更换为下面的代码。
import?init,?{?generate_excel?}?from?"@/wasm/table2excel"; import?{?Button,?Table?}?from?"antd"; import?{?useCallback,?useEffect,?useState?}?from?"react"; import?{?mergeDynamicTable,?mergeTable,?staticTable?}?from?"./data.js"; const?Home?=?()?=>?{ ?const?[time,?setTime]?=?useState(0); ?useEffect(()?=>?{ ??const?initWasmInstance?=?async?()?=>?{ ???await?init(); ??}; ??initWasmInstance(); ?},?[]); const?handleExcelBlob?=?(res:?Blob)?=>?{ ????const?blob?=?new?Blob([res],?{ ????????type:?"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,", ????}); ????const?a?=?document.createElement("a"); ????a.href?=?URL.createObjectURL(blob); ????a.download?=?"data.xlsx"; ????document.body.append(a); ????a.click(); }; const?handleExport4Static?=?async?()?=>?{ ????const?startTime?=?performance.now(); ????const?res?=?await?generate_excel({ ????????columns:?staticTable.columns, ????????source:?staticTable.source, ????????name:?"front789", ????????merge:?[], ????}); ????const?endTime?=?performance.now(); ????const?duration?=?endTime?-?startTime;? ????setTime(duration);? ????handleExcelBlob(res); }; ?return?( ??<section?className="h-screen?w-screen?overflow-auto?flex?flex-col?gap-10?p-20"> ???<div?className="flex?flex-col?gap-2"> ????<div?className="flex?items-center?gap-5"> ?????静态表格?<Button?onClick={handleExport4Static}>导出</Button>?<span>耗时:{time}ms</span> ????</div> ????<Table ?????columns={staticTable.columns} ?????bordered ?????dataSource={staticTable.source} ?????pagination={false} ????/> ???</div> ??</section> ?); }; export?default?Home;
此中,有几个外部文件,我们简朴说形貌一下

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com ToB IT社区-企服评测·应用市场 (https://www.qidao123.com/bbs/) Powered by Discuz! X3.5