gpt4 book ai didi

c# - 将具有不同关系值的表转换为 excel 列

转载 作者:行者123 更新时间:2023-11-30 21:31:07 26 4
gpt4 key购买 nike

我有这些表:

类别

CategoryId
CategoryTitle
...
ICollection<Article> Articles

每个类别可以有几篇文章:

文章

ArticleId
ArticleTitle
NumberOfComment
NumberOfView
...
ICollection<ArticleReview> Reviews

每篇文章都有一些用户的评论:

文章评论

ArticleReviewId 
ReviewPoint
ArticleId
ReviewerId

我正在尝试使用 EPPlus 导出 excel 报告包裹
这是我的 ExcelExport 类:

public class excelExport 
{
public string ArticleTitle { get; set; }

public int NumberOfComment { get; set; }
public int NumberOfReviews { get; set; }
public List<ResearchReviewReport> Reviews { get; set; }
}

public class ArticleReviewReport
{
public string Reviewer { get; set; }
public int ReviewPoint { get; set; }
}

注意:由于一篇文章的评论数量不同,我使用一对多关系,但最终结果应该将它们全部拉平单行。现在我创建不属于数据库的新类,并将此类传递给 ExcelPackage 类以生成 xlsx 作为输出:

Excel 导出

ArticleTitle 
Reviewer1Point
Reviewer2Point
............
ReviewerNPoint
ReviewersAvaragePoint
NumberOfComment
NumberOfView

如何使用另外 3 个类填充 ExcelExport 类?


编辑
这是我预期的 excel 输出
Excel final Export

我的一个问题是 Reviewer Point 列是动态变化的,
一篇文章可能有 3 列(如上图),但在另一篇文章中可能有 4 或 5 个评论点。
编辑2
我忘了说每篇文章都有一些问题和审稿人对每个问题的回答,所以如果我们有 3 个问题并且有 2 个审稿人,文章有 6 个 ArticleReview,我应该得到每个审稿人的 ArticleReview 的平均值并将其放在单个单元格中

最佳答案

为简单起见,我假设您使用以下简化模型并将描述解决方案。您可以轻松地使其适应您的模型:

public class Article
{
public string Title { get; set; }
public DateTime Date { get; set; }
public List<Review> Reviews { get; set; }
}
public class Review
{
public int Points { get; set; }
}

现在我们将生成以下输出,具有动态数量的评论者列,具体取决于输入数据:

enter image description here

解决方案

创建一个函数来转换 List<Article> 就足够了到 DataTable .创造这样的 DataTable ,对于 Article 的每个属性, 添加一个新列。然后找到Reviews的最大计数列出并添加该列数。然后在一个循环中,对于每个 Article包括它的Review列表,创建对象数组并添加到 DataTable .显然,您也可以对字段进行计算。

函数如下:

public DataTable GetData(List<Article> list)
{
var dt = new DataTable();
dt.Columns.Add("Title", typeof(string));
dt.Columns.Add("Date", typeof(DateTime));
var max = list.Max(x => x.Reviews.Count());
for (int i = 0; i < max; i++)
dt.Columns.Add($"Reviewer {i + 1} Points", typeof(int));
foreach (var item in list)
dt.Rows.Add(new object[] { item.Title, item.Date }.Concat(
item.Reviews.Select(x => x.Points).Cast<object>()).ToArray());
return dt;
}

测试数据

这是我的测试数据:

var list = new List<Article>
{
new Article(){
Title = "Article 1", Date = new DateTime(2018,1,1),
Reviews = new List<Review> {
new Review(){Points=10},
},
},
new Article(){
Title = "Article 2", Date = new DateTime(2018,1,2),
Reviews = new List<Review> {
new Review(){Points=10}, new Review(){Points=9}, new Review(){Points=8},
},
},
new Article(){
Title = "Article 3", Date = new DateTime(2018,1,3),
Reviews = new List<Review> {
new Review(){Points=9},
},
},
};

关于c# - 将具有不同关系值的表转换为 excel 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53692304/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com