首页 > 其他分享 >abp框架Excel导出——基于vue

abp框架Excel导出——基于vue

时间:2023-05-19 20:47:18浏览次数:48  
标签:升级 vue sheet 导出 Excel abp var

@@abp 到处 excel

 

https://blog.51cto.com/u_15162069/2747885

https://www.cnblogs.com/JerryMouseLi/p/13399027.html

 

abp框架Excel导出——基于vue

 

目录

 

1.技术栈

1.1 前端采用vue,官方提供

UI套件用的是iview

1.2 后台是abp——aspnetboilerplate

即abp v1,https://github.com/aspnetboilerplate/aspnetboilerplate。 下载时选择的是net core 3.1。

2. Excel导出需求

管理后台系统,主要以图表统计形式归档数据,用户经常会有Excel导出报表的需求。可以以文件形式保存,更加地直观,符合使用习惯。

3. 升级日志Excel导出

物联网中的设备是核心资产,而维护设备经常需要一些升级割接操作,因此,升级日志(升级失败,升级成功,升级时间)等是用户比较关心的数据。

4. 技术实现方案

4.1 后台

4.1.1 EPPlus导出静态方法

需要nuget安装EPPlus.Core库。运用了委托的方法方便地实现了对导出表单进行添加标题,填充内容数据,渲染单元格样式,委托的一大优势就是方便调用,层次感很明显。该方法如果看得还不是很明白,请耐心继续往下看。

    public abstract class EPPlusExcelExporterBase : AbpServiceBase
    {
        protected EPPlusExcelExporterBase( )
        {}
        public static byte[] CreateExcelPackage(string fileName, Action<ExcelPackage> creator)
        {
            var excelPackage = new ExcelPackage();
            creator(excelPackage);
            using (var stream = new MemoryStream())
            {
                excelPackage.SaveAs(stream);
                excelPackage.Dispose();
                return stream.ToArray();
            }
        }

        public static void AddHeader(ExcelWorksheet sheet, params string[] headerTexts)
        {
            if (headerTexts.IsNullOrEmpty())
            {
                return;
            }
            for (var i = 0; i < headerTexts.Length; i++)
            {
                AddHeader(sheet, i + 1, headerTexts[i]);
            }
        }

        protected static void AddHeader(ExcelWorksheet sheet, int columnIndex, string headerText)
        {
            sheet.Cells[1, columnIndex].Value = headerText;
            sheet.Cells[1, columnIndex].Style.Font.Bold = true;
        }

        public static void AddObjects<T>(ExcelWorksheet sheet, int startRowIndex, IList<T> items, params Func<T, object>[] propertySelectors)
        {
            if (items.IsNullOrEmpty() || propertySelectors.IsNullOrEmpty())
            {
                return;
            }

            for (var i = 0; i < items.Count; i++)
            {
                for (var j = 0; j < propertySelectors.Length; j++)
                {
                    sheet.Cells[i + startRowIndex, j + 1].Value = propertySelectors[j](items[i]);
                }
            }
        }
    }

4.1.2 生成升级日志列表

此部分代码与主业务相关,因为原本业务与区域权限有关,简化起见,故删除其他无关代码,主要就是从数据库获取了升级列表,并且按照了升级时间进行了倒序排列。读者不同的业务可进行不同操作。需要转义的转义,联表的联表,过滤的过滤,排序的排序。

var dbQuery = from upgradeLog in _fsuUpgradeResultRepository.GetAll();

var UpgradeLogDtoList = await dbQuery
     .OrderByDescending(x => x.Updatetime)
     .ToListAsync();

4.1.3 将升级日志列表放到Excel导出静态方法中去

           var data= EPPlusExcelExporterBase.CreateExcelPackage(
                "UpgradeLog.xlsx",
                excelPackage =>
                {
                    var sheet = excelPackage.Workbook.Worksheets.Add("UpgradeLog");
                    sheet.OutLineApplyStyle = true;

                    EPPlusExcelExporterBase.AddHeader(
                        sheet,
                        "Fsu资产编码",
                        "升级结果",
                        "是否反馈",
                        "Fsu IP地址",
                        "更新时间"
                        );

                    EPPlusExcelExporterBase.AddObjects(
                        sheet, 2, UpgradeLogDtoList,
                        _ => _.FsuId,
                        _ => _.Result,
                        _ => _.IsReport,
                        _ => _.FsuIp,
                        _ => _.Updatetime
                        );

                    //Formatting cells
                    var UpdatetimeColumn = sheet.Column(5);
                    UpdatetimeColumn.Style.Numberformat.Format = "yyyy-mm-dd-hh:mm:ss";

                    for (var i = 1; i <= 5; i++)
                    {
                        sheet.Column(i).AutoFit();
                    }
                });

