protected override void PrepareDataComplete(Exception error) { RatingUtils.EnableControls(this); if (error != null) { MsgBox.Show(error.Message); return; } List <MultiScoreParser> parsers = SelectedSubjects.Keys.ToMultiScoreParsers(Tokens); List <RatingScope <RatingStudent> > scopes = ToScopes(); List <RatingStudent> sortedStudents; //分別排名。 foreach (RatingScope <RatingStudent> eachScope in scopes) { foreach (MultiScoreParser eachParser in parsers) { eachScope.Rank(eachParser, PlaceOptions.Unsequence); } } FilterParameter param = new FilterParameter(); if (rbAllRank.Checked) { param.Mode = FilterMode.None; } else if (rbTopRank.Checked) { param.Mode = FilterMode.Place; param.Top = int.Parse(txtTopRank.Text); } else if (rbPercentage.Checked) { param.Mode = FilterMode.Percentage; param.Top = int.Parse(txtPercentage.Text); } else { throw new ArgumentException("無此種過慮排名的方式。"); } if (rbAllRank.Checked) //如果是列出全部名次的話。 { new OutputSeparatePivot().Output(scopes, parsers.ToNameList()); //分別列出科目、名次(Pivot 列法)。 } else { new OutputSeparate().Output(scopes, parsers.ToNameList(), param); //分別列出科目、名次(非 Pivot 列法)。 } }
protected override void PrepareDataComplete(Exception error) { RatingUtils.EnableControls(this); if (error != null) { MsgBox.Show(error.Message); return; } CalculationScoreParser calcparser = rbCombine.Checked ? GetCalculationScoreParser() : null; List <ScoreParser> parsers = SelectedDomains.Keys.ToScoreParsers(ThisToken); List <RatingScope <RatingStudent> > scopes = ToScopes(); //分別排名。 foreach (RatingScope <RatingStudent> eachScope in scopes) { foreach (ScoreParser eachParser in parsers) { eachScope.Rank(eachParser, PlaceOptions.Unsequence); } } if (calcparser != null) { //運算排名。 foreach (RatingScope <RatingStudent> eachScope in scopes) { eachScope.Rank(calcparser, PlaceOptions.Unsequence); } } FilterParameter param = new FilterParameter(); if (rbAllRank.Checked) { param.Mode = FilterMode.None; } else if (rbTopRank.Checked) { param.Mode = FilterMode.Place; param.Top = int.Parse(txtTopRank.Text); } else if (rbPercentage.Checked) { param.Mode = FilterMode.Percentage; param.Top = int.Parse(txtPercentage.Text); } else { throw new ArgumentException("無此種過慮排名的方式。"); } if (rbSeparate.Checked) //分別排名。 { if (rbAllRank.Checked) //如果是列出全部名次的話。 { new OutputSeparatePivot().Output(scopes, parsers.ToNameList()); //分別列出科目、名次(Pivot 列法)。 } else { new OutputSeparate().Output(scopes, parsers.ToNameList(), param); //分別列出科目、名次(非 Pivot 列法)。 } } else { new OutputCalculationPivot().Output(scopes, parsers, calcparser.Name, param); //列出運算名次、運算前成績。 } }
/// <summary> /// /// </summary> /// <param name="scopes"></param> /// <param name="ratingNames">排名項目名稱,例:國文。</param> /// <param name="param"></param> internal void Output(List <RatingScope <RatingStudent> > scopes, List <string> ratingNames, FilterParameter filter) { Workbook book = new Workbook(); book.Worksheets.Clear(); Worksheet sheet = book.Worksheets[book.Worksheets.Add()]; int rowOffset = 0, columnOffset = 0; foreach (string field in new string[] { "班級 ", "座號", "姓名", "學號", "名稱", "分數", "排名" }) { sheet.Cells[0, columnOffset++].PutValue(field); } foreach (string eachRating in ratingNames) //每一種排名。 { foreach (RatingScope <RatingStudent> eachScope in scopes) //每一種範圍。 { RatingScope <RatingStudent> eachFiltered; if (filter.Mode == FilterMode.None) { eachFiltered = eachScope; } else if (filter.Mode == FilterMode.Place) { eachFiltered = eachScope.GetTopPlaces(eachRating, filter.Top); } else if (filter.Mode == FilterMode.Percentage) { eachFiltered = eachScope.GetTopPercentage(eachRating, filter.Top); } else { throw new ArgumentException("無此種取名次方式。"); } eachFiltered.Sort(new PlaceComparer(eachRating)); foreach (RatingStudent student in eachFiltered) { columnOffset = 0; rowOffset++; foreach (string field in new string[] { student.ClassName, student.SeatNo, student.Name, student.StudentNumber }) { sheet.Cells[rowOffset, columnOffset++].PutValue(field); } string score = "", level = ""; //去除 00 大絕招。 score = ((double)student.Places[eachRating].Score).ToString(); level = student.Places[eachRating].Level.ToString(); sheet.Cells[rowOffset, columnOffset++].PutValue(eachRating); sheet.Cells[rowOffset, columnOffset++].PutValue(score); sheet.Cells[rowOffset, columnOffset++].PutValue(level); } } } RatingUtils.Save(book, "分別排名結果.xls"); }
/// <summary> /// /// </summary> /// <param name="scopes"></param> /// <param name="originParsers"></param> /// <param name="rankName">排名項目名稱,例如:加權平均…</param> /// <param name="filter"></param> internal void Output(List <RatingScope <RatingStudent> > scopes, List <ScoreParser> originParsers, string rankName, FilterParameter filter) { Workbook book = new Workbook(); book.Worksheets.Clear(); Worksheet sheet = book.Worksheets[book.Worksheets.Add()]; int rowOffset = 0, columnOffset = 0; Dictionary <string, RatingStudent> dicstudents = new Dictionary <string, RatingStudent>(); foreach (RatingScope <RatingStudent> eachOrigin in scopes) { RatingScope <RatingStudent> eachFiltered; if (filter.Mode == FilterMode.None) { eachFiltered = eachOrigin; } else if (filter.Mode == FilterMode.Place) { eachFiltered = eachOrigin.GetTopPlaces(rankName, filter.Top); } else if (filter.Mode == FilterMode.Percentage) { eachFiltered = eachOrigin.GetTopPercentage(rankName, filter.Top); } else { throw new ArgumentException("無此種取名次方式。"); } foreach (RatingStudent eachStud in eachFiltered) { if (!dicstudents.ContainsKey(eachStud.Id)) { dicstudents.Add(eachStud.Id, eachStud); } } } List <RatingStudent> students = new List <RatingStudent>(dicstudents.Values); //排序學生資料。 students.Sort(new Comparison <RatingStudent>(RatingUtils.RatingStudentComparison)); foreach (string field in new string[] { "班級 ", "座號", "姓名", "學號" }) { sheet.Cells[0, columnOffset++].PutValue(field); } //列出原始成績的科目欄位。 foreach (ScoreParser field in originParsers) { sheet.Cells[0, columnOffset++].PutValue(field.Name); } sheet.Cells[0, columnOffset++].PutValue(rankName); //運算排名的名稱。 sheet.Cells[0, columnOffset++].PutValue("名次"); //運算排名的名次。 foreach (RatingStudent student in students) { columnOffset = 0; rowOffset++; foreach (string field in new string[] { student.ClassName, student.SeatNo, student.Name, student.StudentNumber }) { sheet.Cells[rowOffset, columnOffset++].PutValue(field); } //列出原始成績。 foreach (ScoreParser eachParser in originParsers) { decimal?originScore = eachParser.GetScore(student); if (originScore.HasValue) { sheet.Cells[rowOffset, columnOffset++].PutValue(((double)originScore).ToString()); } else { columnOffset++; } } string score = "", level = ""; if (student.Places.Contains(rankName)) { //去除 00 大絕招。 score = ((double)student.Places[rankName].Score).ToString(); level = student.Places[rankName].Level.ToString(); } sheet.Cells[rowOffset, columnOffset++].PutValue(score); sheet.Cells[rowOffset, columnOffset++].PutValue(level); } RatingUtils.Save(book, "運算排名結果.xls"); }