簡體   English   中英

用asp.net導出文件

[英]export file with asp.net

該項目是Angular的ASP.Net Api項目。 我想要做的是將數據從數據庫表導出到Excel文件中。 So far, I've managed to export all the table data into an excel file, but struggle to select 2 or 3 fields in the table to export.

        [HttpGet("download")]
        public IActionResult DownloadExcel(string field)
        {
            string dbFileName = "DbTableName.xlsx";


            FileInfo file = new FileInfo(dbFileName);
            byte[] fileContents;

            var stream = new MemoryStream();
            using (ExcelPackage package = new ExcelPackage(file))
            {

                IList<UserTable> userList = _context.UserTable.ToList();

                ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("DbTableName");
                int totalUserRows = userList.Count();


            }


            return File(fileContents, fileType, dbFileName);
        }

如果您想使用數據表,那么我們可以通過這種方式定義需要從數據表中選擇的數據

string[] selectedColumns = new[] { "Column1","Column2"};
DataTable dt= new DataView(fromDataTable).ToTable(false, selectedColumns);

否則,如果您想列出,則可以使用linq來選擇特定的列

var xyz = from a in prod.Categories
                           where a.CatName.EndsWith("A")
                           select new { CatName=a.CatName, CatID=a.CatID, CatQty = a.CatQty};

不需要寫太多if ... else if ... else if ... else if ...來獲取相關的字段名稱。

更好的方法是

  1. 使用字段列表( IList<string> )作為參數。
  2. 然后通過intersect生成所需的字段列表。
  3. 最后,我們可以使用反射來檢索所有相關值。

實作

    public IActionResult DownloadExcel(IList<string> fields)
    {
        // get the required field list
        var userType = typeof(UserTable);
        fields = userType.GetProperties().Select(p => p.Name).Intersect(fields).ToList();

        if(fields.Count == 0){ return BadRequest(); }

        using (ExcelPackage package = new ExcelPackage())
        {
            IList<UserTable> userList = _context.UserTable.ToList();
            ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("DbTableName");

            // generate header line
            for(var i= 0; i< fields.Count; i++ ){
                var fieldName = fields[i];
                var pi= userType.GetProperty(fieldName);
                var displayName =  pi.GetCustomAttribute<DisplayNameAttribute>()?.DisplayName;
                worksheet.Cells[1,i+1].Value = string.IsNullOrEmpty(displayName ) ? fieldName : displayName ;
            }

            // generate row lines
            int totalUserRows = userList.Count();
            for(var r=0; r< userList.Count(); r++){
                var row = userList[r];
                for(var c=0 ; c< fields.Count;c++){
                    var fieldName = fields[c];
                    var pi = userType.GetProperty(fieldName);
                    // because the first row is header 
                    worksheet.Cells[r+2, c+1].Value = pi.GetValue(row);
                }
            }
            var stream = new MemoryStream(package.GetAsByteArray());
            return new FileStreamResult(stream,"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        }
    }

您可以使用DsiplayNameAttribute配置顯示名稱:

    public class UserTable
    {
        public int Id{get;set;}

        [DisplayName("First Name")]
        public string fName { get; set; }

        [DisplayName("Last Name")]
        public string lName { get; set; }

        [DisplayName("Gender")]
        public string gender { get; set; }

    }

可以根據需要添加任何屬性,而無需在DownloadExcel方法中進行硬編碼。

演示

傳遞字段列表fields[0]=fName&fields[1]=lName&fields[2]=Non-Exist將產生如下的excel:

在此處輸入圖片說明

[更新]

要導出所有字段,我們可以假設客戶端不會傳遞fields參數。 這意味着當字段為nullfields.Count==0 ,我們將導出所有字段:

    [HttpGet("download")]
    public IActionResult DownloadExcel(IList<string> fields)
    {
        // get the required field list
        var userType = typeof(UserTable);
        var pis= userType.GetProperties().Select(p => p.Name);

        if(fields?.Count >0){
            fields = pis.Intersect(fields).ToList();
        } else{
            fields = pis.ToList();
        }

        using (ExcelPackage package = new ExcelPackage()){
           ....
        }
    }

一種

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM