将许多表转换为 Excel 列

2024-05-11

我创建了用于文章审阅的网络应用程序。

我有一个名为 Article 的表,每个表Article有一些ArticleReview:

Article

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

管理员可以添加许多用户(我称之为 JueryUser)并将文章发送给他们进行审阅,我使用名为 ArticlePoint 的表来添加/删除可以审阅每篇文章的用户:

文章点

public int ArticlePointId { get; set; }
public DateTime CreateOn { get; set; }
public string Id { get; set; }      // Id of User that review Article
public ApplicationUser JuryUser { get; set; }
public string UserId { get; set; } // Id of User that write Article
public int ArticleId { get; set; }
public string JuryReview { get; set; }

当陪审团用户评论文章时,他/她给文章一些分数,该分数基于管理员提供的问题,该评论存储在ArticleReview table.

文章评论

ArticleReviewId 
ReviewPoint
ArticleId
ReviewerId

正如我在我之前的问题 https://stackoverflow.com/questions/53692304/convert-a-table-with-different-relational-values-to-excel-columns/53804622我想从每个 jquery 提供的文章的要点摘要中导出 excel。

我使用下面的代码生成我的 Excel 文件:

public static class ExcelExportHelper
    {
        public static string ExcelContentType => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

        public static DataTable ListToDataTable<T>(List<T> data)
        {
            PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
            DataTable dataTable = new DataTable();

            for (int i = 0; i < properties.Count; i++)
            {
                PropertyDescriptor property = properties[i];
                dataTable.Columns.Add(property.Name, Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType);
            }

            object[] values = new object[properties.Count];
            foreach (T item in data)
            {
                for (int i = 0; i < values.Length; i++)
                {
                    values[i] = properties[i].GetValue(item);
                }

                dataTable.Rows.Add(values);
            }
            return dataTable;
        }

        public static byte[] ExportExcel(DataTable dataTable, string heading = "", bool showSrNo = false, params string[] columnsToTake)
        {
            byte[] result = null;
            using (ExcelPackage package = new ExcelPackage())
            {
                ExcelWorksheet workSheet = package.Workbook.Worksheets.Add(String.Format("{0} Data", heading));
                workSheet.View.RightToLeft = true;
                int startRowFrom = String.IsNullOrEmpty(heading) ? 1 : 3;

                if (showSrNo)
                {
                    DataColumn dataColumn = dataTable.Columns.Add("#", typeof(int));
                    dataColumn.SetOrdinal(0);
                    int index = 1;
                    foreach (DataRow item in dataTable.Rows)
                    {
                        item[0] = index;
                        index++;
                    }
                }

                // add the content into the Excel file  
                workSheet.Cells["A" + startRowFrom].LoadFromDataTable(dataTable, true);
                // format header - bold, yellow on black  
                using (ExcelRange r = workSheet.Cells[startRowFrom, 1, startRowFrom, dataTable.Columns.Count])
                {
                    r.Style.Font.Color.SetColor(System.Drawing.Color.White);
                    r.Style.Font.Bold = true;
                    r.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
                    r.Style.Fill.BackgroundColor.SetColor(System.Drawing.ColorTranslator.FromHtml("#1fb5ad"));
                }

                // format cells - add borders  
                using (ExcelRange r = workSheet.Cells[startRowFrom + 1, 1, startRowFrom + dataTable.Rows.Count, dataTable.Columns.Count])
                {
                    r.Style.Border.Top.Style = ExcelBorderStyle.Thin;
                    r.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
                    r.Style.Border.Left.Style = ExcelBorderStyle.Thin;
                    r.Style.Border.Right.Style = ExcelBorderStyle.Thin;

                    r.Style.Border.Top.Color.SetColor(System.Drawing.Color.Black);
                    r.Style.Border.Bottom.Color.SetColor(System.Drawing.Color.Black);
                    r.Style.Border.Left.Color.SetColor(System.Drawing.Color.Black);
                    r.Style.Border.Right.Color.SetColor(System.Drawing.Color.Black);
                }

                if (!String.IsNullOrEmpty(heading))
                {
                    workSheet.Cells["A1"].Value = heading;
                    workSheet.Cells["A1"].Style.Font.Size = 20;

                    workSheet.InsertColumn(1, 1);
                    workSheet.InsertRow(1, 1);
                    workSheet.Column(1).Width = 5;
                }

                result = package.GetAsByteArray();
            }

            return result;
        }

        public static byte[] ExportExcel<T>(List<T> data, string Heading = "", bool showSlno = false, params string[] ColumnsToTake)
        {
            return ExportExcel(ListToDataTable<T>(data), Heading, showSlno, ColumnsToTake);
        }
    }

