基于ABP和Magicodes實現Excel導出操作

??前端使用的vue-element-admin框架,后端使用ABP框架,Excel導出使用的Magicodes.IE.Excel.Abp庫。Excel導入和導出操作幾乎一樣,不再介紹。文本主要介紹Excel導出操作和過程中遇到的坑,主要是Excel文件導出后無法打開的問題。c85ec9619e2817944037ee97ed24dfc9.png

一.Magicodes.IE庫

1.Magicodes.IE庫介紹

??Magicodes.IE是一個導入導出的通用庫,它支持Dto導入導出、模板導出、花式導出以及動態導出,支持Excel、Csv、Word、Pdf和Html。總之,基本的和高級的導入和導出操作都是可以滿足的。主要特點如下:1a295f68b924e9c6d6f3321c36fd3f51.png

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/283974.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/283974.shtml
英文地址,請注明出處:http://en.pswp.cn/news/283974.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

消息模式在實際開發應用中的優勢

曾經.NET面試過程中經常問的一個問題是&#xff0c;如果程序集A&#xff0c;引用B &#xff0c;B 引用C&#xff0c;那么C怎么去訪問A中的方法呢。 這個問題初學.net可能一時想不出該咋處理&#xff0c;這涉及到循環引用問題。但有點經驗的可能就簡單了&#xff0c;通過委托的方…

微服務:注冊中心ZooKeeper、Eureka、Consul 、Nacos對比

前言 服務注冊中心本質上是為了解耦服務提供者和服務消費者。對于任何一個微服務&#xff0c;原則上都應存在或者支持多個提供者&#xff0c;這是由微服務的分布式屬性決定的。更進一步&#xff0c;為了支持彈性擴縮容特性&#xff0c;一個微服務的提供者的數量和分布往往是動…

MyBatis總結七:動態sql和sql片段

開發中&#xff0c;sql拼接很常見&#xff0c;所以說一下動態sql&#xff1a; 1if2chose,when,otherwise3where,set4foreach用法解析(現有一張users表 內有id username age 三個字段)&#xff1a; <!--查詢所有用戶&#xff0c;傳遞參數type&#xff0c;如果值為0&#xff0…

iOS - OC Copy 拷貝

前言 copy&#xff1a;需要先實現 NSCopying 協議&#xff0c;創建的是不可變副本。mutableCopy&#xff1a;需要實現 NSMutableCopying 協議&#xff0c;創建的是可變副本。淺拷貝&#xff1a;指針拷貝&#xff0c;源對象和副本指向的是同一個對象。對象的引用計數器 &#xf…

三.選擇結構(一)

1.if結構: if(條件){ 代碼塊 } 2.隨機產生數: int randon (int)(Math.random()*10); 3.多重if選擇結構: if(條件1){ 代碼塊1 }else if (條件2){ 代碼塊2 }else{ 代碼塊3 } 4.嵌套if選擇結構: if(條件1){ if(條件2){ 代碼塊1 }else{ 代碼塊2 } }else{ 代碼塊3 } 轉載于:https://…

為了高性能、超大規模的模型訓練,這個組合“出道”了

點擊上方藍字關注我們&#xff08;本文閱讀時間&#xff1a;3分鐘)近年來&#xff0c;在大量數據上訓練的基于 transformer 的大規模深度學習模型在多項認知任務中取得了很好的成果&#xff0c;并且被使用到一些新產品和功能背后&#xff0c;進一步增強了人類的能力。在過去五年…

SVN就是這么簡單

什么是SVN SVN全稱&#xff1a;Subversion&#xff0c;是一個開放源代碼的版本控制系統 Svn是一種集中式文件版本管理系統。集中式代碼管理的核心是服務器&#xff0c;所有開發者在開始新一天的工作之前必須從服務器獲取代碼&#xff0c;然后開發&#xff0c;最后解決沖突&…

SpringCloud必會知識點大全

為什么要學習Spring Cloud 在項目開發中隨著業務越來越多&#xff0c;導致功能之間耦合性高、開發效率低、系統運行緩慢難以維護、不穩定。微服務 架構可以解決這些問題&#xff0c;而Spring Cloud是微服務架構最流行的實現. 1.微服務 微服務架構是使用一套小服務來開發單個應用…

thinkphp3.22 多項目配置

1.index.php if(version_compare(PHP_VERSION,5.3.0,<)) die(require PHP > 5.3.0 !); // 開啟調試模式 建議開發階段開啟 部署階段注釋或者設為false define(APP_DEBUG,true); // 創建 //define(BIND_MODULE,Login); define(erp,true); // 定義應用目錄 define(APP_PAT…

