1

这个项目是一个带有 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);
        }
4

2 回答 2

0

如果您想使用数据表,那么我们可以通过这种方式定义您需要从数据表中选择哪些

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};
于 2019-03-28T06:29:51.187 回答
0

不需要写那么多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参数。这意味着当字段为null或 时fields.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()){
           ....
        }
    }

一个

于 2019-03-28T06:47:47.437 回答