并在我的操作方法中使用此代码:

  public ActionResult ExportToExcel()
        {
            byte[] filecontent;
            try
            {

                var juryLists = from user in db.Users
                                where user.Roles.Any(r => r.RoleId == "IdOfRole")
                                select user;

                var articles = db.Articles.Include(r=>r.ArticleReview).Where(r2=>r2.ArticleReviews.Any()).ToList();

                List<string> cmnList = new List<string>();
                cmnList.Add("Article Title");
                cmnList.Add("Point Avarage");
                var juryListNames = juryLists.OrderBy(x=>x.Id).Select(x => "JuryPoints : " + x.FullName).ToList();
                cmnList.AddRange(juryListNames);
                string[] columns = cmnList.ToArray();

                var heading = $"Results";

                var dt = new DataTable();
                foreach (var column in columns)
                {
                    dt.Columns.Add(column, typeof(string));
                }

                foreach (var item in articles)
                {
                    var _obj = new object[] { item.ArticleTitle, item.ArticleReviews.OrderBy(x=>x.JuryUserId).Select(x=>x.ArticlePoint).Average() }.Concat(
                        item.ArticleReviews.OrderBy(x => x.JuryUserId).GroupBy(x => x.JuryUserId).Select(x => x.Average(y => y.ReviewPoint))
                            .Cast<object>()).ToArray();
                    dt.Rows.Add(_obj);
                }
                filecontent = ExcelExportHelper.ExportExcel(dt, heading, true, columns);
            }
            catch (Exception e)
            {
                return RedirectToAction("Details",new {id= id });
            }


            return File(filecontent, ExcelExportHelper.ExcelContentType, "Results.xlsx");
        }

我的问题:
我为我的 Excel 创建标题,但问题是一些陪审团用户还不会为文章给出分数,当我生成 Excel 时,另一个陪审团的点放在另一个陪审团的列中。
例如:一篇文章发送给 5 个陪审团,陪审团 1,2 和 5 给文章评分,但在第 5 个陪审团的导出点之后,将其放置在第 3 个陪审团列中 我该如何解决这个问题?


为了包含那些尚未添加或预计由审阅者填写的审阅,您可以使用一个简单的left outer join评审团名单和每个给出评审团的计算出的平均值之间的关系。如果陪审团缺少评论,left outer join将导致空值平均侧。因此,会填充一个简单的占位符,例如连字符、空字符串或零。要实现所有这些,您需要更改第二个for loop在操作方法中如下:

