找回密码
 立即注册

QQ登录

只需一步,快速开始

James.Lv 讲师达人认证 悬赏达人认证 活字格认证 Wyn认证
超级版主   /  发表于:2022-11-22 11:25  /   查看:1883  /  回复:0
本帖最后由 James.Lv 于 2024-12-17 13:42 编辑

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



实现思路如下:
后端实现一个接口,接收Blob类型Excel流,然后将Excel多Sheet页合并成一个Sheet页,然后通过文件流返回给前端

前端利用ARJS自带的导出Excel,导出Blob类型,然后通过POST请求调用后端接口将Blob流传给后端,下载后端返回的流

具体实现步骤:

前端两种方式:
第一种:
利用ARJS的Viewer.Export导出Excel,该接口返回的result包含data属性download方法,然后调用后端接口,将result.data传递给后端
  1. Viewer
  2.         .export("xlsx", settings, { cancel: cancelCallback })
  3.         .then((result) => {
  4.           let formData = new FormData();
  5.           formData.append("file", result.data);
  6.           let url = "http://localhost:8088/ExcelMergerSheet";
  7.           fetch(url, {
  8.             method: 'POST',
  9.             mode: 'cors',
  10.             body: formData
  11.           }).then(function (response) {
  12.             return response.blob();
  13.           }).then(blob => {
  14.             console.log(blob)
  15.             let downloadElement = document.createElement('a');
  16.             let href = window.URL.createObjectURL(blob); //创建下载的链接
  17.             downloadElement.href = href;
  18.             downloadElement.download = reportName + '.XLSX'; //下载后文件名
  19.             document.body.appendChild(downloadElement);
  20.             downloadElement.click(); //点击下载
  21.             document.body.removeChild(downloadElement); //下载完成移除元素
  22.             window.URL.revokeObjectURL(href); //释放掉blob对象
  23.           })

  24.         });
复制代码

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

第二种:
利用Excel.exportDocument无预览导出Excel,该接口返回的result包含data属性和download方法,然后调用后端接口,将result.data传递给后端
  1. function runExcel() {
  2.     var ARJS = GC.ActiveReports.Core;
  3.     var Excel = GC.ActiveReports.XlsxExport;

  4.     var settings = {
  5.       sheetName: "test",
  6.       pageSettings: {
  7.         size: "A4",
  8.         orientation: "portrait",
  9.       },
  10.     };

  11.     var pageReport = new ARJS.PageReport();
  12.     pageReport
  13.       .load("1.rdlx-json")
  14.       .then(function () {
  15.         return pageReport.run();
  16.       })
  17.       .then(function (pageDocument) {
  18.         return Excel.exportDocument(pageDocument, settings);
  19.       })
  20.       .then(function (result) {
  21.         let formData = new FormData();
  22.         formData.append("file", result.data);
  23.         fetch("http://localhost:8088/ExcelMergerSheet", {
  24.             method: 'POST',
  25.             mode: 'cors',
  26.             body: formData
  27.         }).then((response) => {
  28.             return response.blob()
  29.         }).then((blob) => {
  30.             const link = document.createElement('a');
  31.             link.href = URL.createObjectURL(blob);
  32.             link.setAttribute('download', 'excel.xlsx')
  33.             link.click();
  34.             link.remove();
  35.             URL.revokeObjectURL(link.href);
  36.         })
  37.       });
  38.   }
复制代码
具体Excel.exportDocument可以参考文档:
https://demo.grapecity.com.cn/activereportsjs/demos/api/export/purejs

后端实现方式:


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

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

Linux服务器的话需要将源码拷贝到服务器去运行

源码如下,也可以根据自己需要进行调整和修改:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部