30分鐘掌握 C#7

1. out 變量&#xff08;out variables&#xff09; 以前我們使用out變量必須在使用前進行聲明&#xff0c;C# 7.0 給我們提供了一種更簡潔的語法 “使用時進行內聯聲明” 。如下所示&#xff1a; 1 var input ReadLine(); 2 if (int.TryParse(input, out var result)) 3 …

在 C# 中如何檢查參數是否為 null

前言前不久&#xff0c;微軟宣布從 C# 11 中移除參數空值檢查功能&#xff0c;該功能允許在方法開始執行之前&#xff0c;在參數名稱的末尾提供參數空值檢查&#xff08;!!操作符&#xff09;。那么&#xff0c;在 C# 中如何檢查參數是否為 null 呢&#xff1f;1. null這個可能…

什么是Maven快照(SNAPSHOT)

本文來說下Maven的SNAPSHOT版本有什么作用 文章目錄 問題解決 正式版本"abc-1.0"快照版本"abc-1.0-SNAPSHOT"本文小結問題 在使用maven進行依賴管理時&#xff0c;有的版本號后面會帶有"-SNAPSHOT"&#xff0c;有什么作用呢&#xff1f; <dep…

帶你剖析WebGis的世界奧秘----Geojson數據加載(高級)

前言&#xff1a;前兩周我帶你們分析了WebGis中關鍵步驟瓦片加載點擊事件&#xff08;具體的看前兩篇文章&#xff09;&#xff0c;下面呢&#xff0c;我帶大家來看看Geojson的加載及其點擊事件 Geojson數據解析 GeoJSON是一種對各種地理數據結構進行編碼的格式。GeoJSON對象可…

如果要存ip地址,用什么數據類型比較好

在看高性能MySQL第3版&#xff08;4.1.7節&#xff09;時&#xff0c;作者建議當存儲IPv4地址時&#xff0c;應該使用32位的無符號整數&#xff08;UNSIGNED INT&#xff09;來存儲IP地址&#xff0c;而不是使用字符串。但是沒有給出具體原因。為了搞清楚這個原因&#xff0c;查…

微軟 .NET Core 3.1 年底將結束支持,請升級到.NET 6

微軟近日宣布&#xff0c;將于 2022 年 12 月 13 日停止為 .NET Core 3.1 提供服務更新、安全修復和技術支持。.NET Core 是一個免費開源的、用于 Windows、Linux 和 macOS 操作系統的軟件框架。該項目主要由微軟員工通過 .NET 基金會開發&#xff0c;并在 MIT 許可下發布。202…

軟件團隊的模式選擇

軟件團隊的模式分為&#xff1a;主治醫生模式、明星模式、社區模式、業余劇團模式、秘密團隊、特工團隊、交響樂團模式、爵士樂模式、功能團隊模式和官僚模式。 經過小組的討論&#xff0c;我們決定選用交響樂團模式獲得功能團隊模式。 交響樂團模式的優點是種類多&#xff0c;…

Angular 2

1. Angular2 官網 https://angular.io/guide/quickstart Node.js 下載 https://nodejs.org/en/ 怎么在vs code中使用angualr2 https://code.visualstudio.com/docs/nodejs/angular-tutorial moment.js:(javacript日期處理庫) http://momentjs.cn/ 2. ng2-hightCharts https://…

「Docker入門指北」容器很難理解?帶你從頭到尾捋一遍

文章目錄 1. 初始虛擬化 &#x1f351; 虛擬化概念&#x1f351; 硬件虛擬化2. Docker容器 &#x1f351; Docker技術的誕生&#x1f351; 容器與虛擬化&#x1f351; 性能差別&#x1f351; Docker優勢 編排有序高效易遷移快速部署3. 容器生態系統 &#x1f351; 核心技術 容器…

微服務:事務管理

幾乎所有的信息管理系統都會涉及到事務&#xff0c;事務的目的是為了保證數據的一致性&#xff0c;這里說的一致性是數據庫狀態的一致性。說到數據庫狀態的一致性&#xff0c;相信大家都會想到 ACID &#xff1a;原子性&#xff08;Atomic&#xff09;&#xff1a;在一個事件的…

js - flex布局測試案例:完美居中

<span>I love flex layout!</span><style>body{display:flex;justify-content:center;align-items:center;font-size:3em;color:#00ffff;}</style>![enter image description here][1]<p>與自己為敵&#xff0c;</p><p>與自己為友&a…