foreach (var item in articles)
{
    //Prepare list of averages for this article by grouping by individual jury
    //Resulting listcontains objects with two attributes, i.e. JuryUserId and Avg
    //JuryUserId is needed here for later join with user(jury) list
    var averages = item.ArticleReviews.GroupBy(x => x.JuryUserId).Select(x => new { JuryUserId = x.Key, Avg = x.Average(y => y.ReviewPoint) });

    //Left outer join of juries with list of averages  
    //If reviews are not found or yet to be added, a hyphen will be populated as a placeholder 
    var joinedAvg = from jury in juryLists
                join avg in averages on jury.Id equals avg.JuryUserId into j
                from result in j.DefaultIfEmpty()
                orderby jury.Id
                select (result?.Avg.ToString() ?? "-"); //Use any placeholder here

    var _obj = new object[] { item.ArticleTitle, item.ArticleReviews.Select(x => x.ReviewPoint).Average() }.Concat(joinedAvg.Cast<object>()).ToArray();

    dt.Rows.Add(_obj);

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将许多表转换为 Excel 列 的相关文章

  • 检查工作表是否存在,如果不存在则创建-VBA [重复]

    这个问题在这里已经有答案了 我已经测试了许多代码 这些代码检查工作表是否存在 基于名称 如果不存在则创建一个 其中一些循环所有工作表 一些引用工作表 如果创建错误则意味着该工作表不存在 哪一种是最合适的 正统的 更快的方式来完成这个任务 目
  • 具有日期和名称标准的 SUMIFS...仅限月份和年份

    我正在尝试获取 SUMIFS 公式来检查日期列 并仅对与标准日期的匹配年份和月份相对应的值求和 我还希望此 SUMIFS 包含名称标准和日期 IE 单元格 A1 SUMIFS Sheet1 O O Sheet1 D D Sheet2 DAT
  • 有什么方法可以处理 ASP.Net MVC 中的 Put 和 Delete 动词吗?

    只是想知道是否有人知道真正宁静的 Put delete 实现 asp net mvc Preview 5 最好 查看 mvccontrib 项目 http www mvccontrib org http www mvccontrib org
  • 如何连接以逗号分隔的命名范围的返回值

    我花了几个小时试图找出如何连接命名范围中的返回值 但结果是 运行时错误 32 类型不匹配 作为一个新手 我仍在与数组作斗争 所以也许我忽略了一些细节 谢谢你帮助我 示例 B1 苯 B2 柴油 B3 混合动力 gt E1 汽油 E2 柴油 E
  • VBA Excel 选择以字符开头的命名范围

    我在命名范围方面遇到了一些问题 我在不同的工作表上有多个命名范围 我想用VBA隐藏或显示所有这些范围 命名范围的示例 r1 name1 另一张纸上的第二个是r1 name2 因此 所有范围都以前面相同的代码开头 r1 我如何循环遍历以 r1
  • ASP.NET MVC 母版页数据

    我使用 ASP NET MVC 越多 我就越喜欢它 然而 在母版页上显示模型数据的情况下 似乎有多种方法可以实现 我不确定最佳解决方案 我的示例是一个商业网站 我想在每个页面上输出产品类别列表 并显示访问者购物车的状态 在 ASP NET
  • 实体框架 - 实体类型之间的关联已被切断问题

    您好 当我尝试删除 绑定 表中的一行时 我遇到了实体框架问题 这些表看起来像这样 Table Users public class UserEntity BaseEntity Required MaxLength 30 public str
  • 如何删除实体框架6中的多对多关系

    如果将项目连接为多对多关系 则从数据库中删除项目时会出现问题 我的数据库看起来像 Project lt JobInProject gt Job ProjectID JobInProjectID JobID ProjectID JobID 主
  • 如何在 apache poi 中找到包含图片的单元格

    我尝试在 xls 文档中循环图像 我写下一个代码 HSSFPatriarch patriarch sheet getDrawingPatriarch if patriarch null Loop through the objects fo
  • 将 Web API 添加到 asp.net MVC 项目时出现问题(追溯)

    我正在 Visual Studio 2013 中使用 asp net mvc 迈出第一步 但遇到了一个奇怪的问题 我以 MVC 的形式启动了我的项目 并且没有选中 Web API 框来包含核心参考 不过现在我想使用 Web API 功能 我
  • SSIS Excel 文件问题 - 创建文件失败

    我有 SSIS 包 可以抓取 excel 文件并将其加载到 sql 表中 运行它时出现以下错误 我尝试将 64 位运行设置为 false 那不起作用 我还安装了 64 位访问驱动程序引擎 这也没有帮助 数据流任务 Excel 源 2 出错
  • 使用 SimpleMembership 获取用户信息

    仍在尝试使用 MVC4 来掌握新的 SimpleMembership 我更改了模型以包含名字和姓氏 效果很好 我想更改登录时显示的信息 而不是在视图中使用 User Identity Name 我想做类似 User Identity For
  • 如何重定向到 $.AJAX 上的视图完整 - asp.net mvc 3

    好的 我想在验证检查后使用 AJAX 将用户重定向到周围视图 我该怎么做 请帮忙 这是我的 AJAX 代码 EX 我希望用户重定向到 Home Movies 控制器操作 如果未登录 则停留在同一页面
  • 保护 Excel VBA 代码的最佳方法? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经整理了一个简单的 Excel 数据库 该数据库执行一些宏函数 并且我需要将此数据库分发给几个人 但他们无法看到宏函数实际上是如何
  • Linq 连接两个值

    假设我有一个列表 City State 它最初来自数据库 我有LocationID 但现在我将它加载到内存中 假设我还有一张快餐店表 其中记录了城市和州 我需要获取与城市和州相匹配的机构列表 注意 我尝试描述一个简化的场景 我的业务领域完全
  • Python(openpyxl):将数据从一个excel文件转移到另一个(模板文件)并用另一个名称保存,同时保留模板

    我有一个templateexcel 文件名为template xlsx其中有许多张 我想从单独的地方复制数据 csv文件到第一页template xlsx 命名为data 并将新文件另存为result xlsx同时保留原来的模板文件 我想粘
  • 当 URL 包含 ASP.Net Core 参数的“+”时出现 404 错误

    当参数包含编码为空格的空格时 我的服务器返回 404 错误 代替 20 我不明白为什么 路线的形式为 Route Search PRM1 prm1 PRM2 prm2 PRM3 prm3 我的第一个问题是如何让服务器理解这种 URL htt
  • 如何创建动态变量名VBA

    我正在尝试根据单元格中的值在 VBA 中创建动态数量的变量 本质上我想要的结果是这样的Team1 Team2 to TeamX 任何帮助是极大的赞赏 Dim i x As Integer Set x Range J4 Value Dim T
  • 在 Excel 中打印 MATLAB 图窗并调整其大小

    我在 MATLAB 中有两个带有手柄的图形hFig1 and hFig2 我想将它们打印到 Excel 中的特定单元格 单元格 E3 和 I3 并将它们重新调整为 2 英寸 x 3 英寸 我尝试过使用 AddPictures对象处理程序和使
  • Excel VBA 通过简单除法引发溢出错误

    Excel 2013 VBA 这段代码 Sub test On Error GoTo Err Dim p As Double p 362 100 2005 Exit Sub Err If Err Description lt gt And

随机推荐

  • SPARQL 查询在 Fuseki 中有效,但在 Jena TDB 中无效

    我将数据组织在多个图表中 保存三元组的图表很重要 数据结构很复杂 但可以简化如下 我的商店包含蛋糕 其中有不同蛋糕类型的层次结构 所有子类
  • linq where 子句和 count 导致 null 异常

    除非 p School SchoolName 结果为 null 否则下面的代码将起作用 在这种情况下 它会导致 NullReferenceException if ExistingUsers Where p gt p StudentID i
  • PHP 文件由浏览器下载,而不是由本地开发服务器(MAMP)处理

    一切都很顺利 直到我添加AddHandler application x httpd php5s php到本地服务器文档根目录中的 htaccess 文件 根据我正在使用的站点 我经常更改该文件 因为我访问时这样做了http 本地主机 88
  • jQuery 倒计时插件 - 只显示非零周期

    我正在使用 jQuery 倒计时插件编写倒计时 我只希望它显示活动 非零 周期 例如代替 剩余时间 0 天 0 小时 13 分 20 秒 它应该只显示 13 分 20 秒 我的代码是 countdown countdown expiryUr
  • Kubernetes 的艰难之路 - 如何设置节点不可调度

    我正在从头开始配置 Kubernetes 集群 原因 它是虚拟机内的本地设置 一切都很好 除了master节点被创建为可调度的 我尝试过分配master通过将所需参数传递给 kubelet 二进制文件来对节点进行标签和适当的污点 不能解决问
  • Android Wear Overlay 传递触摸事件

    我有一个 Android Wear 应用程序 其中我使用透明的覆盖视图来接收触摸事件 我需要能够接收屏幕上任何位置发生的所有触摸事件 并且还能够看到它们的坐标 我发现的所有研究都表明我无法接收所有触摸事件并将其传递 然而 and 都在做这样
  • Android 预安装检测

    我的 Android 应用程序将被预安装 我想继续跟踪预安装的应用程序 为此 我需要以某种方式保存密钥或标志 这意味着该应用程序是预安装的 我会将此密钥添加到后端的每个请求中并对其进行分析 我对此有疑问 有一个问题是关于从 Google P
  • Windows 上本机 C++ 应用程序中的自动死代码检测?

    背景 我有一个用原生 C 编写的应用程序 花了几年的时间 大约有 60 KLOC 有很多函数和类已经死了 可能有 10 15 就像下面提出的类似的基于 Unix 的问题 我们最近开始对所有新代码进行单元测试 并尽可能将其应用于修改后的代码
  • 使用 dateTimePicker 在 DataGridView 中编辑日期

    我有一个DateTime我的 WinForms 中的专栏DataGridView 目前只能通过手动输入日期来编辑该字段 例如 2010 09 02 需要什么才能拥有一个DateTimePicker 或同等 用作编辑器 DataGridVie
  • 在Python中通过sys.stdout写入unicode字符串

    暂时假设一个人无法使用print 从而享受自动编码检测的好处 所以这给我们留下了sys stdout 然而 sys stdout太蠢了不做任何合理的编码 http bugs python org issue4947 现在人们阅读 Pytho
  • 如何使用Android Invalidate()

    在我的主要活动中 我定义了两个视图和一个菜单 浏览次数 1 自定义视图游戏 2 按钮btn 菜单 1 打开项目用于打开文件 菜单布局在不同的活动中定义 基本上 当主活动启动时 它会绘制没有任何内容的自定义视图和按钮 然后我使用菜单中的 打开
  • 从 Qthread 更新 Python GUI 元素

    所以我知道有很多关于使用 Qthread 更新 GUI 中的元素的帖子 我尽了最大努力去检查这些 但仍然有一个问题 我正在尝试创建一个 GUI 该 GUI 在单击按钮时运行一个方法 然后该方法启动一个新线程 然后该线程向 GUI 发出信号以
  • 为什么我可以使用 tsql 连接到 Azure MS SQL,但不能使用 pymssql?

    我今天在哪里 TDSVER 7 3 tsql H example database windows net U me D ExampleDB p 1433 P notreallymypassword 这不会 gt gt gt import
  • Hudson 结帐卡在“git fetch”处

    我正在使用 git 版本 1 6 2 2 1669 g7eaf8 在 Hudson 1 314 上使用 Hudson Git 插件 0 7 3 当我触发构建时 Hudson 执行 git fetch 但它永远不会返回 我把一只卡在那里14天
  • 从 C# 调用时无法识别 Powershell 命令

    这是这个的延续Question https stackoverflow com questions 66280000 powershell object returns null 66280138 noredirect 1 comment1
  • Android studio 问题:找不到广告:AdQuality:未指定

    我已经更新了 Android studio 刚刚打开我的项目 我收到以下错误 您能让我知道如何解决这个问题吗 Error A problem occurred configuring project memoryGameCollection
  • 在 python 中使用 re.sub 将字母变成大写?

    在许多编程语言中 以下内容 find foo a z bar并替换为GOO U 1GAR 将导致整个匹配项变为大写 我似乎无法在 python 中找到等效项 它存在吗 您可以将函数传递给re sub http docs python org
  • 如何通过sparkSession向worker提交多个jar?

    我使用的是火花2 2 0 下面是我在 Spark 上使用的 java 代码片段 SparkSession spark SparkSession builder appName MySQL Connection master spark ip
  • 附加之前检查数据库中是否存在 ID

    我通过选择一个带有类别的数组json decode并将它们附加到文章中 public static function setArticleCategory Request request article Article where id r
  • 将许多表转换为 Excel 列

    我创建了用于文章审阅的网络应用程序 我有一个名为 Article 的表 每个表Article有一些ArticleReview Article ArticleId ArticleTitle NumberOfComment NumberOfVi