使用JavaScript实现前端导入和导出excel文件?(H5编辑器实战)
xsobi 2024-12-27 17:28 8 浏览
前言
最近笔者终于把H5-Dooring的后台管理系统初步搭建完成, 有了初步的数据采集和数据分析能力, 接下来我们就复盘一下其中涉及的几个知识点,并一一阐述其在Dooring H5可视化编辑器中的解决方案. 笔者将分成3篇文章来复盘, 主要解决场景如下: 如何使用JavaScript实现前端导入和导出excel文件(H5编辑器实战复盘) 前端如何基于table中的数据一键生成多维度数据可视化分析报表 * 如何实现会员管理系统下的权限路由和权限菜单
以上场景也是前端工程师在开发后台管理系统中经常遇到的或者即将遇到的问题, 本文是上述介绍中的第一篇文章, 你将收获: 使用JavaScript实现前端导入excel文件并自动生成可编辑的Table组件 使用JavaScript实现前端基于Table数据一键导出excel文件 * XLSX和js-export-excel基本使用
正文
本文接下来的内容素材都是基于H5可视化编辑器(H5-Dooring)项目的截图, 如果想实际体验, 可以访问H5-Dooring网站实际体验. 接下来我们直接开始我们的方案实现.
1. 使用JavaScript实现前端导入excel文件并自动生成可编辑的Table组件
在开始实现之前, 我们先来看看实现效果.
1.1 实现效果
导入excel文件并通过antd的table组件渲染table:
编辑table组件:
保存table数据后实时渲染可视化图表:
以上就是我们实现导入excel文件后, 编辑table, 最后动态生成图表的完整流程.
1.2 实现一键导入excel文件并生成table表格
导入excel文件的功能我们可以用javascript原生的方式实现解析, 比如可以用fileReader这些原生api,但考虑到开发效率和后期的维护, 笔者这里采用antd的Upload组件和XLSX来实现上传文件并解析的功能. 由于我们采用antd的table组件来渲染数据, 所以我们需要手动将解析出来的数据转换成table支持的数据格式.大致流程如下:
所以我们需要做的就是将Upload得到的文件数据传给xlsx, 由xlsx生成解析对象, 最后我们利用javascript算法将xlsx的对象处理成ant-table支持的数据格式即可. 这里我们用到了FileReader对象, 目的是将文件转化为BinaryString, 然后我们就可以用xlsx的binary模式来读取excel数据了, 代码如下:
// 解析并提取excel数据
let reader = new FileReader();
reader.onload = function(e) {
let data = e.target.result;
let workbook = XLSX.read(data, {type: 'binary'});
let sheetNames = workbook.SheetNames; // 工作表名称集合
let draftObj = {}
sheetNames.forEach(name => {
// 通过工作表名称来获取指定工作表
let worksheet = workbook.Sheets[name];
for(let key in worksheet) {
// v是读取单元格的原始值
if(key[0] !== '!') {
if(draftObj[key[0]]) {
draftObj[key[0]].push(worksheet[key].v)
}else {
draftObj[key[0]] = [worksheet[key].v]
}
}
}
});
// 生成ant-table支持的数据格式
let sourceData = Object.values(draftObj).map((item,i) => ({ key: i + '', name: item[0], value: item[1]}))
经过以上处理, 我们得到的sourceData即是ant-table可用的数据结构, 至此我们就实现了表格导入的功能.
1.3 table表格的编辑功能实现
table表格的编辑功能实现其实也很简单, 我们只需要按照antd的table组件提供的自定义行和单元格的实现方式即可. antd官网上也有实现可编辑表格的实现方案, 如下:
大家感兴趣的可以研究一下. 当然自己实现可编辑的表格也很简单, 而且有很多方式, 比如用column的render函数来动态切换表格的编辑状态, 或者使用弹窗编辑等都是可以的.
1.4 根据编辑的table数据动态生成图表
根据table数据动态生成图表这块需要有一定的约定, 我们需要符合图表库的数据规范, 不过我们有了table数据, 处理数据规范当然是很简单的事情了, 笔者的可视化库采用antv的f2实现, 所以需要做一层适配来使得f2能消费我们的数据.
还有一点就是为了能使用多张图表, 我们需要对f2的图表进行统一封装, 使其成为符合我们应用场景的可视化组件库.
我们先看看f2的使用的数据格式:
const data = [
{ genre: 'Sports', sold: 275 },
{ genre: 'Strategy', sold: 115 },
{ genre: 'Action', sold: 120 },
{ genre: 'Shooter', sold: 350 },
{ genre: 'Other', sold: 150 }
];
此数据格式会渲染成如下的图表:
所以说我们总结下来其主要有2个纬度的指标, 包括它们的面积图, 饼图, 折线图, 格式都基本一致, 所以我们可以基于这一点封装成组件的可视化组件, 如下:
import { Chart } from '@antv/f2';
import React, { memo, useEffect, useRef } from 'react';
import ChartImg from '@/assets/chart.png';
import styles from './index.less';
import { IChartConfig } from './schema';
interface XChartProps extends IChartConfig {
isTpl: boolean;
}
const XChart = (props: XChartProps) => {
const { isTpl, data, color, size, paddingTop, title } = props;
const chartRef = useRef(null);
useEffect(() => {
if (!isTpl) {
const chart = new Chart({
el: chartRef.current || undefined,
pixelRatio: window.devicePixelRatio, // 指定分辨率
});
// step 2: 处理数据
const dataX = data.map(item => ({ ...item, value: Number(item.value) }));
// Step 2: 载入数据源
chart.source(dataX);
// Step 3:创建图形语法,绘制柱状图,由 genre 和 sold 两个属性决定图形位置,genre 映射至 x 轴,sold 映射至 y 轴
chart
.interval()
.position('name*value')
.color('name');
// Step 4: 渲染图表
chart.render();
}
}, [data, isTpl]);
return (
<div className={styles.chartWrap}>
<div className={styles.chartTitle} style={{ color, fontSize: size, paddingTop }}>
{title}
</div>
{isTpl ? <img src={ChartImg} alt="dooring chart" /> : <canvas ref={chartRef}></canvas>}
</div>
);
};
export default memo(XChart);
当然其他的可视化组件也可以用相同的模式封装,这里就不一一举例了. 以上的组件封装使用react的hooks组件, vue的也类似, 基本原理都一致.
2. 使用JavaScript实现前端基于Table数据一键导出excel文件
同样的, 我们实现将table数据一键导出为excel也是类似, 不过方案有所不同, 我们先来看看在Dooring中的实现效果.
2.1 一键导出为excel实现效果
以上就是用户基于后台采集到的数据, 一键导出excel文件的流程, 最后一张图是生成的excel文件在office软件中的呈现.
2.2 使用javascript实现一键导出excel文件功能
一键导出功能主要用在H5-Dooring的后台管理页面中, 为用户提供方便的导出数据能力. 我们这里导出功能也依然能使用xlsx来实现, 但是综合对比了一下笔者发现有更简单的方案, 接下来笔者会详细介绍, 首先我们还是来看一下流程:
很明显我们的导出流程比导入流程简单很多, 我们只需要将table的数据格式反编译成插件支持的数据即可. 这里笔者使用了js-export-excel来做文件导出, 使用它非常灵活,我们可以自定义: 自定义导出的excel文件名 自定义excel的过滤字段 * 自定义excel文件中每列的表头名称
由于js-export-excel支持的数据结构是数组对象, 所以我们需要花点功夫把table的数据转换成数组对象, 其中需要注意的是ant的table数据结构中键对应的值可以是数组, 但是js-export-excel键对应的值是字符串, 所以我们要把数组转换成字符串,如[a,b,c]变成'a,b,c', 所以我们需要对数据格式进行转换, 具体实现如下:
const generateExcel = () => {
let option = {}; //option代表的就是excel文件
let dataTable = []; //excel文件中的数据内容
let len = list.length;
if (len) {
for(let i=0; i<len; i++) {
let row = list[i];
let obj:any = {};
for(let key in row) {
if(typeof row[key] === 'object') {
let arr = row[key];
obj[key] = arr.map((item:any) => (typeof item === 'object' ? item.label : item)).join(',')
}else {
obj[key] = row[key]
}
}
dataTable.push(obj); //设置excel中每列所获取的数据源
}
}
let tableKeys = Object.keys(dataTable[0]);
option.fileName = tableName; //excel文件名称
option.datas = [
{
sheetData: dataTable, //excel文件中的数据源
sheetName: tableName, //excel文件中sheet页名称
sheetFilter: tableKeys, //excel文件中需显示的列数据
sheetHeader: tableKeys, //excel文件中每列的表头名称
}
]
let toExcel = new ExportJsonExcel(option); //生成excel文件
toExcel.saveExcel(); //下载excel文件
}
注意, 以上笔者实现的方案对任何table组件都使用, 可直接使用以上代码在大多数场景下使用. 至此, 我们就实现了使用JavaScript实现前端导入和导出excel文件的功能.
所以, 今天你又博学了吗?
最后
以上教程笔者已经集成到H5-Dooring中,对于一些更复杂的交互功能,通过合理的设计也是可以实现的,大家可以自行探索研究。
如果想学习更多H5游戏, webpack,node,gulp,css3,javascript,nodeJS,canvas数据可视化等前端知识和实战,欢迎在《趣谈前端》一起学习讨论,共同探索前端的边界。
相关推荐
- 淘宝后台怎么设置微信支付方式,如何操作?
-
一、登录淘宝商家后台首先,打开淘宝商家后台的登录页面,输入用户名和密码进行登录。如果没有注册淘宝商家账号,可以先进行注册,注册成功后再登录。二、进入“支付设置”页面登录成功后,点击页面右上角的“设置”...
- CMS系统是什么?(cms包括什么)
-
CMS系统指的是“内容管理系统”,是用来发布网络内容的一体化Web管理系统。CMS系统主要有两类功能,一类是搭建网站,另一类是用来管理和发布内容。...
- 后台首页应该如何设计?(店铺首页设计图片)
-
在设计之前,尽可能进行用户访谈,深入每个角色的场景,分析其业务重点和痛点,了解每个客户角色对产品的期望。1)梳理业务和功能架构主页和导航共同构成了产品的外观。在设计首页之前,需要完成业务和功能架构设...
- 今日头条MCN.登录电脑端头条号后台,功能使用管理
-
明日头条MCN也叫父子号或则矩阵是指有能力管理一定规模头条号账号的机构,内容包括微头条、图文、短视频等体裁。平台希望凭着对MCN机构规范化的管理,共同构建出一个良性、活跃的内容生态,与更多领域的MCN...
- 家里的WiFi被蹭了,咋办?(家里被蹭网了)
-
某一天在家中上网...
- AI销售数据分析神器 + 超强推理模型
-
这款AI销售数据分析工具通过自动化分析和推理模型,快速生成详细报告,帮助销售团队精准定位问题、发现亮点,优化策略。无论是产品分析、地区对比还是成本结构,它都能提供全面洞察和可执行建议。干销售,最头疼啥...
- 大学宿舍上网问题解决方案,让你上网更稳定更快捷!
-
大学宿舍上网是许多大学生关心的问题,一直以来都存在着网速慢、不稳定等困扰。但是,只要采取正确的解决方法,大学宿舍上网问题就可以迎刃而解。一、了解宿舍网络环境在解决宿舍上网问题之前,我们需要了解宿舍的网...
- 剑灵2台服卡界面、卡加载界面、卡登录界面的解决方法
-
《剑灵2》是一款大型多人在线角色扮演游戏,在《剑灵2》中,过去的英雄将成为传说,玩家将承接后面的全新探险,将谱写《剑灵》的全新篇章。该游戏上线以来,许多玩家小伙伴已经纷纷下载游玩,但是有不少玩家在游玩...
- SOLIDWORKS PDM库设定冷存储模式(solidworks保存p2d格式)
-
众所周知SOLIDWORKSPDM作为管理企业研发数据的工具,不但帮助企业集中管理了研发数据,也记录了企业产品的研发过程即文件的版本。...
- 这个软路由系统自带NAS和应用商店:iStore OS,降低软路由门槛!
-
开篇碎碎念大家好,相信不少朋友都听过软路由,甚至不少朋友已经玩上了软路由,原版软路由系统上手还是有一定难度的,所以本期来介绍和体验一个基于OpenWRT改版而来的易用的软路由系统:iStoreOS。...
- Windows RDP远程桌面登录(mstsc)卡死显示请稍候的画面的解决办法
-
WindowsRDP远程登录(mstsc)卡死一直等待变成请稍候(PleaseWait)的画面如何解决。相信很多人都遇到过,但搜索国内所有网站,均没有一个根本性的解决方案,很多都是答非所问。都不能...
- 手把手教您登记公共数据资源(公共数据是什么)
-
3月1日,国家公共数据资源登记平台(https://sjdj.nda.gov.cn)正式上线。您可通过以下5个步骤开展登记工作:1.注册登录登录国家公共数据资源登记平台官网后,点击右上角【注册】或【我...
- 获取微信小程序页面路径(如何获取微信小程序路径)
-
登录小程序后台(https://mp.weixin.qq.com/),在顶部导航栏的“工具-生成小程序码”可进入小程序页面路径默认显示首页路径,用户可获取该小程序更多页面路径。...
- SaaS系统框架搭建详解(saas软件开发框架)
-
SaaS系统能提供一个或者多个行业常见场景的功能支持,只要在有网络的情况下,便“随处可用、拿来即用、不用下载”,所以现在也是一个流行的趋势。本文介绍了SaaS系统的框架搭建,一起来学习一下吧。根据百度...
- 暗黑4XGP卡在载入界面、登录界面卡住、登录不上去有效解决
-
想要以更低的价格体验到暗黑破坏神4的好玩之处,那么你可以选择加入XGP。近日,该游戏更新了“炼狱大军”赛季,这几天总有玩家遇到暗黑4XGP卡在载入界面、登录界面卡住、登录不上去的困难。下面就由小编和迅...
- 一周热门
- 最近发表
- 标签列表
-
- grid 设置 (58)
- 移位运算 (48)
- not specified (45)
- 导航栏 (58)
- context xml (46)
- scroll (43)
- dedecms模版 (53)
- c 视频教程下载 (33)
- listview排序 (33)
- characterencodingfilter (33)
- getmonth (34)
- label换行 (33)
- android studio 3 0 (34)
- html转js (35)
- 索引的作用 (33)
- checkedlistbox (34)
- xmlhttp (35)
- mysql更改密码 (34)
- 权限777 (33)
- htmlposition (33)
- 学校网站模板 (34)
- textarea换行 (34)
- 轮播 (34)
- asp net三层架构 (38)
- bash (34)