前端如何实现将多页数据合并导出到Excel单Sheet页解决方案|内附代码

news/2024/7/21 5:25:03 标签: 前端, excel, 信息可视化

前端与数据展示

前后端分离是当前比较盛行的开发模式,它使项目的分工更加明确,后端负责处理、存储数据;前端负责显示数据.前端和后端开发人员通过接口进行数据的交换。因此前端最重要的能力是需要将数据呈现给用户后,与终端用户进行交互。

前端拿到数据后,需要将数据在客户端浏览器端进行绘制,最常见的数据呈现方式:

表格类数据呈现:通过为用户提供查询面板,用户输入相关搜索条件后,以二维表的形式呈现数据。

**图表可视化:**表格大都呈现明细的数据,虽然罗列的数据非常多,但数据不够直观无法快速查看数据的汇总分析,以及分布情况,那么前端数据呈现,以可视化的方式展示需求也非常普遍。

**高级的数据呈现:**数据可视化大屏,这种数据呈现往往是为决策者提供的,决策者主要关注宏观的数据报告,并且基于数据报告再进一步做明细数据分析。

前端数据导出及痛点

前端进行数据呈现后,只解决了用户需求的第一步,数据呈现只是解决了数据看得见的问题,但要进一步利用数据才能发挥数据的真正价值。因此对于最终用户看到数据后,往往需要二次分析和存档,所以98%的项目都需要用到纯前端的导出,而导出Excel 和PDF 又是最为普遍的两种格式,这篇文章我们先来分享导出Excel 常见的痛点问题:

无法在前端将多页的表格数据导出到Excel 中的单 Sheet,即数据在展示时有多少页,那么在导出到Excel就会产出多少个Sheet表单。

如果数据量过大,在前端纯导出Excel会容易导致客户端浏览器崩溃,内存溢出等性能问题,导致用户体验非常不好。

解决方法:

ActiveReportsJS 是纯前端的报表控件,可以用ActiveReportsJS 来解决前端的数据呈现,分页等问题,在使用ActiveReportsJS报表时,常常有明细清单展示类报表的需求,对于这种报表基本都会有导出Excel的需要,目前不支持直接导出成一个Sheet页的Excel,默认导出的是多Sheet页Excel;针对这种需求,我们验证一个解决改问题的方案,本贴就来介绍该方案如何实现;

实现思路如下:
后端实现一个接口,接收Blob类型Excel流,然后将Excel多Sheet页合并成一个Sheet页,然后通过文件流返回给前端
前端利用ACTIVEREPORTSJS自带的导出Excel,导出Blob类型,然后通过POST请求调用后端接口将Blob流传给后端,下载后端返回的流

具体实现步骤:

前端两种方式:
第一种:
利用ActiveReportsJS的Viewer.Export导出Excel,该接口返回的result包含data属性和download方法,然后调用后端接口,将result.data传递给后端。

Viewer

.export("xlsx", settings, { cancel: cancelCallback })

.then((result) => {

let formData = new FormData();

formData.append("file", result.data);

let url = "http://localhost:8088/ExcelMergerSheet";

fetch(url, {

method: 'POST',

mode: 'cors',

body: formData

}).then(function (response) {

return response.blob();

}).then(blob => {

console.log(blob)

let downloadElement = document.createElement('a');

let href = window.URL.createObjectURL(blob); //创建下载的链接

downloadElement.href = href;

downloadElement.download = reportName + '.XLSX'; //下载后文件名

document.body.appendChild(downloadElement);

downloadElement.click(); //点击下载

document.body.removeChild(downloadElement); //下载完成移除元素

window.URL.revokeObjectURL(href); //释放掉blob对象

})

});

具体Viewer.export可以参考文档:
https://demo.grapecity.com.cn/ac … dExportExcel/purejs

第二种:
利用Excel.exportDocument无预览导出Excel,该接口返回的result包含data属性和download方法,然后调用后端接口,将result.data传递给后端。

function runExcel() {

var ACTIVEREPORTSJS = GC.ActiveReports.Core;

var Excel = GC.ActiveReports.XlsxExport;

var settings = {

sheetName: "test",

pageSettings: {

size: "A4",

orientation: "portrait",

},

};

var pageReport = new ACTIVEREPORTSJS.PageReport();

pageReport

.load("1.rdlx-json")

.then(function () {

return pageReport.run();

})

.then(function (pageDocument) {

return Excel.exportDocument(pageDocument, settings);

})

.then(function (result) {

let formData = new FormData();

formData.append("file", result.data);

fetch("http://localhost:8088/ExcelMergerSheet", {

method: 'POST',

mode: 'cors',

body: formData

}).then((response) => {

return response.blob()

}).then((blob) => {

const link = document.createElement('a');

link.href = URL.createObjectURL(blob);

link.setAttribute('download', 'excel.xlsx')

link.click();

link.remove();

URL.revokeObjectURL(link.href);

})

});

}

