我有一个ASP.NET MVC项目,但我在这个领域是新的,所以我正在努力学习。
我必须在格式化的excel中从数据库中传递数据。我得出的结论是,我的项目最好使用Excel模板,然后填充它。我在Excel中使用动态命名范围。
我试着:
()方法相关的实体,然后将
这可能不是最有效的方法,但我被困在第一点上,我真的需要帮助.
以下是我到目前为止所拥有的:
模型
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; }及管制员:
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。
我试过:
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,但是我得到了很多错误。
发布于 2021-08-25 15:03:26
我想我找到了一个更好的解决方案,不是很复杂,我把LINQ查询结果转换成数据表。
我受此启发: https://www.c-sharpcorner.com/UploadFile/0c1bb2/convert-linq-query-result-to-datatable/是我的新代码,在data= .....ToList()之后:
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);https://stackoverflow.com/questions/68914900
复制相似问题