.NET CORE 2.1 導出excel文件的兩種方法

来源:https://www.cnblogs.com/teng-0802/archive/2018/07/06/9271919.html
-Advertisement-
Play Games

最近在做 MVC 項目的時候遇到項目的導出,下麵總結下兩種導出到excel 的方法 第一種方法: 將文件寫到本地,然後返回這個File 或者返回這個 File 的絕對地址 其中 _hostingEnvironment 可以在全局讀取的配置文件的工具類 Globals 中配置 直接上代碼: 第二種方法 ...


最近在做 MVC 項目的時候遇到項目的導出,下麵總結下兩種導出到excel 的方法

第一種方法: 將文件寫到本地,然後返回這個File 或者返回這個 File 的絕對地址

   其中  _hostingEnvironment  可以在全局讀取的配置文件的工具類 Globals 中配置

   直接上代碼:

private IHostingEnvironment _hostingEnvironment;
        public XlsxController(IHostingEnvironment hostingEnvironment)
        {
            _hostingEnvironment = hostingEnvironment;
        }
        public IActionResult ExportData(int programmeId)
        {
            //獲取方案名稱
            var programmeName = ProgrammeService.GetProgrammeNameById(programmeId);
            //獲取列表內容
            var dataFromDb = ProgrammeService.GetProgrammeStatisticEnrolmentExportList(programmeId);
            var data = dataFromDb.Select(a => new ProgrammeStatisticsEnrolmentDetailsExportViewModel
            {
                UserName = a.UserName,
                Phone = a.Phone,
                EnrolTime = a.EnrolTimeStr
            }).ToList();

            var sWebRootFolder = _hostingEnvironment.WebRootPath;

            var sFileName = $"XXX-{programmeName}.xlsx";

            var file = new FileInfo(Path.Combine(sWebRootFolder, sFileName));
            using (var package = new ExcelPackage(file))
            {

                //如果之前有同名的文件先刪除然後重新創建 
                var count = package.Workbook.Worksheets.Count; if (count > 0)
                {
                    for (var i = 0; i < count; i++)
                    {
                        package.Workbook.Worksheets.Delete(i + 1);
                    }
                    package.File.Delete();
                }

                // 添加worksheet 
                ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Sheet1");

                //添加頭 
                worksheet.Cells[1, 1].Value = "姓名";
                worksheet.Cells[1, 2].Value = "手機號";
                worksheet.Cells[1, 3].Value = "報名時間";

                //添加值 
                for (var i = 0; i < data.Count; i++)
                {
                    worksheet.Cells[$"A{i + 2}"].Value = data[i].UserName;
                    worksheet.Cells[$"B{i + 2}"].Value = data[i].Phone;
                    worksheet.Cells[$"C{i + 2}"].Value = data[i].EnrolTime;
                }
                package.Save();
            }
            var returnFile = File(sFileName, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            returnFile.FileDownloadName = sFileName;
            return returnFile;
        }

 

第二種方法: 用寫流文件的方法 將文件寫入瀏覽器

 

  這裡首先我們需要一個導出的工具類 如下:

    /// <summary>
    /// 公共工具類
    /// </summary>
    public class CommonHelper
    {

        //獲取列名委托方法
        public delegate string GetColumnName(string columnName);

        #region 導入導出Excel相關

        /// <summary>
        /// 將泛類型集合List類轉換成DataTable
        /// </summary>
        /// <param name="list">泛類型集合</param>
        /// <returns>返迴轉換後的DataTable</returns>
        public static DataTable ListToDataTable<T>(List<T> entitys)
        {
            //生成DataTable的structure
            var dt = new DataTable();
            try
            {
                //檢查泛型實體是否為空
                if (entitys == null || entitys.Count < 1)
                {
                    return dt;
                }
                //取出第一個實體的所有Propertie
                var entityType = entitys[0].GetType();
                var entityProperties = entityType.GetProperties();
                for (var i = 0; i < entityProperties.Length; i++)
                {
                    dt.Columns.Add(entityProperties[i].Name);
                }
                //將所有entity添加到DataTable中
                foreach (object entity in entitys)
                {
                    //檢查所有的的實體都為同一類型
                    if (entity.GetType() != entityType)
                    {
                        throw new Exception("要轉換的集合元素類型不一致");
                    }
                    var entityValues = new object[entityProperties.Length];
                    for (var i = 0; i < entityProperties.Length; i++)
                    {
                        entityValues[i] = entityProperties[i].GetValue(entity, null);
                    }
                    dt.Rows.Add(entityValues);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
            return dt;
        }

        /// <summary>
        /// 將dataTable轉換為Excel位元組流
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="getColumnName"></param>
        /// <returns></returns>
        public static byte[] GetExcelForXLSX(DataTable dt, GetColumnName getColumnName)
        {
            var xssfworkbook = new XSSFWorkbook();
            var sheet = xssfworkbook.CreateSheet("Sheet");
            //表頭
            var row = sheet.CreateRow(0);

            for (var i = 0; i < dt.Columns.Count; i++)
            {
                var cell = row.CreateCell(i);
                //列名稱,資料庫中欄位
                var columnName = dt.Columns[i].ColumnName;
                var convertColumnName = getColumnName(columnName);
                cell.SetCellValue(convertColumnName);
            }

            //數據
            for (var i = 0; i < dt.Rows.Count; i++)
            {
                var row1 = sheet.CreateRow(i + 1);
                for (var j = 0; j < dt.Columns.Count; j++)
                {
                    var cell = row1.CreateCell(j);
                    cell.SetCellValue(dt.Rows[i][j].ToString());
                }
            }
            //轉為位元組數組
            var stream = new MemoryStream();
            xssfworkbook.Write(stream);
            var buf = stream.ToArray();
            return buf;
        }

       #endregion
    }

  

  然後我們就可以導出了

 

     /// <summary>
        /// 表格列名稱
        /// </summary>      
        private static string GetColumnNameForDetail(string columnName)
        {
            switch (columnName)
            {

                case "UserName":
                    return CommonConst.Column_Programme_Detail_UserName;
                case "Phone":
                    return CommonConst.Column_Programme_Detail_Phone;
                case "EnrolTime":
                    return CommonConst.Column_Programme_Detail_EnrolTime;
                default:
                    return String.Empty;
            }
        }

        /// <summary>
        /// 導出excel
        /// </summary>
        [HttpGet]
        public void ExportData(int programmeId)
        {
            //獲取方案名稱
            var programmeName = ProgrammeService.GetProgrammeNameById(programmeId);
            //獲取列表內容
            var dataFromDb = ProgrammeService.GetProgrammeStatisticEnrolmentExportList(programmeId);
            var data = dataFromDb.Select(a => new ProgrammeStatisticsEnrolmentDetailsExportViewModel
            {
                UserName = a.UserName,
                Phone = a.Phone,
                EnrolTime = a.EnrolTimeStr
            }).ToList();

            var sFileName = string.Format(CommonConst.Export_Programme_Detail_Excel_Name, programmeName);
            var dataTable = CommonHelper.ListToDataTable(data);
            var result = CommonHelper.GetExcelForXLSX(dataTable, GetColumnNameForDetail);
            Response.ContentType = ResponseConfigure.ContentTypeExcel;
            SetResponseHeaderForDetail(sFileName);
            Response.Body.Write(result);
            Response.Body.Flush();
            Response.Body.Close();
        }

        /// <summary>
        /// 設定導出的標頭內容
        /// </summary>
        /// <param name="fileName">導出的文件名</param>
        private void SetResponseHeaderForDetail(string fileName)
        {
            Response.Headers.Add(ResponseConfigure.ContentDisposition,
                ResponseConfigure.Attachment + HttpUtility.UrlEncode(fileName));
        }

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • public static string Secretkey() { var Secretkey = Guid.NewGuid().ToString("N") .Remove(25, 1) .Remove(23, 1) .Remove(20, 1) .Remove(18, 1) .Remove(15 ...
  • 將頁面發佈到伺服器時,會檢查 ModelState。 如果無效,會重新生成Describe,且頁面會呈現一個或多個驗證消息,陳述頁面驗證失敗的原因。 如果有效,FileUpload 屬性將用於“OnPostAsync”中,以完成兩個上傳文件的上傳,並創建一個用於存儲數據的新 Describe 對象。... ...
  • 今天在做WPF的時候,關於設計思路,我覺得自己局限了,因為有一個頁面涵蓋的東西非常多,所以它不能很好的顯示,我就想著怎麼能讓它把其中一部分隱藏,到要使用的時候再拿出來使用,這是一種想法,我自己覺得還不錯,但是之後,我們的頁面設計人員做了這樣一種設計,把表格的數據圖表化,感覺一下子變得更為清晰明瞭,我 ...
  • Visual Studio 2017移動開發 控制項介紹和使用方式:Numeric控制項 Smobiler開發平臺,.NET移動開發 一、 樣式一 我們要實現上圖中的效果,需要如下的操作: 設置控制項的背景色,預設設置為“White”,如圖1; 圖 1 若將該屬性設置為“128, 255, 255”,顯示 ...
  • 在WEBAPI中,AuthorizeAttribute類重寫時,如何獲取post數據是個難題,網上找資料也不好使,只能自己研究,通過研究發現,WEBAPI給了我們獲取POST數據的可能,下麵介紹一下: //將POST數據以字元串的形式讀取,例如post的json數據,就可以以這種方式讀取 actio ...
  • 日行千里,全憑“車”況,為什麼我們要升級平臺 歷經一個半月的時間,不管是叫工業互聯網平臺還是叫工業大數據平臺,從1.0版本升級到2.0版本,升級部分包括:客戶端(網關)、服務端(數據接收、數據處理、計算服務)、底層資料庫結構、WEB業務系統、WEB API介面和手機APP(Android和IOS)等 ...
  • mvc傳值的三種方式:1.ViewData 在使用過程中需要類型轉換 例子: ViewData["MyTitle"]="ViewData傳值"; 引用: @ViewData["MyTitle"] 例子: List<string> strs=new List<string>{"China","Appl ...
  • 通用的單例窗體製作類 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...