具体Excel.exportDocument可以参考文档:
https://demo.grapecity.com.cn/activereportsjs/demos/api/export/purejs

后端实现方式:

我这边是采用python实现了一个接口,接收前端传递的Blob文件流,然后进行多Sheet页的Excel合并,然后再返回文件流供前端下载。

后端程序可以部署到服务器上,如果是windows服务器,可以直接下载exe,在服务器上运行。

下载链接: https://pan.baidu.com/s/191K-txbS-H03ux3JAl-R-g 提取码: f7gk

Linux服务器的话需要将源码拷贝到服务器去运行,源码如下,也可以根据自己需要进行调整和修改, 大家可以自己来尝试下:

https://gcdn.grapecity.com.cn/forum.php?mod=attachment&aid=MjUzNTM1fGM1ODdmY2EyfDE2NzM0MjEwNTl8NjI2NzZ8OTk3MTg%3D

另附 前端100张数据可视化大屏模板,按需取用:

https://www.grapecity.com.cn/solutions/wyn/demo


http://www.niftyadmin.cn/n/53817.html

相关文章

根据报告20%的白领在一年内做过副业,你有做副业吗?

现在大部分人收入单一,收入都是来源于本职工作,当没有了工作就没有了收入的来源,而生活压力又很大,各种开支,各种消费。所以很多人想要增加收入来源,增加被动收入,同时通过副业提升自己的价值和…

企业舆情监测多少钱,TOOM舆情监测专业服务平台

企业舆情监测的费用因公司不同而异,具体需要多少钱取决于您的需求和舆情监测公司的收费标准。一些因素,如舆情监测范围、数据收集方式、舆情分析报告等细节,都可能影响最终的费用。最好联系舆情监测公司询问具体收费标准。企业舆情监测多少钱…

在阿里干了8年测试的表哥放假回来了,聊完之后大彻大悟

表哥是阿里某个项目组的测试开发,今年过年提前半个月放假回来了,一见面就给我们几个弟弟妹妹一人拿了部iPhone13pm。这一出手属实是阔绰,想想他的工作单位,也许对于他来说三四万也就是半个月工资而已。想想我那个小公司&#xff0…

PyTorch学习笔记:nn.Tanh——Tanh激活函数

PyTorch学习笔记:nn.Tanh——Tanh激活函数 torch.nn.Tanh()功能:逐元素应用Tanh函数(双曲正切)对数据进行激活,将元素调整到区间(-1,1)内 函数方程: Tanh(x)tanh(x)ex−e−xexe−x\text{Tanh}(x)\text{ta…

day01常用DOS命令

day01课堂笔记(第一章 Java开发环境的搭建) 1、常用的DOS命令 1.1、怎么打开DOS命令窗口 win键 r (组合键):可以打开“运行”窗口 在运行窗口文本框中输入: cmd 然后回车 1.2、什么是DOS命令呢? 在DOS命令…

Codeforces Round #851 (Div. 2) A — C

Codeforces Round #851 A. One and Two 题目描述 给定一个序列a中的每个元素都是1或2。找出整数k是否存在,以满足以题目所给条件。 题目分析 1对乘积没有贡献,只需要注意2的个数即可,偶数个2即可满足条件,记录第cnt/2个2的位…

第41章 地址、用户地址实体及其约束规则的定义实现

1 Core.Domain.Common.Address namespace Core.Domain.Common { /// <summary> /// 【地址--类】 /// <remarks> /// 摘要&#xff1a; /// 通过该实体类及其属性成员&#xff0c;用于实现当前程序【Core】.【领域】.【常规】.【地址】实体与“[ShopDemo].[A…

151、【动态规划】leetcode ——2. 01背包问题:二维数组+一维数组(C++版本)

题目描述 原题链接&#xff1a;2. 01背包问题 解题思路 &#xff08;1&#xff09;二维dp数组 动态规划五步曲&#xff1a; &#xff08;1&#xff09;dp[i][j]的含义&#xff1a; 容量为j时&#xff0c;从物品1-物品i中取物品&#xff0c;可达到的最大价值 &#xff08;2…