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

前端,如何,实现,多页,数据,合并,导出,excel,sheet,解决方案,代码 · 浏览次数 : 349

小编点评

**前端数据呈现痛点和解决方案** **痛点:** * 在前端纯导出Excel时,无法在多个页上合并数据。 * 在获取Excel数据流时,内存溢出问题会导致用户体验不良。 **解决方案:** * 使用ActiveReportsJS库实现多Sheet页Excel合并功能。 * 在前端获取Excel数据流时,使用Blob对象创建一个临时文件并将其写入到内存中。 * 在后端将Blob对象转换为Excel数据流并返回给前端。 **步骤:** **前端:** 1. 使用ActiveReportsJS库创建一个PageReport对象。 2. 加载Excel模板。 3. 设置页设置,包括页面大小和方向。 4. 执行页面渲染并导出Excel数据流。 **后端:** 1. 接收前端传递的Blob文件流。 2. 使用pandas库读取Blob内容并将其转换为Excel DataFrame。 3. 创建一个新的Excel workbook。 4. 将DataFrame数据写入Excel workbook中。 5. 返回Excel workbook的写入流给前端。 **其他提示:** * 可以使用不同的页大小和方向来创建多个Sheet页。 * 可以设置页边距和行高来调整表格的视觉效果。 * 可以使用标题和描述信息来增强数据可读性。

正文

本文由葡萄城技术团队于博客园原创并首发
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。

前端与数据展示

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

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

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

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

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

前端数据导出及痛点

前端进行数据呈现后,只解决了用户需求的第一步,数据呈现只是解决了数据看得见的问题,但要进一步利用数据才能发挥数据的真正价值。因此对于最终用户看到数据后,往往需要二次分析和存档,所以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

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

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

本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前端与数据展示 前后端分离是当前比较盛行的开发模式,它使项目的分工更加明确,后端负责处理、存储数据;前端负责显示数据.前端和后端开发人员通过接口进行数据的交换。因此前端

巧用预测,多触点促业务可持续增长

信息化时代,外部市场环境不断变化,企业数字化营销转型进程加快。数据孤岛的打破以及细颗粒级的用户精细化运营帮助越来越多的开发者实现业务增长。 本文我们将介绍如何以华为分析服务的预测能力为前提,结合实际场景,通过Push、应用内消息、远程配置等多样化的用户触达方式,多触点运营促进业务的可持续增长。 场景

驱动开发:内核解析PE结构节表

在笔者上一篇文章`《驱动开发:内核解析PE结构导出表》`介绍了如何解析内存导出表结构,本章将继续延申实现解析PE结构的PE头,PE节表等数据,总体而言内核中解析PE结构与应用层没什么不同,在上一篇文章中`LyShark`封装实现了`KernelMapFile()`内存映射函数,在之后的章节中这个函数会被多次用到,为了减少代码冗余,后期文章只列出重要部分,读者可以自行去前面的文章中寻找特定的片段。

如何使用前端表格控件实现数据更新?

前言 小编之前分享过一篇文章叫《如何使用前端表格控件实现多数据源整合?》。今天,继续为大家介绍如何使用前端表格控件来更新已连接的数据源信息。 环境准备 SpreadJS在线表格编辑器: SpreadJS 前端表格控件新版本新增了一款报表插件,该插件基于 SpreadJS 本身强大的表格能力,在 Da

如何使用前端表格控件实现多数据源整合?

前言 作为表格产品的典型应用场景之一,几乎所有的行业都会存在类 Excel 报表开发这样的应用场景,而在这些应用场景中,经常会遇见下面的这些痛点: 报表数据往往来自多个不同的数据源,需要报表系统能够同时连接多个数据源,并融合不同的数据格式 实际的报表中需要对数据结果进行逻辑计算,例如销售的环比和同比

如何实现Excel中的多级数据联动

> 摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:[葡萄城官网](https://www.grapecity.com.cn/),葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 ## 前言 在类Excel表格应用中,常用的需求场景是根据单元格之间的数据联动,例如选择某个

论如何直接用EF Core实现创建更新时间、用户审计,自动化乐观并发、软删除和树形查询(下)

前言 数据库并发,数据审计和软删除一直是数据持久化方面的经典问题。早些时候,这些工作需要手写复杂的SQL或者通过存储过程和触发器实现。手写复杂SQL对软件可维护性构成了相当大的挑战,随着SQL字数的变多,用到的嵌套和复杂语法增加,可读性和可维护性的难度是几何级暴涨。因此如何在实现功能的同时控制这些S

论如何直接用EF Core实现创建更新时间、用户审计,自动化乐观并发、软删除和树形查询(中)

前言 数据库并发,数据审计和软删除一直是数据持久化方面的经典问题。早些时候,这些工作需要手写复杂的SQL或者通过存储过程和触发器实现。手写复杂SQL对软件可维护性构成了相当大的挑战,随着SQL字数的变多,用到的嵌套和复杂语法增加,可读性和可维护性的难度是几何级暴涨。因此如何在实现功能的同时控制这些S

论如何直接用EF Core实现创建更新时间、用户审计,自动化乐观并发、软删除和树形查询(上)

前言 数据库并发,数据审计和软删除一直是数据持久化方面的经典问题。早些时候,这些工作需要手写复杂的SQL或者通过存储过程和触发器实现。手写复杂SQL对软件可维护性构成了相当大的挑战,随着SQL字数的变多,用到的嵌套和复杂语法增加,可读性和可维护性的难度是几何级暴涨。因此如何在实现功能的同时控制这些S

驱动开发:通过MDL映射实现多次通信

在前几篇文章中`LyShark`通过多种方式实现了驱动程序与应用层之间的通信,这其中就包括了通过运用`SystemBuf`缓冲区通信,运用`ReadFile`读写通信,运用`PIPE`管道通信,以及运用`ASYNC`反向通信,这些通信方式在应对`一收一发`模式的时候效率极高,但往往我们需要实现一次性吐出多种数据,例如ARK工具中当我们枚举内核模块时,往往应用层例程中可以返回几条甚至是几十条结果,如