abp框架Excel導出——基於vue

来源:https://www.cnblogs.com/JerryMouseLi/archive/2020/07/29/13399027.html
-Advertisement-
Play Games

#abp框架Excel導出——基於vue #1.技術棧 ##1.1 前端採用vue,官方提供 UI套件用的是iview ##1.2 後臺是abp——aspnetboilerplate 即abp v1,https://github.com/aspnetboilerplate/aspnetboilerp ...


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
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 阿裡雲購買伺服器 購買雲伺服器,伺服器版本選擇centos 7.5版本,之後在控制台打開實例 2,設置root密碼 如果你購買時沒有設置root密碼 這裡需要重置下 下載軟體並安裝寶塔 本地下載putty 鏈接工具 填入你的公網ip 然後open 賬號填root 密碼就是剛纔設置的那個密碼 然後執行 ...
  • import concurrent import requests; from concurrent.futures import ThreadPoolExecutor import os; import parsel; def send_request(url): header = { "user ...
  • import requests; import re; import os; import parsel; 1.請求網頁 header = { "user-agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537. ...
  • import requests; import re; import os; # 1.請求網頁 header = { "user-agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, li ...
  • from typing import List# 這道題看了大佬寫的代碼,經過自己的理解寫出來了。# 從最外圍的四周找有沒有為O的,如果有的話就進入深搜函數,然後深搜遍歷# 判斷上下左右的位置是否為Oclass Solution: def solve(self, board: List[List[s ...
  • 在社會上存在一種普遍的對培訓機構的學生一種歧視的現象,具體表現在,比如:當你去公司面試的時候,一旦你說了你是培訓機構出來的,那麼基本上你就涼了,那麼你瞞著不說,然後又通過了面試成功入職,但是以後一旦在公司被髮現有培訓經歷,可能會面臨被降薪,甚至被辭退,培訓機構出來的學生,在用人單位眼裡就是能力低下的 ...
  • 從12年到20年,python以肉眼可見的趨勢超過了java,成為了當今It界人人皆知的編程語言。 python為什麼這麼火? 網路編程語言搜索指數 適合初學者 Python具有語法簡單、語句清晰的特點,這就讓初學者在學習階段可以把精力集中在編程對象和思維方法上。 大佬都在用 Google,YouT ...
  • 前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 作者:碧茂大數據 PS:如有需要Python學習資料的小伙伴可以加下方的群去找免費管理員領取 input()輸入 Python提供了 input() 內置函數從標準輸入讀入一 ...
一周排行
    -Advertisement-
    Play Games
  • 一:背景 準備開個系列來聊一下 PerfView 這款工具,熟悉我的朋友都知道我喜歡用 WinDbg,這東西雖然很牛,但也不是萬能的,也有一些場景他解決不了或者很難解決,這時候藉助一些其他的工具來輔助,是一個很不錯的主意。 很多朋友喜歡在項目中以記錄日誌的方式來監控項目的流轉情況,其實 CoreCL ...
  • 本來閑來無事,準備看看Dapper擴展的源碼學習學習其中的編程思想,同時整理一下自己代碼的單元測試,為以後的進一步改進打下基礎。 突然就發現問題了,源碼也不看了,開始改代碼,改了好久。 測試Dapper.LiteSql數據批量插入的時候,耗時20秒,感覺不正常,於是我測試了非Dapper版的Lite ...
  • 需求如下,在DEV框架項目中,需要在表格中增加一列顯示圖片,並且能編輯該列圖片,然後進行保存等操作,最終效果如下 這裡使用的是PictureEdit控制項來實現,打開DEV GridControl設計器,在ColumnEdit選擇PictureEdit: 綁定圖片代碼如下: DataTable dtO ...
  • 前兩天微軟偷偷更新了Visual Studio 2022 正式版版本 17.3 發佈,發佈摘要: MAUI 工作負荷 GA 生成 MAUI/Blazor CSS 熱重載支持 現在,你將能夠使用我們的新增功能在 Visual Studio 中使用每個更新試用一系列新功能。 選擇每個功能以瞭解有關特定功 ...
  • 航天和軍工領域的數字化轉型和建設正在積極推進,在與航天二院、航天三院、航天六院、航天九院、無線電廠、兵工廠等單位交流的過程中,用戶更聚焦試驗和生產過程中的痛點,迫切需要解決軟體平臺統一監測和控制設備及軟體與設備協同的問題。 ...
  • .NET 項目預設情況下 日誌是使用的 ILogger 介面,預設提供一下四種日誌記錄程式: 控制台 調試 EventSource EventLog 這四種記錄程式都是預設包含在 .NET 運行時庫中。關於這四種記錄程式的詳細介紹可以直接查看微軟的官方文檔 https://docs.microsof ...
  • 一:背景 上一篇我們聊到瞭如何去找 熱點函數,這一篇我們來看下當你的程式出現了 非托管記憶體泄漏 時如何去尋找可疑的代碼源頭,其實思路很簡單,就是在 HeapAlloc 或者 VirtualAlloc 時做 Hook 攔截,記錄它的調用棧以及分配的記憶體量, PerfView 會將這個 分配量 做成一個 ...
  • 背景 在 CI/CD 流程當中,測試是 CI 中很重要的部分。跟開發人員關係最大的就是單元測試,單元測試編寫完成之後,我們可以使用 IDE 或者 dot cover 等工具獲得單元測試對於業務代碼的覆蓋率。不過我們需要一個獨立的 CLI 工具,這樣我們才能夠在 Jenkins 的 CI 流程集成。 ...
  • 一、應用場景 大家在使用Mybatis進行開發的時候,經常會遇到一種情況:按照月份month將數據放在不同的表裡面,查詢數據的時候需要跟不同的月份month去查詢不同的表。 但是我們都知道,Mybatis是ORM持久層框架,即:實體關係映射,實體Object與資料庫表之間是存在一一對應的映射關係。比 ...
  • 我國目前並未出台專門針對網路爬蟲技術的法律規範,但在司法實踐中,相關判決已屢見不鮮,K 哥特設了“K哥爬蟲普法”專欄,本欄目通過對真實案例的分析,旨在提高廣大爬蟲工程師的法律意識,知曉如何合法合規利用爬蟲技術,警鐘長鳴,做一個守法、護法、有原則的技術人員。 案情介紹 深圳市快鴿互聯網科技有限公司 2 ...