委托里面流程分下:添加报表表头,添加内容,设置显示样式(时间格式),添加样式(设置单元格自适应内容大小)。
通过CreateExcelPackage方法放回了文件比特流。

4.1.4 abp框架中前后端分离模式文件流传输

以FileResult形式返回前端传来的请求。需要注意的是FileResult是 Microsoft.AspNetCore.Mvc.Core中的一个类。

        public async Task<FileResult> GetUpgradeReport()
        {
 var dbQuery = from upgradeLog in _fsuUpgradeResultRepository.GetAll();

            var UpgradeLogDtoList = await dbQuery
                 .OrderByDescending(x => x.Updatetime)
                 .ToListAsync();

            foreach (var item in UpgradeLogDtoList)
            {
                ConvertDto(item);//对升级结果,是否上报铁塔平台进行解析
            }

           var data= EPPlusExcelExporterBase.CreateExcelPackage(
                "UpgradeLog.xlsx",
                excelPackage =>
                {
                    var sheet = excelPackage.Workbook.Worksheets.Add("UpgradeLog");
                    sheet.OutLineApplyStyle = true;

                    EPPlusExcelExporterBase.AddHeader(
                        sheet,
                        "Fsu资产编码",
                        "升级结果",
                        "是否反馈",
                        "Fsu IP地址",
                        "更新时间"
                        );

                    EPPlusExcelExporterBase.AddObjects(
                        sheet, 2, UpgradeLogDtoList,
                        _ => _.FsuId,
                        _ => _.Result,
                        _ => _.IsReport,
                        _ => _.FsuIp,
                        _ => _.Updatetime
                        );

                    //Formatting cells
                    var UpdatetimeColumn = sheet.Column(5);
                    UpdatetimeColumn.Style.Numberformat.Format = "yyyy-mm-dd-hh:mm:ss";

                    for (var i = 1; i <= 5; i++)
                    {
                        sheet.Column(i).AutoFit();
                    }
                });

            var fileContentResult = new FileContentResult(data, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
            {
                FileDownloadName = "升级日志报表.xlsx"
            };

            return fileContentResult;
        }

4.2 前端

4.2.1 vuex的action中添加请求方法

代码如下:

    actions = {
        async getUpgradeLogReport(context: ActionContext<UpgradeLogState, any>) {
            let data= await Ajax.get('/api/services/app/Upgrade/GetUpgradeReport',{
                responseType: 'blob',
                headers: {
                  'Content-Type': 'application/json'
                }});
                return data;
        }
    }

告诉后台以blob形式返回。当然请求方法你也可以直接普通形式封装,不一定封装在vuex里,这里封装在vuex的一个好处是有些状态数据可以保存在vuex,所有页面可以共享该数据。

4.2.2 upgradeLog.vue升级页面

4.2.2.1 增加下载方法

   async  downloadUpgradeLogReport(){
       await this.$store.dispatch({
      type: "upgradelog/getUpgradeLogReport"
    }).then(res => {
      if (res.status == "200") {
        var excelBlob = new Blob([res.data], {
          type: "application/vnd.ms-excel"
        });
        var fileName = "升级日志报表.xlsx";
        
          var oa = document.createElement("a");
          oa.href = URL.createObjectURL(excelBlob);
          oa.download = fileName;
          document.body.appendChild(oa);
          oa.click();
        
      }
    });
    }

创建一个blob对象,以创建url方式将此对象下载。

4.2.2.2 点击导出报表按钮调用下载方法

 <Button @click="downloadUpgradeLogReport()">导出升级日志报表</Button>

5. 最终效果

5.1 点击按钮

5.2 报表展示

6.小结

  • 笔者下载使用过多个开源方案导出Excel,此种方式方法比较轻量,使用比较简洁;
  • 在abp中返回Excel的形式需要思考,因为如果无法继承ControllerBase,就无法使用ActionResult这种万能返回形式(C#中只能继承一个基类,可以继承多个接口);
  • vue中ajax接收Excel返回数据时需要注意设置返回类型为Blob,否则将会下载不成功;
  • 这里Excel导出是借鉴了Abp Zero 8.1的思路,他是类以瞬时模式注入容器,我是写成了静态方法。但是Abp Zero Excel导出的思路大有不同,首先是生成文件在Cache里,然后返回文件GUID(Token),用户再拿着GUID(Token)通过fileController从cache导出需要下载的文件。缓存有效期1分钟,目的是为了防止有人拿到链接攻击,不停下载。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/JerryMouseLi/p/13399027.html

标签:升级,vue,sheet,导出,Excel,abp,var
From: https://www.cnblogs.com/wl-blog/p/17416228.html

相关文章

  • vue3+vant3封装省市区组件
    因为后台返回的数据格式和vant不一致,所以自己遍历循环得到自己想到的格式。省市区的接口并不是一个以children格式,一次性全部获取,而是选择市的时候需要得到省的id,一层一层请求接口才能得到省市区。 父组件:1<selectArea2@addressOnFinish="onChangeArea"3......
  • ONEAbp
    快速开始首先,如果你没有安装ONEABPCLI,请先安装它:dotnettoolinstall-gONE.Abp.CliCopytoclipboardErrorCopied在一个空文件夹使用 abpnew 命令创建新解决方案:base模板oneabpnewAcme.BookStore-tbase-def-dbmspostgresqlCopytoclipboardErrorCopiedmi......
  • 使用ONE.Abp快速开发微服务,再也不用加班了
    项目背景公司采用项目制工作方式,因此在不同项目上可能存在多个团队开发独立的代码库,但通用的基础设施却是相同的,这可能导致每个项目都需要编写相同的代码,并重复造轮子。更严重的是,每个项目都有自己的用户体系,导致用户在使用不同的服务时需要重新登录,这不仅会破坏用户的体验,也不利......
  • SpringBoot实现WebSocket发送接收消息 + Vue实现SocketJs接收发送消息
    SpringBoot实现WebSocket发送接收消息+Vue实现SocketJs接收发送消息参考:1、https://www.mchweb.net/index.php/dev/887.html2、https://itonline.blog.csdn.net/article/details/81221103?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2......
  • python批量处理excel数据、批量透视、合并透视表
    ###t+21importpandasaspdimportos#半自动———#——<创建好格式文件夹#——<数据下载至文件夹#——<修改date#——<运行##直播时间date='4.21'#读取存放文件路径read_path='E:/test/t+21/'+date+'/1原始数据'path_list=os.listdir(read_path)pathdir=''writ......
  • 美团前端vue面试题
    CompositionAPI与OptionsAPI有什么不同分析Vue3最重要更新之一就是CompositionAPI,它具有一些列优点,其中不少是针对OptionsAPI暴露的一些问题量身打造。是Vue3推荐的写法,因此掌握好CompositionAPI应用对掌握好Vue3至关重要WhatisCompositionAPI?(opensnewwindow)......
  • vue组件通信方式有哪些?
    vue组件通信方式一、props(父向子传值----自定义属性)/$emit(子向父传值-----自定义事件)父组件通过props的方式向子组件传递数据,而通过$emit子组件可以向父组件通信。1.父组件向子组件传值(props)下面通过一个例子说明父组件如何向子组件传递数据:在子组件article.vue中......
  • 滴滴前端必会vue面试题汇总
    watch原理watch本质上是为每个监听属性setter创建了一个watcher,当被监听的属性更新时,调用传入的回调函数。常见的配置选项有deep和immediate,对应原理如下deep:深度监听对象,为对象的每一个属性创建一个watcher,从而确保对象的每一个属性更新时都会触发传入的回调函数。主......
  • vue组件通信6种方式总结(常问知识点)
    前言在Vue组件库开发过程中,Vue组件之间的通信一直是一个重要的话题,虽然官方推出的Vuex状态管理方案可以很好的解决组件之间的通信问题,但是在组件库内部使用Vuex往往会比较重,本文将系统的罗列出几种不使用Vuex,比较实用的组件间的通信方式,供大家参考。组件之间通信的场景在......
  • vue什么时候进行虚拟dom对比
    1、vue什么时候进行虚拟dom对比Vue在更新组件时会先创建一个新的虚拟DOM树,然后与旧的虚拟DOM树进行对比,从而找出两个树之间的差异性,进而只对差异性进行更新操作。这个过程就是所谓的虚拟DOM对比。对比虚拟DOM的时机,主要是在组件更新操作中进行。当Vue检测到组件的某......