Группировка табличных данных в виде заголовков столбцов на листе Excel - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть приложение для анкеты, которое я создаю для одной из наших команд, и у меня возникла проблема с составлением отчета так, как он хотел бы (если это вообще возможно). Что у меня сейчас есть:

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 выдает:

Мой текущий лист Excel

и что они хотели бы, так это лист Excel, в котором заголовки столбцов содержат Вопросы, а также SurveyID, Date, Zip, Department & Score с ответами на вопросы в виде данных строк, которые отображают все только один раз. Что-то вроде этого листа 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()
                            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 голосов
/ 15 ноября 2018

У вас есть несколько неизвестных в вашем вопросе, но если суть в том, "как вы сводите данные в c #", то у меня есть хорошие и плохие новости. Хорошей новостью является то, что это выполнимо. Плохая новость в том, что это не красиво.

Во-первых, вы хотите сгруппировать ваши "завершенные опросы" по surveyId:

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>();

Затем выполните цикл по группировкам в сгруппированных опросах. Мы назовем это внешним циклом.

В каждом внешнем цикле:

  • создать новый экземпляр «опроса»
  • общие данные для всех элементов будут существовать в первом элементе, так что вы можете просто заполнить их, используя для этой цели. Если на вашем пути появляются нулевые значения, вам придется выполнить соответствующую логику во внутреннем цикле (описано далее)
  • цикл по отдельным элементам в вашей группе (внутренний цикл)
  • во внутреннем цикле используйте оператор switch, чтобы сопоставить элемент в группе с соответствующим полем в классе «survey», используя ожидаемый текст вопроса.
  • когда закончите с внутренним циклом, переместите экземпляр опроса в дом опроса.
  • перейти к следующей итерации внешнего цикла

Пример кода для этого:

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. Возможно, было бы разумнее держать вещи "нормализованными" здесь и анализировать их там. Вы также можете рассмотреть возможность поворота на уровне сервера. Сводные заявления, вероятно, будут немного дружелюбнее.

Кроме того, я не хочу вдаваться в твою логику, чтобы создавать «завершенные обследования» Но достаточно сказать, что если вы порежете его, вы сможете сделать его более элегантным в целом.

...