экспортировать файл с asp.net - PullRequest
1 голос
/ 28 марта 2019

Этот проект является проектом ASP.Net Api с Angular. Я пытаюсь экспортировать данные из таблицы базы данных в файл 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);
        }

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Нет необходимости писать так много 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, как показано ниже:

enter image description here

[Update]

Чтобы экспортировать все поля, мы можем предположить, что клиент не передаст параметр 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()){
           ....
        }
    }

A

0 голосов
/ 28 марта 2019

если вы хотите использовать таблицу данных, мы можем определить, что вам нужно выбрать из таблицы данных таким образом

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};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...