public static List <InternalExamScoreRecord> Select(IEnumerable <string> StudentIDs, UserOptions Options) { //key:CourseID Dictionary <string, JHCourseRecord> dictCourses = Utilities.GetCourseDict(Options.SchoolYear, Options.Semester); //key:AssessmentSetupID Dictionary <string, JHAEIncludeRecord> dictAEIncludes = Utilities.GetAEIncludeDict(dictCourses.Values.ToAssessmentSetupIDs(), Options.Exam); //類似學期成績的結構… Dictionary <string, InternalExamScoreRecord> dictStudentScores = new Dictionary <string, InternalExamScoreRecord>(); // 取得評量比例 Utilities.ScorePercentageHSDict = Utilities.GetScorePercentageHS(); #region 取得及轉換評量科目成績 int size = 200; int thread = 5; FunctionSpliter <string, JHSCETakeRecord> spliter = new FunctionSpliter <string, JHSCETakeRecord>(size, thread); spliter.Function = delegate(List <string> studentKeysPart) { return(JHSCETake.Select(null, studentKeysPart, new string[] { Options.Exam.ID }, null, null)); }; foreach (JHSCETakeRecord sce in spliter.Execute(StudentIDs.ToList())) { if (!dictCourses.ContainsKey(sce.RefCourseID)) { continue; //評量成績所屬課程非本學期,跳過 } if (Options.Exam.ID != sce.RefExamID) { continue; //評量成績的試別不符,跳過 } JHCourseRecord course = dictCourses[sce.RefCourseID]; if (!dictAEIncludes.ContainsKey(course.RefAssessmentSetupID)) { continue; //如果課程沒有評量設定,跳過 } JHAEIncludeRecord ae = dictAEIncludes[course.RefAssessmentSetupID]; //每個學生一個 InternalExamScoreRecord if (!dictStudentScores.ContainsKey(sce.RefStudentID)) { dictStudentScores.Add(sce.RefStudentID, new InternalExamScoreRecord(sce.RefStudentID)); } if (!dictStudentScores[sce.RefStudentID].Subjects.ContainsKey(course.Subject)) { SubjectScore subjectScore = new SubjectScore(); subjectScore.Domain = course.Domain; subjectScore.Subject = course.Subject; subjectScore.Period = course.Period; subjectScore.Credit = course.Credit; subjectScore.Score = Utilities.GetScore(new HC.JHSCETakeRecord(sce), new HC.JHAEIncludeRecord(ae), Options.ScoreSource); if (subjectScore.Score.HasValue) { dictStudentScores[sce.RefStudentID].Subjects.Add(course.Subject, subjectScore); } } } #endregion #region 計算評量領域成績 JHSchool.Evaluation.Calculation.ScoreCalculator defaultCalculator = new JHSchool.Evaluation.Calculation.ScoreCalculator(null); StudentScore.SetClassMapping(); List <StudentScore> Students = ToStudentScore(StudentIDs); Students.ReadCalculationRule(null); foreach (StudentScore student in Students) { student.SemestersScore.Add(SemesterData.Empty, new global::JHEvaluation.ScoreCalculation.ScoreStruct.SemesterScore(Options.SchoolYear, Options.Semester)); if (!dictStudentScores.ContainsKey(student.Id)) { continue; } global::JHEvaluation.ScoreCalculation.ScoreStruct.SemesterScore semesterScore = student.SemestersScore[SemesterData.Empty]; foreach (SubjectScore score in dictStudentScores[student.Id].Subjects.Values) { //科目成績偷偷進位 if (score.Score.HasValue) { if (student.CalculationRule != null) { score.Score = student.CalculationRule.ParseSubjectScore(score.Score.Value); } else { score.Score = defaultCalculator.ParseSubjectScore(score.Score.Value); } } if (!semesterScore.Subject.Contains(score.Subject)) { semesterScore.Subject.Add(score.Subject, new SemesterSubjectScore(score)); } } } Students.CalcuateDomainSemesterScore(new string[] { }); #endregion foreach (StudentScore student in Students) { if (!dictStudentScores.ContainsKey(student.Id)) { dictStudentScores.Add(student.Id, new InternalExamScoreRecord(student.Id)); } InternalExamScoreRecord examScore = dictStudentScores[student.Id]; examScore.Subjects = ToSubjects(student.SemestersScore[SemesterData.Empty].Subject); examScore.Domains = ToDomains(student.SemestersScore[SemesterData.Empty].Domain); } return(new List <InternalExamScoreRecord>(dictStudentScores.Values)); }
private void Worker_DoWork(object sender, DoWorkEventArgs e) { // 取得班級學生人數 Dictionary <string, int> ClassStudCount = new Dictionary <string, int>(); foreach (ClassExamScoreData cee in _data) { if (!ClassStudCount.ContainsKey(cee.Class.ID)) { ClassStudCount.Add(cee.Class.ID, cee.Students.Count); } } Workbook book = new Workbook(); Worksheet ws; int rowIndex = 0; Workbook template = new Workbook(); if (_data.Count > 30 || _UserSelectCount > 14) { book.Open(new MemoryStream(Resource1.班級評量成績平均比較表60)); ws = book.Worksheets[0]; template.Open(new MemoryStream(Resource1.班級評量成績平均比較表60)); } else { book.Open(new MemoryStream(Resource1.班級評量成績平均比較表)); ws = book.Worksheets[0]; template.Open(new MemoryStream(Resource1.班級評量成績平均比較表)); } Range all = template.Worksheets.GetRangeByName("All"); //Range printDate = template.Worksheets.GetRangeByName("PrintDate"); //printDate[0, 0].PutValue(DateTime.Today.ToString("yyyy/MM/dd")); Range title = template.Worksheets.GetRangeByName("Title"); //Range feedback = template.Worksheets.GetRangeByName("Feedback"); Range rowHeaders = template.Worksheets.GetRangeByName("RowHeaders"); Range columnHeaders = template.Worksheets.GetRangeByName("ColumnHeaders"); //Range rankColumnHeader = template.Worksheets.GetRangeByName("RankColumnHeader"); int RowNumber = all.RowCount; int DataRowNumber = rowHeaders.RowCount; //_data.Sort(delegate(ClassExamScoreData x, ClassExamScoreData y) //{ // return x.Class.Name.CompareTo(y.Class.Name); //}); int dataRowIndex = rowHeaders.FirstRow; List <string> headers = new List <string>(); Dictionary <string, int> colMapping = new Dictionary <string, int>(); foreach (ClassExamScoreData ced in _data) { //ws.Cells.CreateRange(rowIndex, RowNumber, false).Copy(all); //int classColIndex = 0; foreach (string courseID in ced.ValidCourseIDs) { JHCourseRecord course = _courseDict[courseID]; if (!headers.Contains(course.Subject)) { headers.Add(course.Subject); } #region comment //if (!colMapping.ContainsKey(GetTaggedDomain(course.Domain)) && _domains.Contains(course.Domain)) //{ // colMapping.Add(GetTaggedDomain(course.Domain), classColIndex); // ws.Cells[columnHeaders.FirstRow + rowIndex, columnHeaders.FirstColumn + classColIndex].PutValue(course.Domain); // ws.Cells[columnHeaders.FirstRow + rowIndex, columnHeaders.FirstColumn + classColIndex].Style.Font.IsBold = true; // classColIndex++; // ws.Cells[columnHeaders.FirstRow + rowIndex, columnHeaders.FirstColumn + classColIndex].PutValue("排序"); // classColIndex++; //} //if (!colMapping.ContainsKey(course.Subject)) //{ // colMapping.Add(course.Subject, classColIndex); // ws.Cells[columnHeaders.FirstRow + rowIndex, columnHeaders.FirstColumn + classColIndex].PutValue(course.Subject); // classColIndex++; // ws.Cells[columnHeaders.FirstRow + rowIndex, columnHeaders.FirstColumn + classColIndex].PutValue("排序"); // classColIndex++; //} #endregion } foreach (StudentRow row in ced.Rows.Values) { foreach (var sce in row.RawScoreList) { if (sce.RefExamID != _exam.ID) { continue; } JHCourseRecord course = _courseDict[sce.RefCourseID]; if (!headers.Contains(GetTaggedDomain(course.Domain))) { headers.Add(GetTaggedDomain(course.Domain)); } } } } #region 產生 Headers headers.Sort(Sort); int classColIndex = 0; foreach (string each in headers) { if (IsDomain(each)) { if (_domains.Contains(GetOriginalDomain(each))) { colMapping.Add(each, classColIndex); ws.Cells[columnHeaders.FirstRow + rowIndex, columnHeaders.FirstColumn + classColIndex].PutValue(GetOriginalDomain(each)); ws.Cells[columnHeaders.FirstRow + rowIndex, columnHeaders.FirstColumn + classColIndex].Style.Font.IsBold = true; classColIndex++; ws.Cells[columnHeaders.FirstRow + rowIndex, columnHeaders.FirstColumn + classColIndex].PutValue("排序"); classColIndex++; } } else { colMapping.Add(each, classColIndex); ws.Cells[columnHeaders.FirstRow + rowIndex, columnHeaders.FirstColumn + classColIndex].PutValue(each); classColIndex++; ws.Cells[columnHeaders.FirstRow + rowIndex, columnHeaders.FirstColumn + classColIndex].PutValue("排序"); classColIndex++; } } #endregion foreach (ClassExamScoreData ced in _data) { Dictionary <string, decimal?> subjectScores = new Dictionary <string, decimal?>(); Dictionary <string, int> subjectCount = new Dictionary <string, int>(); foreach (StudentRow row in ced.Rows.Values) { foreach (var sce in row.RawScoreList) { if (sce.RefExamID != _exam.ID) { continue; } JHCourseRecord course = _courseDict[sce.RefCourseID]; //if (!headers.Contains(GetTaggedDomain(course.Domain))) //{ // headers.Add(GetTaggedDomain(course.Domain)); //} //if (!colMapping.ContainsKey(GetTaggedDomain(course.Domain)) && _domains.Contains(course.Domain)) //{ // colMapping.Add(GetTaggedDomain(course.Domain), classColIndex); // //ws.Cells[columnHeaders.FirstRow + rowIndex, columnHeaders.FirstColumn + classColIndex].PutValue(course.Domain); // //ws.Cells[columnHeaders.FirstRow + rowIndex, columnHeaders.FirstColumn + classColIndex].Style.Font.IsBold = true; // classColIndex += 2; // //ws.Cells[columnHeaders.FirstRow + rowIndex, columnHeaders.FirstColumn + classColIndex].PutValue("排序"); // //classColIndex++; //} string ds = GetDomainSubjectKey(course.Domain, course.Subject); if (!subjectScores.ContainsKey(ds)) { subjectScores.Add(ds, 0); subjectCount.Add(ds, 0); } if (sce.Score.HasValue) { subjectCount[ds]++; decimal value = decimal.Zero; if (row.StudentScore.CalculationRule != null) { value = row.StudentScore.CalculationRule.ParseSubjectScore(sce.Score.Value); } else { value = _calc.ParseSubjectScore(sce.Score.Value); } subjectScores[ds] += value; } } } foreach (string ds in new List <string>(subjectScores.Keys)) { if (subjectScores[ds].HasValue && subjectCount[ds] > 0) { subjectScores[ds] = subjectScores[ds].Value / (decimal)subjectCount[ds]; } } Dictionary <string, decimal?> domainScores = new Dictionary <string, decimal?>(); Dictionary <string, int> domainCount = new Dictionary <string, int>(); foreach (string ds in subjectScores.Keys) { string domain = GetOnlyDomain(ds); if (!domainScores.ContainsKey(domain)) { domainScores.Add(domain, 0); domainCount.Add(domain, 0); } domainCount[domain]++; domainScores[domain] += subjectScores[ds]; } foreach (string domain in new List <string>(domainScores.Keys)) { if (domainScores[domain].HasValue && domainCount[domain] > 0) { domainScores[domain] = domainScores[domain].Value / (decimal)domainCount[domain]; } } #region 填入班級平均 //int rankIndex = rankColumnHeader.FirstColumn; // 班級平均 ClassCourseAvg cca = new ClassCourseAvg(); foreach (var stud in ced.Students) { if (ced.Rows.ContainsKey(stud.ID)) { //阿寶...這也許是地雷.... // 當學生不屬於任何班級跳過 if (stud.Class == null) { continue; } cca.ClassID = stud.Class.ID; cca.ClassName = stud.Class.Name; StudentRow srow = ced.Rows[stud.ID]; foreach (CourseScore cs in srow.CourseScoreList) { if (cs.Score.HasValue) { cca.ClassID = stud.Class.ID; cca.ClassName = stud.Class.Name; decimal value = decimal.Zero; if (srow.StudentScore.CalculationRule != null) { value = srow.StudentScore.CalculationRule.ParseSubjectScore(cs.Score.Value); } else { value = _calc.ParseSubjectScore(cs.Score.Value); } cca.AddSubjectScore(_courseDict[cs.CourseID].Subject, value); } //decimal? s = GetRoundScore(cs.Score); //if (s.HasValue) //{ // cca.ClassID = stud.Class.ID; // cca.ClassName = stud.Class.Name; // cca.AddCourseScore(cs.CourseID, s.Value); //} } } } // 班級名稱 ws.Cells[dataRowIndex, 0].PutValue(cca.ClassName); // 放班級人數 int peoColIdx = 32; // 找到人數放位置 for (int i = 32; i <= 60; i++) { if (ws.Cells[2, i].StringValue.Trim() == "人數") { peoColIdx = i; break; } } if (cca.ClassID != null && cca.ClassName != "") { if (ClassStudCount.ContainsKey(cca.ClassID)) { ws.Cells[dataRowIndex, peoColIdx].PutValue(ClassStudCount[cca.ClassID].ToString()); } } foreach (KeyValuePair <string, decimal?> val in cca.GetSubjectStudScoreAvg()) { if (val.Value.HasValue) { decimal value = Math.Round((decimal)val.Value, 2, MidpointRounding.AwayFromZero); ws.Cells[dataRowIndex, colMapping[val.Key] + 1].PutValue(value); } } //填入領域 bool domainHasData = false; foreach (string domain in _domains) { if (!domainScores.ContainsKey(domain)) { continue; } if (!domainScores[domain].HasValue) { continue; } string taggedDomain = GetTaggedDomain(domain); if (colMapping.ContainsKey(taggedDomain)) { decimal value = Math.Round((decimal)domainScores[domain].Value, 2, MidpointRounding.AwayFromZero); ws.Cells[dataRowIndex, colMapping[taggedDomain] + 1].PutValue(value); domainHasData = true; } } if (cca.GetSubjectStudScoreAvg().Count > 0 || domainHasData) { dataRowIndex++; } #endregion #region 填入標題及回條 //Ex. 新竹市立光華國民中學 97 學年度第 1 學期 第1次平時評量成績單 ws.Cells[title.FirstRow + rowIndex, title.FirstColumn].PutValue(string.Format("{0} {1} {2} 各班各科平均成績比較表", SchoolName, Semester, _exam.Name)); //Ex. 101 第1次平時評量回條 (家長意見欄) //ws.Cells[feedback.FirstRow + rowIndex, feedback.FirstColumn].PutValue(string.Format("{0} {1}回條 (家長意見欄)", ced.Class.Name, _exam.Name)); #endregion //rowIndex += RowNumber; //ws.HPageBreaks.Add(rowIndex, 0); } e.Result = book; }