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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...