本帖最后由 James.Lv 于 2022-11-22 11:53 编辑
在使用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传递给后端
- 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 ARJS = GC.ActiveReports.Core;
- var Excel = GC.ActiveReports.XlsxExport;
- var settings = {
- sheetName: "test",
- pageSettings: {
- size: "A4",
- orientation: "portrait",
- },
- };
- var pageReport = new ARJS.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,在服务器上运行
Linux服务器的话需要将源码拷贝到服务器去运行
源码如下,也可以根据自己需要进行调整和修改:
|