前端使用的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<Guid?>
{
/// <summary>
/// 姓名或微信昵称
/// </summary>
[Required]
[ExporterHeader(DisplayName = "姓名或微信昵称")]
public string Name { get; set; } /// <summary>
/// 所在省市区
/// </summary>
[Required]
[ExporterHeader(DisplayName = "所在省市区")]
public string Address { get; set; } /// <summary>
/// 手机号
/// </summary>
[Required]
[ExporterHeader(DisplayName = "手机号")]
public string Phone { get; set; } /// <summary>
/// 年龄
/// </summary>
[Required]
[ExporterHeader(DisplayName = "年龄")]
public string Age { get; set; } /// <summary>
/// 备注
/// </summary>
[ExporterHeader(DisplayName = "备注")]
public string Remark { get; set; }
}

(2)IActivityAppService

public interface IActivityAppService : IApplicationService
{
// 导出活动列表
Task<ActionResult> ExportActivity();
}

2.Business.Application

(1)ActivityAppService

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

/// <summary>
/// 通过Excel导出活动报名信息
/// </summary>
/// <returns></returns>
public async Task<ActionResult> ExportActivity()
{
var query = await _repository.GetQueryableAsync();
var dto = ObjectMapper.Map<List<Activity>, List<ExportActivityDto>>(query.ToList());
var result = await _excelExporter.ExportAsByteArray(dto);
var fs = new MemoryStream(result); return new XlsxFileResult(stream: fs, "活动报名信息表.xlsx");
}

(2)ActivityAutoMapperProfile

public class ActivityAutoMapperProfile : Profile
{
public ActivityAutoMapperProfile()
{
CreateMap<Activity, ExportActivityDto>();
}
}

3.Business.HttpApi

(1)ActivityController

[HttpGet]
[Route("export-activity")]
public Task<ActionResult> ExportActivity()
{
return _ActivityAppService.ExportActivity();
}

4.Excel导出操作vue代码

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

<el-button class="filter-item" size="mini" type="success" icon="el-icon-download" @click="handleExport()">导出</el-button>

导出函数的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: '没有权限导出'
});
});
}

其中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)
})
})
}

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

三.MagicodesIEXXXModule模块源码

1.MagicodesIEExcelModule源码

 public class MagicodesIEExcelModule: AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddScoped<IExcelExporter, ExcelExporter>();
context.Services.AddScoped<IExcelImporter, ExcelImporter>();
context.Services.AddScoped<IExportFileByTemplate, ExcelExporter>();
//TODO:处理筛选器
}
}

2.MagicodesIECsvModule源码

public class MagicodesIECsvModule: AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddScoped<ICsvExporter, CsvExporter>();
context.Services.AddScoped<ICsvImporter, CsvImporter>();
}
}

3.MagicodesIEHtmlModule源码

public class MagicodesIEHtmlModule: AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddScoped<IHtmlExporter, HtmlExporter>();
}
}

4.MagicodesIEPdfModule源码

public class MagicodesIEPdfModule: AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddScoped<IPdfExporter, PdfExporter>();
}
}

5.MagicodesIEWordModule源码

public class MagicodesIEWordModule: AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddScoped<IWordExporter, WordExporter>();
}
}

参考文献:

[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://www.cnblogs.com/JerryMouseLi/p/13399027.html

[20]abp-vue导入导出excel:https://cloud.tencent.com/developer/article/1552255

[21]使用Magicodes.IE快速导出Excel:https://www.cnblogs.com/codelove/p/15117226.html

[22]dotnetcore/Magicodes.IE:https://github.com/dotnetcore/Magicodes.IE

基于ABP和Magicodes实现Excel导出操作的更多相关文章

  1. 基于jdk1.7实现的excel导出工具类

    通用excel导出工具类,基于泛型.反射.hashmap 以及基于泛型.反射.bean两种方式 import java.io.*;import java.lang.reflect.Field;impo ...

  2. 循序渐进开发WinForm项目(5)--Excel数据的导入导出操作

    随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...

  3. abp框架Excel导出——基于vue

    abp框架Excel导出--基于vue 目录 abp框架Excel导出--基于vue 1.技术栈 1.1 前端采用vue,官方提供 1.2 后台是abp--aspnetboilerplate 2. E ...

  4. 使用Magicodes.IE快速导出Excel

    前言 总是有很多朋友咨询Magicodes.IE如何基于ASP.NET Core导出Excel,出于从框架的体验和易用性的角度,决定对Excel的导出进行独立封装,以便于大家更易于使用,开箱即用. 注 ...

  5. loadrunner实现excel文件导出操作

    项目中需要对“商品信息”进行查询及导出,但是loadrunner并不能录制到“保存”这一操作. 项目介绍:flex+Http协议: 不能录制的原因: 在我们点击了“导出”按钮后,服务端已经生成一份我们 ...

  6. 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)

    并发编程概述   前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...

  7. c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出

    c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出 using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using S ...

  8. java导入导出excel常用操作小结及简单示例

    POI中常用设置EXCEL的操作小结: 操作excel如下 HSSFWorkbook wb = new HSSFWorkbook();  //创建一个webbook,对应一个Excel文件 HSSFS ...

  9. C# 几十万级数据导出Excel,及Excel各种操作

    先上导出代码 /// <summary> /// 导出速度最快 /// </summary> /// <param name="list">&l ...

随机推荐

  1. 122_Power Pivot&Power BI不连续日期的日环比

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 这两天有朋友在交流,dax中使用时间智能函数写日环比,一个 dateadd 就可以了.但是有些业务不是每天都连续 ...

  2. Python常用标准库(pickle序列化和JSON序列化)

    常用的标准库 序列化模块 import pickle 序列化和反序列化 把不能直接存储的数据变得可存储,这个过程叫做序列化.把文件中的数据拿出来,回复称原来的数据类型,这个过程叫做反序列化. 在文件中 ...

  3. 关于c#多线程中的几个信号量

    信号量在c#多线程通信中主要用来向阻塞的线程传达信号从而使得阻塞线程继续执行 多线程信号(线程交互):通常是指线程必须等待一个线程或者多个线程通知交互(释放信号)才可以继续执行 在c#中信号量主要有这 ...

  4. 深入探究MinimalApi是如何在Swagger中展示的

    前言 之前看到技术群里有同学讨论说对于MinimalApi能接入到Swagger中感到很神奇,加上Swagger的数据本身是支持OpenApi2.0和OpenApi3.0使得swagger.json成 ...

  5. centos6搭建mysql

    目前CentOS6.5及一下版本基本上被官方给放弃更新了,但是考虑到忠实粉丝迟迟不肯放手,所以还留了入口但是非常有限 1.搭建mysql 可参照:https://blog.csdn.net/huang ...

  6. 聊聊消息中间件(1),AMQP那些事儿

    开篇 说到消息队列,相信大家并不陌生.大家在日常的工作中其实都有用过.相信大部分的研发在使用消息队列的过程中也仅仅是停留在用上面,里面的知识点掌握得并不是很系统,有部分强大的功能可能由于本身公司的业务 ...

  7. CVPR2022 | A ConvNet for the 2020s & 如何设计神经网络总结

    前言 本文深入探讨了如何设计神经网络.如何使得训练神经网络具有更加优异的效果,以及思考网络设计的物理意义. 欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结.最新技术跟踪.经典论文解读.CV招聘 ...

  8. vue虚拟dom和diff算法

    vue的虚拟dom和diff算法 1.虚拟dom 虚拟dom,我的理解就是通过js对象的方式来具体化每一个节点,把dom树上面的每个节点都变为对象里的一个元素,元素的子元素变为子节点,节点上面的cla ...

  9. 分享一个网上搜不到的「Redis」实现「聊天回合制」的方案

    前言 为什么说网上搜不到,因为关于聊天回合制的方案作者本人快把百度搜秃噜了也没找到,好在最终是公司一个关系不错的大佬帮提供了点思路,最终作者将其完整实现了出来. 分享出来大家可以收藏,万一你哪天也碰到 ...

  10. Windows下新建隐藏用户名

    Windows下新建隐藏用户名,防止忘记密码