码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 基于ABP和Magicodes实现Excel导出操作


    🚀 优质资源分享 🚀

    学习路线指引(点击解锁)知识定位人群定位
    🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
    💛Python量化交易实战💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

    前端使用的vue-element-admin框架,后端使用ABP框架,Excel导出使用的Magicodes.IE.Excel.Abp库。Excel导入和导出操作几乎一样,不再介绍。文本主要介绍Excel导出操作和过程中遇到的坑,主要是Excel文件导出后无法打开的问题。

    一.Magicodes.IE库

    1.Magicodes.IE库介绍

    Magicodes.IE是一个导入导出的通用库,它支持Dto导入导出、模板导出、花式导出以及动态导出,支持Excel、Csv、Word、Pdf和Html。总之,基本的和高级的导入和导出操作都是可以满足的。主要特点如下:

    2.Magicodes.IE库的NuGet包

    Magicodes.IE库相关的NuGet包如下所示:
    (1)Magicodes.IE.Core,v2.6.4
    (2)Magicodes.IE.Excel,v2.6.4
    (3)Magicodes.IE.Excel.NPOI,v2.6.4
    (4)Magicodes.IE.Excel.AspNetCore,v2.6.4
    (5)Magicodes.IE.Pdf,v2.6.4
    (6)Magicodes.IE.Word,v2.6.4
    (7)Magicodes.IE.Html,v2.6.4
    (8)Magicodes.IE.Csv,v2.6.4
    (9)Magicodes.IE.AspNetCore,v2.6.4
    (10)Magicodes.IE.EPPlus,v2.6.4
    (11)Magicodes.IE.Excel.Abp,v2.6.4
    (12)Magicodes.IE.Csv.Abp,v2.6.4
    (13)Magicodes.IE.Html.Abp,v2.6.4
    (14)Magicodes.IE.Pdf.Abp,v2.6.4
    (15)Magicodes.IE.Word.Abp,v2.6.4

    3.Magicodes.IE库的教程

    (1)基础教程之导入学生数据[1]
    (2)基础教程之导出Excel[2]
    (3)基础教程之导出Pdf收据[3]
    (4)在Docker中使用[4]
    (5)动态导出[5]
    (6)多Sheet导入[6]
    (7)Csv导入导出[7]
    (8)Excel图片导入导出[8]
    (9)Excel模板导出之导出教材订购表[9]
    (10)进阶篇之导入导出筛选器[10]
    (11)Magicodes.IE之花式导出[11]
    (12)Magicodes.IE.AspNetCore之一行代码多格式导出[12]
    (13)性能测试[13]
    (14)Excel合并行导入[14]
    (15)Excel模板导出之动态导出[15]
    (16)Magicodes.IE.Excel.AspNetCore之快速导出Excel[16]

    二.基于ABP的Excel导出操作

    1.Business.Application.Contracts

    在该项目中添加Magicodes.IE.Excel.Abp类库。并且BusinessApplicationContractsModule需要依赖MagicodesIEExcelModule模块:
    (1)ExportActivityDto类

    public class ExportActivityDto : EntityDto
    {
        /// 
        /// 姓名或微信昵称
        /// 
        [Required]
        [ExporterHeader(DisplayName = "姓名或微信昵称")]
        public string Name { get; set; }
    
        /// 
        /// 所在省市区
        /// 
        [Required]
        [ExporterHeader(DisplayName = "所在省市区")]
        public string Address { get; set; }
    
        /// 
        /// 手机号
        /// 
        [Required]
        [ExporterHeader(DisplayName = "手机号")]
        public string Phone { get; set; }
    
        /// 
        /// 年龄
        /// 
        [Required]
        [ExporterHeader(DisplayName = "年龄")]
        public string Age { get; set; }
    
        /// 
        /// 备注
        /// 
        [ExporterHeader(DisplayName = "备注")]
        public string Remark { get; set; }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    (2)IActivityAppService

    public interface IActivityAppService : IApplicationService
    {
        // 导出活动列表
        Task ExportActivity();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.Business.Application

    (1)ActivityAppService
    通过构造函数注入的方式,依赖注入IExcelExporter:

    /// 
    /// 通过Excel导出活动报名信息
    /// 
    /// 
    public async Task ExportActivity()
    {
        var query = await _repository.GetQueryableAsync();
        var dto = ObjectMapper.Map, List>(query.ToList());
     var result = await \_excelExporter.ExportAsByteArray(dto);
     var fs = new MemoryStream(result);
    
     return new XlsxFileResult(stream: fs, "活动报名信息表.xlsx");
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    (2)ActivityAutoMapperProfile

    public class ActivityAutoMapperProfile : Profile
    {
        public ActivityAutoMapperProfile()
        {
            CreateMap();
     }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.Business.HttpApi

    (1)ActivityController

    [HttpGet]
    [Route("export-activity")]
    public Task ExportActivity()
    {
        return _ActivityAppService.ExportActivity();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.Excel导出操作vue代码

    导出按钮相关的vue代码如下:

    class="filter-item" size="mini" type="success" icon="el-icon-download" @click="handleExport()">导出
    
    
    • 1
    • 2

    导出函数的vue代码如下:

    handleExport() {
      var that = this;
      that.$axios.get('/api/app/activity/export-activity').then(res => {
        this.$notify({
          title: '成功',
          message: '导出成功',
          type: 'success',
          duration: 2000
        });
        var blob = new Blob([res], {
          type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
        });
        let url = window.URL.createObjectURL(blob); //创建下载的链接
        let a = document.createElement("a"); //生成一个a标签
        a.setAttribute("href", url);
        a.setAttribute("download", that.$activityExcelName);
        a.style.display = "none"; //将a标签隐藏
        document.body.appendChild(a); //将a标签添加到body中
        a.click(); //触发a标签的点击事件
        window.URL.revokeObjectURL(url); //释放掉blob对象
        a.remove() //将a标签从body中移除
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '没有权限导出'
        });
      });
      }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    其中that.$axios.get中的get()代码如下:

    get(url) {
      return new Promise((resolve, reject) => {
        axios.get(url, { responseType: "blob" })
          .then(response => {
            resolve(response.data)
          }, err => {
            // Message({
            // message: err.error.message,
            // type: 'error',
            // duration: 5 * 1000
            // })
            reject(err)
          })
          .catch((error) => {
            reject(error)
          })
      })
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    说明:一定要特别注意加上responseType: “blob”,否则就会报文件格式或者文件扩展名无效的错误。自己尝试了下,换成responseType: "arraybuffer"也是可以的。

    三.MagicodesIEXXXModule模块源码

    1.MagicodesIEExcelModule源码

     public class MagicodesIEExcelModule: AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            context.Services.AddScoped();
            context.Services.AddScoped();
            context.Services.AddScoped();
            //TODO:处理筛选器
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.MagicodesIECsvModule源码

    public class MagicodesIECsvModule: AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
     {
            context.Services.AddScoped();
     context.Services.AddScoped();
     }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3.MagicodesIEHtmlModule源码

    public class MagicodesIEHtmlModule: AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
     {
            context.Services.AddScoped();
     }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    4.MagicodesIEPdfModule源码

    public class MagicodesIEPdfModule: AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
     {
            context.Services.AddScoped();
     }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    5.MagicodesIEWordModule源码

    public class MagicodesIEWordModule: AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
     {
            context.Services.AddScoped();
     }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    参考文献:
    [1]基础教程之导入学生数据:https://urlify.cn/neI7Vz
    [2]基础教程之导出Excel:https://urlify.cn/yiei6f
    [3]基础教程之导出Pdf收据:https://urlify.cn/7FjuA3
    [4]在Docker中使用:https://github.com/dotnetcore/Magicodes.IE/blob/master/docs/4.在Docker中使用.md
    [5]动态导出:https://github.com/dotnetcore/Magicodes.IE/blob/master/docs/5.动态导出.md
    [6]多Sheet导入:https://github.com/dotnetcore/Magicodes.IE/blob/master/docs/6.多Sheet导入.md
    [7]Csv导入导出:https://github.com/dotnetcore/Magicodes.IE/blob/master/docs/7.Csv导入导出.md
    [8]Excel图片导入导出:https://urlify.cn/Ybyey2
    [9]Excel模板导出之导出教材订购表:https://urlify.cn/vqyQnq
    [10]进阶篇之导入导出筛选器:https://urlify.cn/Nzmmim
    [11]Magicodes.IE之花式导出:https://urlify.cn/QRZRN3
    [12]Magicodes.IE.AspNetCore之一行代码多格式导出:https://github.com/dotnetcore/Magicodes.IE/blob/master/docs/12.Magicodes.IE.AspNetCore之一行代码多格式导出.md
    [13]性能测试:https://github.com/dotnetcore/Magicodes.IE/blob/master/docs/13.性能测试.md
    [14]Excel合并行导入:https://github.com/dotnetcore/Magicodes.IE/blob/master/docs/Excel合并行导入.md
    [15]Excel模板导出之动态导出:https://github.com/dotnetcore/Magicodes.IE/blob/master/docs/Excel模板导出之动态导出.md
    [16]Magicodes.IE.Excel.AspNetCore之快速导出Excel:https://github.com/dotnetcore/Magicodes.IE/blob/master/docs/AspNetCore之快速导出Excel.md
    [17]麦扣官方文档:https://docs.xin-lai.com/
    [18]添加对Abp Vnext模块的封装和支持:https://github.com/dotnetcore/Magicodes.IE/issues/318
    [19]abp框架Excel导出–基于vue:https://blog.csdn.net/JerryMouseLi/p/13399027.html
    [20]abp-vue导入导出excel:https://cloud.tencent.com/developer/article/1552255
    [21]使用Magicodes.IE快速导出Excel:https://blog.csdn.net/codelove/p/15117226.html
    [22]dotnetcore/Magicodes.IE:https://github.com/dotnetcore/Magicodes.IE

  • 相关阅读:
    C/C++中#和##的宏以及进行“花里胡哨“的命名及其应用
    MySQL数据库的索引和事务
    海外数字身份验证服务商ADVANCE.AI入选EqualOcean《2022品牌出海服务市场研究报告》
    通通锁接口调用<Response [400]>报错及python示例代码
    Linux虚拟机共享文件夹不显示问题终极解决方法
    c语言对特定位置0,置1
    Linux基础-常见问题 xrandr屏幕操作命令详解
    【python百炼成魔】python之元组详解
    tkinter使用xaml编写wpf
    代码整洁之道
  • 原文地址:https://blog.csdn.net/m0_56069948/article/details/126188173
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号