前端与数据展示

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

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

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

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

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

前端数据导出及痛点

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

  1. Excel的Sheet页复制

    最近在做一个项目,其中涉及基于模板对Excel的Sheet页进行复制.在网上尝试了很多,发现都不够完美,苦恼. 然后在查阅资料的过程中,发现有一篇提及,POI的API只对同一个Excel文件中的She ...

  2. 把数据库里面的stu表中的数据,导出到excel中

    # 2.写代码实现,把我的数据库里面的stu表中的数据,导出到excel中 #编号 名字 性别 # 需求分析:# 1.连接好数据库,写好SQL,查到数据 [[1,'name1','男'],[1,'na ...

  3. 数据可视化之powerBI基础(十一)Power BI中的数据如何导出到Excel中?

    https://zhuanlan.zhihu.com/p/64415543 把Excel中数据加载到PowerBI中我们都已经熟悉了,但是怎么把在PowerBI中处理好的数据导出到Excel中呢?毕竟 ...

  4. salesforce 零基础学习(二十三)数据记录导出至excel(自定义报表导出)

    我们都知道,报表有个功能为导出excel,但是有的时候客户需求往往标准的报表达不到,比如导出excel,其中本月修改的数据字段标红,如下图所示. 这就需要我们去写VF来实现此功能. 需求:将数据表记录 ...

  5. JAVA实现数据库数据导入/导出到Excel(POI)

    准备工作: 1.导入POI包:POI下载地址http://mirrors.tuna.tsinghua.edu.cn/apache/poi/release/src/(重要) 如下 2.导入Java界面美 ...

  6. ssm框架之将数据库的数据导入导出为excel文件

    在这里首先我要将自己遇到的各种问题,以及需求记录下来,做一个备忘,便于以后查看: 需求:主要实现两个功能,将oracle数据库里的数据导出为excel,同时需要将excel表格的数据导入到数据库 环境 ...

  7. 使用pentaho工具将数据库数据导入导出为Excel

    写在前面:本篇博客讲述的是如何使用pentaho工具快速的将数据库数据导出为Excel文件,以及如何将Excel文件数据导入数据库. 补充:使用此工具并不需要任何一句代码并能快速便捷解决实际问题,此工 ...

  8. 【SqlServer】在SqlServer中把数据导入导出为Excel文件

    这里笔者介绍利用SqlServer数据库操作EXECEL文件. 1.将Excel表中的数据导入为SqlServer数据库 把Excel表中的数据导入为SqlServer数据库中的数据. 新建一个Exc ...

  9. 多张报表导出到一个多sheet页excel

     业务需求: 通过勾选不同的报表名称,然后直接执行导出excel.并且这些报表需要统一导入到一个excel的多个sheet页中,并且对某些报表可能需要增加一些类似'已审核'之类的图片(展现时并没有 ...

  10. 使用PHPExcel实现数据批量导出为excel表格

    首先需要下载PHPExecel类文件,帮助文档可以参考PHPExcel中文帮助手册|PHPExcel使用方法. 下面直接上例子,是我自己写的一个简单的批量导出数据为excel的例子 前台页面 比较简单 ...

随机推荐

  1. java安全之CC1浅学(1)

    前言 由于CC链还是比较复杂的,我们可以先看命令执行的部分payload之后再加上反序列化部分组成一个完整的payload 调试一 项目导入依赖,这里使用3.1版本 <!-- https://m ...

  2. php自定义分页类

    <?php class Paging { private $totalStrip; //总条数 private $pageStrip; //每页条数 private $totalPages; / ...

  3. 自学 TypeScript 第四天,手把手项目搭建

    前言: 学了三天,我们学习了 TS 的基本类型声明,TS 的编译,webpack 打包,其实也就差不多了,剩下的也就一些 类,继承,构造函数,抽象类,泛型一些的,如果都细致的讲可能写好久,感兴趣的可以 ...

  4. 关于linux mint新增加的鼠标样式的示例图片不能正确显示的解决办法

    前言 我相信你在linux mint 做鼠标主题美化的时候一定遇到过这样的问题 没错!!! 下载的鼠标的主题的示例图片不能正确显示,当然这样虽然不影响正常的鼠标主题更换使用,但是对于我这种强迫症来说简 ...

  5. Fastjsonfan反序列化(1)

    前言 之前只是对FastJson漏洞有简单的一个认知,虽然由于网上fastjson漏洞调试的文章很多,但是真正有着自己的理解并能清楚的讲述出来的文章少之又少.大多文章都是对已知的漏洞调用流程做了大量分 ...

  6. C++编程笔记(GPU并行编程)

    目录 一.配置并使用 二.代码 三.内存管理 数组的分配 一.配置并使用 环境:Windows10 + CLion + VS2019 cuda的安装,并行的话只需要安装cuda,cuDNN就不必了 编 ...

  7. HDOJFatmouse肥鼠交易//c++控制保留小数

    贪心算法.我就不贴题了//no.1009 但是我的代码运行超时了-改了好久都不对- 看别人代码,顺便学习c++控制保留小数怎么操作; 我的错误代码:(时间占用可能是多次调用findmax造成的) #i ...

  8. 高性能 Jsonpath 框架,Snack3 3.2.50 发布

    Snack3,一个高性能的 JsonPath 框架 借鉴了 Javascript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计.其下一切数据都以ONode表示,ONode也 ...

  9. SQLMap自带绕过脚本tamper的讲解

      sqlmap在默认情况下除了使用CHAR()函数防止出现单引号,没有对注入的数据进行修改,还可以使用--tamper参数对数据做修改来绕过WAF等设备,其中大部分脚本主要用正则模块替代攻击载荷字符 ...

  10. java中对象存在形式

    本文主要讲述jvm中对象的存储形式: class Cat{ String name; int age; String color; // 行为 } 依据Cat类创建对象 public class Ob ...