首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有实体框架的Asp.net将列表转换为DataTable,然后传递到Excel模板

带有实体框架的Asp.net将列表转换为DataTable,然后传递到Excel模板
EN

Stack Overflow用户
提问于 2021-08-24 22:52:38
回答 1查看 174关注 0票数 0

我有一个ASP.NET MVC项目,但我在这个领域是新的,所以我正在努力学习。

我必须在格式化的excel中从数据库中传递数据。我得出的结论是,我的项目最好使用Excel模板,然后填充它。我在Excel中使用动态命名范围。

我试着:

  1. 加载与

()方法相关的实体,然后将

  1. 转换为List
  2. ,将列表转换为DataTable,将列表转换为DataSet
  3. ,然后使用一些函数(运行良好并被检查)来填充来自DataSet的数据(在特定单元格上使用分隔符(如%name%)

这可能不是最有效的方法,但我被困在第一点上,我真的需要帮助.

以下是我到目前为止所拥有的:

模型

代码语言:javascript
复制
public partial class Activitydetail
    {
        public int ActivityDetailId { get; set; }
        public int ActivityId { get; set; }
        public string TimeType { get; set; }
        public double? Hours { get; set; }
        public int ComponentId { get; set; }
        public double? OkQty { get; set; }
        public string Comments { get; set; }

        public virtual Component Component { get; set; }   
    }

public partial class Component
    {
        public Component()
        {
            Activitydetails = new HashSet<Activitydetail>();
            Defects = new HashSet<Defect>();
            Modetails = new HashSet<Modetail>();
        }

        public int ComponentId { get; set; }
        public int ClientId { get; set; }
        public string Name { get; set; }
        public string ReferenceNo { get; set; }
       
        public virtual Client Client { get; set; }
        public virtual ICollection<Activitydetail> Activitydetails { get; set; }
        public virtual ICollection<Defect> Defects { get; set; }
        public virtual ICollection<Modetail> Modetails { get; set; }
    }

      public virtual DbSet<Activitydetail> Activitydetails { get; set; }

及管制员:

代码语言:javascript
复制
public IActionResult Ex2(int id, int idc)
        {
            List<Activitydetail> data = null;
            try
            {
                data = DB.Activitydetails.Where(x => x.Activity.Moid == id && x.Activity.Mo.ClientId == idc)
                      .Include(x => x.Component)
                      .ToList();
            }

            catch (Exception ex)
            {
            }
       
            var table11 = new DataTable();
            var table2  = new DataTable();
            table11 = ToDataTable2(data);
            table11.TableName = "table11";

           //return View(table11);

            var ds = new DataSet();
            ds.Tables.Add(table11);
            ds.Tables.Add("table2");

            ds.Tables["table2"].Columns.Add("col1");
            ds.Tables["table2"].Columns.Add("col2");
            
            FillReport("new2.xlsx", "template_mo1.xlsx", ds);
            string Files = "new2.xlsx";
            byte[] fileBytes = System.IO.File.ReadAllBytes(Files);
            System.IO.File.WriteAllBytes(Files, fileBytes);
            MemoryStream ms = new MemoryStream(fileBytes);
            return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, "new2.xlsx");
        }


        public DataTable ToDataTable<T>(List<T> items)
        {
            DataTable dataTable = new DataTable(typeof(T).Name);
            PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
            foreach (PropertyInfo prop in Props)
            {
                dataTable.Columns.Add(prop.Name);
            }
            foreach (T item in items)
            {
                var values = new object[Props.Length];
                for (int i = 0; i < Props.Length; i++)
                {
                    values[i] = Props[i].GetValue(item, null);
                }
                dataTable.Rows.Add(values);
            }
            return dataTable;
         }

table11很好地创建,所有的值都可以传递到Table11文件中(通过单元格名,例如%TimeType%或%Hour%),将其传递到名称范围table11中。

问题是,我还想将Component.Name或Componenet.ReferenceNo交付给Excel。

我试过:

代码语言:javascript
复制
data = DB.Activitydetails.Where(x => x.Activity.Moid == id && x.Activity.Mo.ClientId == idc)
                      .Include(x => x.Component.Select(c=>c.ReferenceNo))
                      .ToList();

或者用"IncludeThen",或者用那个值填充table2,但是我得到了很多错误。

EN

回答 1

Stack Overflow用户

发布于 2021-08-25 15:03:26

我想我找到了一个更好的解决方案,不是很复杂,我把LINQ查询结果转换成数据表。

我受此启发: https://www.c-sharpcorner.com/UploadFile/0c1bb2/convert-linq-query-result-to-datatable/是我的新代码,在data= .....ToList()之后:

代码语言:javascript
复制
  var result = data.Select(x => new Activity_VM
               {
                   ActivityId = x.ActivityId,
                   Client = x.Activity.Mo.Client.Name,                     
                   MoNumber = x.Activity.Mo.Monumber,                              
                   Component = x.Component.Name,
                   Reference= x.Component.ReferenceNo     
               });
    DataTable table11 = LINQResultToDataTable(result);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68914900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档