在Excel工作表中将表数据分组为列标题

时间:2018-11-14 18:36:58

标签: c# linq export-to-excel

我有一个问卷调查应用程序正在为我们的一个团队构建,并且在按他们的意愿制作报告时遇到了问题(如果可能的话)。我目前拥有的是:

var completedSurveys = (from s in db.SurveyResponses
                                    join d in db.Demographics on s.SurveyID equals d.SurveyID into grpjoin
                                    from d in grpjoin.DefaultIfEmpty()
                                    select new
                                    {
                                        Survey_ID = s.SurveyID,
                                        Survey_Date = s.Survey.SurveyDate,
                                        Question = s.Questions.QuestionTxt,
                                        Response = s.Responses.ResponseTxt,        
                                        Zip_Code = d.ZipCode,
                                        Department = d.CityDepartments.Department,
                                        Ace_Score = s.Survey.AceScore,

                                    }).ToList();

在运行gridview / excel代码后产生的结果:

My Current Excel Sheet

,他们想要的是一个Excel工作表,该工作表的“问题”列标题以及SurveyID,“日期”,“邮编”,“部门”和“分数”以及对问题的回答作为行数据,因此一切仅显示一次。像这样的excel表,我从其他地方得到的:

Example

例如,我尝试了多种不同的分组方式

    var completedSurveys = (from s in db.SurveyResponses
                            join d in db.Demographics on s.SurveyID equals d.SurveyID into grpjoin
                            from d in grpjoin.DefaultIfEmpty()
                            group new {s.Questions.QuestionTxt, s.Survey.SurveyDate } by new { s.SurveyID, s.Responses.ResponseTxt, d.ZipCode, d.CityDepartments.Department, s.Survey.AceScore } into g
                            orderby g.Key.SurveyID ascending
                            select new
                            {
                                Survey_ID = g.Key.SurveyID,
                                Survey_Date = g.Select(s => s.SurveyDate),
                                Response = g.Key.ResponseTxt,
                                Zip = g.Key.ZipCode,
                                Department = g.Key.Department,
                                Ace_Score = g.Key.AceScore

                            }).ToList();

但是我仍然没有得到想要的东西。如果我必须告诉他们我已经获得的一切都很好,那很好,但是我认为我至少会提出一些建议。任何帮助将不胜感激。

谢谢

1 个答案:

答案 0 :(得分:0)

您的问题中有几个未知数,但是如果问题的关键是“如何在c#中旋转数据”,那么我有个好消息和个坏消息。好消息是它是可行的。坏消息是它并不漂亮。

首先,您需要按SurveyId将“ completedSurveys”分组:

var groupedSurveys = 
    completedSurveys
    .GroupBy(g => g.Survey_ID);

然后创建一个您希望自己的行看起来像的类:

public class survey {
    public int Survey_ID;
    public DateTime date;
    public int Zip_Code;
    public int Ace_Score;
    public string Q1;
    public string Q2;
    public string Q3;   
}

然后,为此类对象创建一个主页:

var surveys = new List<survey>();

然后,在分组的调查中循环浏览分组。我们将其称为外循环。

在每个外部循环中:

  • 创建“调查”的新实例
  • 所有项目的通用数据将存在于第一项目中,因此您可以为此目的填充它。如果null成为您的障碍,那么您将必须在内部循环内执行适当的逻辑(如下所述)
  • 循环浏览分组中的各个项目(内部循环)
  • 在内部循环中,使用switch语句使用期望的问题文本将组中的项目映射到“调查”类中的相应字段。
  • 完成内部循环后,将调查实例推到调查主页。
  • 继续进行下一个外循环迭代

此示例代码如下:

foreach (var surveyItems in groupedSurveys) {

    var firstItem = surveyItems.FirstOrDefault();

    var survey = new survey() {
        Survey_ID = firstItem.Survey_ID,
        date = firstItem.Survey_Date,
        Zip_Code = firstItem.Zip_Code,
        Ace_Score = firstItem.Ace_Score
    };

    foreach(var item in surveyItems) {
        switch (item.Question) {
            case "Text for question 1":
                survey.Q1 = item.Response;
                break;
            case "Text for question 2":
                survey.Q2 = item.Response;
                break;
            case "Text for question 3":
                survey.Q3 = item.Response;
                break;
        }
    }

    surveys.Add(survey);

}

您将看到您的调查对象现在具有数据透视,每个调查都有一个“行”。

但是,这一切都不知道您的excel编写代码。将事物“标准化”并在此处进行解析可能更明智。您也可以考虑在服务器级别进行数据透视。数据透视语句可能会更友好一些。

此外,我不想切入您的逻辑来创建“ completedSurveys”。但是,只要您将其裁剪,就可以使它整体上看起来更优雅。