public static Semester Last()
        {
            try
            {
                Semester item = null;

                using (Entities db = new Entities())
                {
                    SemesterData row = db.SemesterData
                                       .Where(x => x.DeleteDate == null)
                                       .OrderByDescending(x => x.InitialDate)
                                       .FirstOrDefault();

                    if (row == null)
                    {
                        throw new Exception("Semestre não encontrado");
                    }

                    item = Convert(row);
                }

                return(item);
            }
            catch (Exception e)
            {
                string notes = string.Format("Erro: {0}", e.Message);
                Log.Add(Log.TYPE_ERROR, "SistemaMatricula.DAO.SemesterDAO.Last", notes);
            }

            return(null);
        }
        //Updates the results list with the sections pertaining to the current query
        private void RetrieveItems()
        {
            //Clear existing results
            results.Clear();

            //If a selection filter is active
            if (selectedSemester.Year != -1)
            {
                //For each section
                foreach (Section result in RegistrationEntities.Sections.ToList())
                {
                    //Attempt to parse the semester string
                    SemesterData semester = ReadSemester(result.Semester);

                    //If format is valid
                    if (semester.Year != -1)
                    {
                        //If filtering condition passed
                        if (FilterSemester(semester))
                        {
                            //Add to list
                            results.Add(result);
                        }
                    }
                }
            }
            else
            {
                //No filter active
                results = RegistrationEntities.Sections.ToList();
            }
        }
        //Converts the given semester string into a semester data struct
        //Assumed form: <type>, <year>
        //This may need to be changed upon integration
        private SemesterData ReadSemester(string semesterString)
        {
            //The result
            SemesterData data = new SemesterData();

            //Initialize result with sentinel values
            data.Year = -1;
            data.Type = SEMESTER_TYPE.FALL;

            //Parse given string
            string[] splitResults = semesterString.Split(',');

            //Verify split length
            if (splitResults.Length != 2)
            {
                //Return error data
                return(data);
            }

            //Get trimmed values
            string typeString = splitResults[0].Trim();
            string yearString = splitResults[1].Trim();

            //Convert type
            switch (typeString.ToUpper())
            {
            case "FALL":

                data.Type = SEMESTER_TYPE.FALL;
                break;

            case "WINTER":

                data.Type = SEMESTER_TYPE.WINTER;
                break;

            case "SUMMER":

                data.Type = SEMESTER_TYPE.SUMMER;
                break;

            default:

                //Return error data
                return(data);
            }

            //Convert year
            try
            {
                data.Year = Convert.ToInt32(yearString);
            } catch (Exception e)
            {
                //Return error data
                return(data);
            }

            //Return the properly formatted semester data
            return(data);
        }
示例#4
0
            public HistoryUtil(JHSemesterHistoryRecord historyRecord)
            {
                _sems = new SemesterDataCollection();

                foreach (SemesterHistoryItem item in historyRecord.SemesterHistoryItems)
                {
                    _sems.Add(new SemesterData(item.GradeYear, item.SchoolYear, item.Semester));
                }

                _sems = _sems.GetGradeYearSemester();

                SemesterData last   = SemesterData.Empty;
                bool         delete = false;

                foreach (SemesterData sem in _sems)
                {
                    if (sem.GradeYear == 3 && sem.Semester == 2)
                    {
                        last   = sem;
                        delete = true;
                    }
                }
                if (delete)
                {
                    _sems.Remove(last);
                }
            }
        public static Semester Find(Guid id)
        {
            try
            {
                if (id == null || Equals(id, Guid.Empty))
                {
                    throw new Exception("Parâmetro inválido");
                }

                Semester item = null;

                using (Entities db = new Entities())
                {
                    SemesterData row = db.SemesterData.FirstOrDefault(x => x.IdSemester == id);

                    if (row == null)
                    {
                        throw new Exception("Semestre não encontrado");
                    }

                    item = Convert(row);
                }

                return(item);
            }
            catch (Exception e)
            {
                string notes = LogHelper.Notes(id, e.Message);
                Log.Add(Log.TYPE_ERROR, "SistemaMatricula.DAO.SemesterDAO.Find", notes);
            }

            return(null);
        }
示例#6
0
        public decimal?GetScore(ReportStudent student)
        {
            SemesterScore score = null;

            foreach (SemesterData each in student.SHistory.GetGradeYearSemester())
            {
                SemesterData gysemester = new SemesterData(each.GradeYear, 0, each.Semester);
                if (gysemester == Semester)
                {
                    SemesterData sd = new SemesterData(0, each.SchoolYear, each.Semester);

                    if (student.SemestersScore.Contains(sd))
                    {
                        score = student.SemestersScore[sd];
                    }

                    break;
                }
            }

            if (score == null)
            {
                return(null);
            }
            else
            {
                return(score.LearnDomainScore);
            }
        }
        public static bool Delete(Guid id)
        {
            try
            {
                if (id == null || Equals(id, Guid.Empty))
                {
                    throw new Exception("Parâmetro inválido");
                }

                using (Entities db = new Entities())
                {
                    SemesterData row = db.SemesterData.FirstOrDefault(x => x.IdSemester == id);

                    if (row == null)
                    {
                        throw new Exception("Semestre não encontrado");
                    }

                    row.DeleteDate = DateTime.Now;
                    row.DeleteBy   = User.Logged.IdUser;

                    db.SaveChanges();
                }

                return(true);
            }
            catch (Exception e)
            {
                string notes = LogHelper.Notes(id, e.Message);
                Log.Add(Log.TYPE_ERROR, "SistemaMatricula.DAO.SemesterDAO.Delete", notes);
            }

            return(false);
        }
        public static bool Update(Semester item)
        {
            try
            {
                if (item == null)
                {
                    throw new Exception("Parâmetro vazio");
                }

                using (Entities db = new Entities())
                {
                    SemesterData row = db.SemesterData.FirstOrDefault(x => x.IdSemester == item.IdSemester);

                    if (row == null)
                    {
                        throw new Exception("Semestre não encontrado");
                    }

                    row.InitialDate = item.InitialDate;
                    row.Period      = item.Period;

                    db.SaveChanges();
                }

                return(true);
            }
            catch (Exception e)
            {
                string notes = LogHelper.Notes(item, e.Message);
                Log.Add(Log.TYPE_ERROR, "SistemaMatricula.DAO.SemesterDAO.Update", notes);
            }

            return(false);
        }
        public static bool Add(Semester item)
        {
            try
            {
                if (item == null)
                {
                    throw new Exception("Parâmetro vazio");
                }

                SemesterData row = new SemesterData
                {
                    IdSemester   = Guid.NewGuid(),
                    Period       = item.Period,
                    InitialDate  = item.InitialDate,
                    RegisterDate = DateTime.Now,
                    RegisterBy   = User.Logged.IdUser
                };

                using (Entities db = new Entities())
                {
                    db.SemesterData.Add(row);
                    db.SaveChanges();
                }

                return(true);
            }
            catch (Exception e)
            {
                string notes = LogHelper.Notes(item, e.Message);
                Log.Add(Log.TYPE_ERROR, "SistemaMatricula.DAO.SemesterDAO.Add", notes);
            }

            return(false);
        }
示例#10
0
 public bool Add(SemesterData semester, K12.Data.DomainScore domain)
 {
     if (!_scores.ContainsKey(semester))
     {
         _scores.Add(semester, new ScoreData("" + domain.Period, "" + domain.Credit, "" + domain.Score));
         return(true);
     }
     return(false);
 }
示例#11
0
        public bool Add(SemesterData semester, int count)
        {
            if (!_items.ContainsKey(semester))
            {
                _items.Add(semester, 0);
            }
            _items[semester] += count;

            return(true);
        }
示例#12
0
 public bool Add(SemesterData semester, string text)
 {
     if (!_items.ContainsKey(semester))
     {
         _items.Add(semester, text);
         return(true);
     }
     else
     {
         return(false);
     }
 }
示例#13
0
 /// <summary>
 /// 檢驗學期資訊是否存在
 /// </summary>
 /// <param name="schoolYear">學年度</param>
 /// <param name="semester">學期</param>
 /// <returns></returns>
 public bool ExistBySchoolYear(int schoolYear, int semester)
 {
     foreach (var sem in _sems)
     {
         if (sem.SchoolYear == schoolYear && sem.Semester == semester)
         {
             this.SemesterData = sem;
             return(true);
         }
     }
     return(false);
 }
示例#14
0
 public bool Add(SemesterData semester, K12.Data.SubjectScore subject)
 {
     if (!_subjectScores.ContainsKey(subject.Subject))
     {
         _subjectScores.Add(subject.Subject, new Dictionary <SemesterData, ScoreData>());
     }
     if (!_subjectScores[subject.Subject].ContainsKey(semester))
     {
         _subjectScores[subject.Subject].Add(semester, new ScoreData("" + subject.Period, "" + subject.Credit, "" + subject.Score));
         return(true);
     }
     return(false);
 }
示例#15
0
        /// <summary>
        /// 取得學生服務學習時數。
        /// </summary>
        public static void FillServiceLearning(this List <StudentExcess> students)
        {
            //資料表:K12.Service.Learning.Record
            if (students == null || students.Count <= 0)
            {
                return;
            }

            string sql = @"select ref_student_id, school_year, semester, sum(hours) hours
                                        from $k12.service.learning.record 
                                        where ref_student_id in ({0}) and not school_year is null and not semester is null
                                        group by ref_student_id,school_year,semester 
                                        order by ref_student_id, school_year, semester";

            sql = string.Format(sql, students.ToPrimaryKeyStringList());

            DataTable table = Utility.Q.Select(sql);

            //服務學期資料 Lookup
            //Dictionary<string, StudentExcess> StudentLookup = students.ToDictionary(x => x.StudentID);

            Dictionary <string, StudentExcess> StudentLookup = new Dictionary <string, StudentExcess>();

            foreach (StudentExcess data in students)
            {
                if (!StudentLookup.ContainsKey(data.StudentID))
                {
                    StudentLookup.Add(data.StudentID, data);
                }
            }

            foreach (DataRow row in table.Rows)
            {
                string  id    = row["ref_student_id"] + "";
                int     syear = int.Parse(row["school_year"] + "");
                int     sems  = int.Parse(row["semester"] + "");
                decimal hours = decimal.Parse(row["hours"] + "");

                if (!StudentLookup.ContainsKey(id))
                {
                    continue;
                }

                StudentExcess se = StudentLookup[id];
                SemesterData  sd = new SemesterData(0, syear, sems);

                se.ServiceLearning[sd] = hours;
            }
        }
        public decimal?GetScore(ReportStudent student)
        {
            SemesterScore score = null;

            foreach (SemesterData each in student.SHistory.GetGradeYearSemester())
            {
                //// 處理轉入生之前不列入排名
                //if (student.LastEnterSchoolyear.HasValue && student.LastEnterSemester.HasValue && student.LastEnterGradeYear.HasValue)
                //{
                //    if (each.SchoolYear < student.LastEnterSchoolyear.Value)
                //        continue;
                //    else
                //    {
                //        if (each.SchoolYear == student.LastEnterSchoolyear.Value && each.Semester < student.LastEnterSemester.Value)
                //            continue;
                //    }

                //}

                SemesterData gysemester = new SemesterData(each.GradeYear, 0, each.Semester);
                if (gysemester == Semester)
                {
                    SemesterData sd = new SemesterData(0, each.SchoolYear, each.Semester);

                    if (student.SemestersScore.Contains(sd))
                    {
                        score = student.SemestersScore[sd];
                    }

                    break;
                }
            }

            if (score == null)
            {
                return(0);
            }
            else
            if (score.LearnDomainScore.HasValue)
            {
                return(Math.Round(score.LearnDomainScore.Value, 2, MidpointRounding.AwayFromZero));     // 小數下第3位四捨五入
            }
            else
            {
                return(0);
            }
        }
示例#17
0
        public static void FillDomainScore(this List <StudentExcess> students)
        {
            //資料表:ischool_student_fitness
            if (students == null || students.Count <= 0)
            {
                return;
            }

            string sql = @"select ref_student_id,school_year,semester,score_info
                                        from sems_subj_score
                                        where ref_student_id in({0})
                                        order by school_year, semester";

            sql = string.Format(sql, students.ToPrimaryKeyStringList());
            DataTable table = Utility.Q.Select(sql);

            //  Dictionary<string, StudentExcess> StudentLookup = students.ToDictionary(x => x.StudentID);

            Dictionary <string, StudentExcess> StudentLookup = new Dictionary <string, StudentExcess>();

            foreach (StudentExcess data in students)
            {
                if (!StudentLookup.ContainsKey(data.StudentID))
                {
                    StudentLookup.Add(data.StudentID, data);
                }
            }

            foreach (DataRow row in table.Rows)
            {
                string id          = row["ref_student_id"] + "";
                int    school_year = int.Parse(row["school_year"] + "");
                int    semester    = int.Parse(row["semester"] + "");
                string score_info  = row["score_info"] + "";

                if (!StudentLookup.ContainsKey(id))
                {
                    continue;
                }

                StudentExcess stu = StudentLookup[id];
                SemesterData  sd  = new SemesterData(0, school_year, semester);
                DomainScore   ds  = ParseDomainScore(score_info);

                stu.DomainScore[sd] = ds;
            }
        }
示例#18
0
        internal void Add(SemesterData semester, string text)
        {
            if (!_texts.ContainsKey(semester))
            {
                _texts.Add(semester, string.Empty);
            }

            if (!string.IsNullOrEmpty(text))
            {
                text = text.Replace('>', ':').Replace('<', ',');
                if (text.StartsWith(","))
                {
                    text = text.Substring(1);
                }
                _texts[semester] = text;
            }
        }
示例#19
0
        /// <summary>
        /// 取得學生幹部資料計數。
        /// </summary>
        public static void FillCadre(this List <StudentExcess> students)
        {
            //資料表:K12.Service.Learning.Record
            if (students == null || students.Count <= 0)
            {
                return;
            }

            string sql = @"select ref_student_id,school_year,semester,count(id) as count 
                                        from discipline where ref_student_id in({0}) and reason like '%[幹部]%' 
                                        group by ref_student_id,school_year,semester";

            sql = string.Format(sql, students.ToPrimaryKeyStringList());
            DataTable table = Utility.Q.Select(sql);

//            Dictionary<string, StudentExcess> StudentLookup = students.ToDictionary(x => x.StudentID);

            Dictionary <string, StudentExcess> StudentLookup = new Dictionary <string, StudentExcess>();

            foreach (StudentExcess data in students)
            {
                if (!StudentLookup.ContainsKey(data.StudentID))
                {
                    StudentLookup.Add(data.StudentID, data);
                }
            }


            foreach (DataRow row in table.Rows)
            {
                string id    = row["ref_student_id"].ToString();
                int    sy    = int.Parse(row["school_year"].ToString());
                int    ss    = int.Parse(row["semester"].ToString());
                int    count = int.Parse(row["count"].ToString());

                if (!StudentLookup.ContainsKey(id))
                {
                    continue;
                }

                StudentExcess stu = StudentLookup[id];
                SemesterData  sd  = new SemesterData(0, sy, ss);

                stu.Cadre[sd] = count;
            }
        }
        public static Semester Convert(SemesterData item)
        {
            if (item == null)
            {
                return(null);
            }

            return(new Semester
            {
                IdSemester = item.IdSemester,
                Period = item.Period,
                InitialDate = item.InitialDate,
                RegisterDate = item.RegisterDate,
                RegisterBy = item.RegisterBy,
                DeleteDate = item.DeleteDate,
                DeleteBy = item.DeleteBy
            });
        }
        public List <StudentScore> Valid()
        {
            List <StudentScore> noValid = new List <StudentScore>();

            foreach (StudentScore student in Students)
            {
                foreach (SemesterData sems in student.SHistory.GetGradeYearSemester())
                {
                    SemesterData sd = new SemesterData(0, sems.SchoolYear, sems.Semester);
                    if (!student.SemestersScore.Contains(sd)) //只要不包含該學期的學期成績,表示資料不完整。
                    {
                        noValid.Add(student);
                        break;
                    }
                }
            }

            return(noValid);
        }
示例#22
0
        public async Task <List <SemesterData> > GetResult(string userId)
        {
            var allSemesters = new List <SemesterData>();
            var res          = await _db.StudentCourses.Include(x => x.Course)
                               .ThenInclude(x => x.Semester)
                               .Where(x => x.Student.Id == userId)
                               .ToListAsync();

            var grouped = res.GroupBy(x => x.Course.Semester.Id).ToList();

            foreach (var courseData in grouped)
            {
                var semesterData = courseData.FirstOrDefault().Course.Semester;
                var data         = new SemesterData(semesterData, courseData.ToList());
                if (data.SemesterGPA > 0)
                {
                    allSemesters.Add(data);
                }
            }
            return(allSemesters.OrderBy(x => x.StartsOn).ToList());
        }
示例#23
0
        public IActionResult GetStudents(string id)
        {
            //var list = new List<Student>();
            var list = new List <SemesterData>();

            id = "1234";

            using (var client = new SqlConnection("Data Source=db-mssql;Initial Catalog=s18923;Integrated Security=True"))
                using (var com = new SqlCommand())
                {
                    com.Connection = client;
                    //com.CommandText = "select * from Student where indexNumber = @id";
                    com.CommandText = @"select s.IndexNumber, s.FirstName, s.LastName, st.Name, e.Semester, e.StartDate 
                        from Student s join Enrollment e on s.IdEnrollment = e.IdEnrollment join Studies st on e.IdStudy = st.IdStudy
                        where s.IndexNumber = @id ";
                    //var idParametr = new SqlParameter("id", SqlDbType.VarChar);
                    //idParametr.Value = id;
                    //com.Parameters.Add(idParametr);
                    com.Parameters.AddWithValue("id", id);

                    client.Open();
                    var dr = com.ExecuteReader();
                    while (dr.Read())
                    {
                        //var st = new Student();

                        var sd = new SemesterData();
                        sd.IndexNumber = dr["IndexNumber"].ToString();
                        sd.FirstName   = dr["FirstName"].ToString();
                        sd.LastName    = dr["LastName"].ToString();
                        sd.Name        = dr["Name"].ToString();
                        sd.StartDate   = (DateTime)dr["StartDate"];
                        sd.Semester    = (int)dr["Semester"];
                        list.Add(sd);
                    }
                }


            return(Ok(list));
        }
        private void refreshButton_Click(object sender, EventArgs e)
        {
            //Reset error text
            errorLabel.Visible = false;
            errorLabel.Text    = "";

            //The new selected semester
            SemesterData newSelectedSemester;

            //Get semester type
            newSelectedSemester.Type = (SEMESTER_TYPE)semesterComboBox.SelectedIndex;

            try
            {
                //Get year
                newSelectedSemester.Year = Convert.ToInt32(yearTextBox.Text);

                //Set selected semester
                selectedSemester = newSelectedSemester;

                //If the given year is positive
                if (newSelectedSemester.Year > 0)
                {
                    //Update results
                    RetrieveItems();
                    PopulateListview();
                }
                else
                {
                    //Set error text
                    errorLabel.Text    = "Must enter a positive year.";
                    errorLabel.Visible = true;
                }
            } catch (Exception exception)
            {
                //Set error text
                errorLabel.Text    = "Must enter a numeric year.";
                errorLabel.Visible = true;
            }
        }
        //Initialization
        private void SectionFilteringForm_Load(object sender, EventArgs e)
        {
            //Initialize listview
            filteredResultsListView.FullRowSelect = true;

            //Initialize combo box
            semesterComboBox.Items.Add("Fall");
            semesterComboBox.Items.Add("Winter");
            semesterComboBox.Items.Add("Summer");
            semesterComboBox.SelectedIndex = 0;

            //Hide error text
            errorLabel.Visible = false;

            //Initialize collumns
            resultsColumns = new List <Tuple <string, int> >()
            {
                new Tuple <string, int>("Id", 50),
                new Tuple <string, int>("Course ID", 150),
                new Tuple <string, int>("Faculty ID", 150),
                new Tuple <string, int>("Day", 100),
                new Tuple <string, int>("Time", 100),
                new Tuple <string, int>("Semester", 200)
            };

            //Initialize results list
            results = new List <Section>();

            //Select the current semester
            selectedSemester = new SemesterData()
            {
                Year = -1, Type = SEMESTER_TYPE.FALL
            };

            //Retrieve initial query
            RetrieveItems();

            //Populate list view with query results
            PopulateListview();
        }
示例#26
0
        /// <summary>
        /// 將重讀的處理掉,以最新學期為主。
        /// </summary>
        /// <param name="studentId"></param>
        /// <returns></returns>
        private List <SemesterData> DistinctSemester(string studentId)
        {
            List <SemesterData> semesters = new List <SemesterData>();

            //將所有學期歷程先放入 semesters 清單。
            foreach (KeyValuePair <int, Dictionary <int, SemesterHistoryItem> > sy in Histories[studentId])
            {
                int sYear = sy.Key;
                foreach (KeyValuePair <int, SemesterHistoryItem> ss in sy.Value)
                {
                    int sSems     = ss.Key;
                    int gradeYear = ss.Value.GradeYear;

                    semesters.Add(new SemesterData(gradeYear, sYear, sSems));
                }
            }

            //去掉重讀的。
            List <SemesterData> distinct = SemesterData.DistinctGradeYear(semesters.ToArray()).ToList();

            return(distinct);
        }
示例#27
0
 /// <summary>
 /// 取得各領域成績
 /// </summary>
 /// <param name="sem"></param>
 /// <returns></returns>
 public List <decimal?> GetScoreList(SemesterData sem)
 {
     if (_scores.ContainsKey(sem))
     {
         List <decimal?> scoreList = new List <decimal?>();
         foreach (string domain in Global.GetDomains())
         {
             decimal?score = null;
             if (_scores[sem].Domains.ContainsKey(domain))
             {
                 DomainScore domainScore = _scores[sem].Domains[domain];
                 score = domainScore.Score;
             }
             scoreList.Add(score);
         }
         return(scoreList);
     }
     else
     {
         return(new List <decimal?>());
     }
 }
        public void Read()
        {
            List <JHSemesterScoreRecord> SemesterScores = ReadSemesterScore();

            //將每位學生的資料清除。
            foreach (StudentScore each in Students.Values)
            {
                each.SemestersScore.Clear();
            }

            //將有資料的學生填上資料。
            foreach (JHSemesterScoreRecord semsscore in SemesterScores)
            {
                if (!Students.ContainsKey(semsscore.RefStudentID))
                {
                    continue;
                }
                StudentScore student = Students[semsscore.RefStudentID];

                SemesterData sd = new SemesterData(0, semsscore.SchoolYear, semsscore.Semester);
                student.SemestersScore.Add(sd, new SCSemsScore(semsscore));
            }
        }
示例#29
0
        /// <summary>
        /// 判斷是否有該學生的學期歷程。
        /// </summary>
        /// <param name="studentId"></param>
        /// <param name="schoolYear"></param>
        /// <param name="semester"></param>
        /// <returns></returns>
        public bool Contains(string studentId, int schoolYear, int semester)
        {
            if (Histories.ContainsKey(studentId))
            {
                List <SemesterData> distinct = DistinctSemester(studentId);

                SemesterData found = distinct.Find(sd =>
                {
                    if (sd.SchoolYear == schoolYear && sd.Semester == semester)
                    {
                        return(true);
                    }
                    else
                    {
                        return(false);
                    }
                });

                return(found != new SemesterData());
            }

            return(false);
        }
示例#30
0
        public void Add(JHSemesterScoreRecord record)
        {
            SemesterData semester = new SemesterData("" + record.SchoolYear, "" + record.Semester);

            //foreach (K12.Data.SubjectScore subject in record.Subjects.Values)
            //{
            //if (!_config.ContainsKey(subject.Domain)) continue;

            //if (!_config[subject.Domain].Contains(subject.Subject)) continue;
            //else
            //{
            //    if (!_removeDomains.Contains(subject.Domain))
            //        _removeDomains.Add(subject.Domain);
            //}

            //    if (!_domains.ContainsKey(subject.Subject))
            //        _domains.Add(subject.Subject, new DomainText(subject.Subject));

            //    DomainText text = _domains[subject.Subject];
            //    text.Add(semester, subject.Text);
            //}

            foreach (K12.Data.DomainScore domain in record.Domains.Values)
            {
                //if (!_config.ContainsKey(domain.Domain)) continue;
                //if (_removeDomains.Contains(domain.Domain)) continue;

                if (!_domains.ContainsKey(domain.Domain))
                {
                    _domains.Add(domain.Domain, new DomainText(domain.Domain));
                }

                DomainText text = _domains[domain.Domain];
                text.Add(semester, domain.Text);
            }
        }
        public bool Add(SemesterData semester, int count)
        {
            if (!_items.ContainsKey(semester))
                _items.Add(semester, 0);
            _items[semester] += count;

            return true;
        }
        private void ProcessMoralScore(List<AutoSummaryRecord> autoSummaryList)
        {
            Dictionary<string, MoralItemRow> items = new Dictionary<string, MoralItemRow>();

            //團體活動
            MoralItemRow groupActivityRow = null;

            //公共服務
            MoralItemRow publicServiceRow = null;

            //校內外特殊表現
            MoralItemRow schoolSpecialRow = null;
            //具體建議
            MoralItemRow recommendRow = null;

            #region 建立適合列印的資料結構
            foreach (AutoSummaryRecord asRecord in autoSummaryList)
            {
                if (asRecord.MoralScore == null) continue;
                JHMoralScoreRecord record = asRecord.MoralScore;
                SemesterData semester = new SemesterData("" + record.SchoolYear, "" + record.Semester);

                XmlElement dailyBehavior = (XmlElement)record.TextScore.SelectSingleNode("DailyBehavior");
                if (dailyBehavior != null)
                {
                    foreach (XmlElement item in dailyBehavior.SelectNodes("Item"))
                    {
                        string name = item.GetAttribute("Name");
                        string index = item.GetAttribute("Index");
                        string degree = item.GetAttribute("Degree");

                        string[] lines = index.Split(new string[] { ";", ";" }, StringSplitOptions.RemoveEmptyEntries);

                        if (!items.ContainsKey(name))
                            items.Add(name, new MoralItemRow(lines));

                        items[name].Add(semester, degree);
                    }
                }

                XmlElement dailyLifeRecommend = (XmlElement)record.TextScore.SelectSingleNode("DailyLifeRecommend");
                if (dailyLifeRecommend != null)
                {
                    string GroupName = "";
                    if (Utility.MorItemDict.ContainsKey("DailyLifeRecommend"))
                        GroupName = Utility.MorItemDict["DailyLifeRecommend"];

                    if (recommendRow == null)
                        recommendRow = new MoralItemRow(new string[] { GroupName });
                    recommendRow.Add(semester, dailyLifeRecommend.GetAttribute("Description"));
                }

                // 團體活動
                XmlElement groupActivity = (XmlElement)record.TextScore.SelectSingleNode("GroupActivity");
                if (groupActivity != null)
                {
                    string GroupName = "";
                    if (Utility.MorItemDict.ContainsKey("GroupActivity"))
                        GroupName = Utility.MorItemDict["GroupActivity"];

                    if (groupActivityRow == null)
                        groupActivityRow = new MoralItemRow(new string[] { GroupName });

                    string text = string.Empty;
                    
                    foreach (XmlElement item in groupActivity.SelectNodes("Item"))
                    {
                        string degree = item.GetAttribute("Degree");
                        string desc = item.GetAttribute("Description");
                        string name = item.GetAttribute("Name");

                        if (string.IsNullOrEmpty(degree) && string.IsNullOrEmpty(desc)) continue;

                        string line = name + ":" + (string.IsNullOrEmpty(degree) ? "" : degree + "/") + (string.IsNullOrEmpty(desc) ? "" : desc);
                        if (line.EndsWith("/")) line = line.Substring(0, line.Length - 1);
                        text += line;
                    }
                    
                    // 加入社團
                    if (_assnScoreCache.ContainsKey(record.RefStudentID))
                    {
                        string sc = record.SchoolYear.ToString();
                        string ss = record.Semester.ToString();
                        foreach (AssnScore asc in _assnScoreCache[record.RefStudentID])
                        {
                            if (asc.SchoolYear == sc && asc.Semester == ss)
                                text += "社團活動:" + asc.Score + "," + asc.Effort +"/"+ asc.Text;
                        }
                    
                    }
                    groupActivityRow.Add(semester, text);
                }



                XmlElement publicService = (XmlElement)record.TextScore.SelectSingleNode("PublicService");
                if (publicService != null)
                {
                    string GroupName = "";
                    if (Utility.MorItemDict.ContainsKey("PublicService"))
                        GroupName = Utility.MorItemDict["PublicService"];

                    if (publicServiceRow == null)
                        publicServiceRow = new MoralItemRow(new string[] { GroupName });

                    string text = string.Empty;

                    foreach (XmlElement item in publicService.SelectNodes("Item"))
                    {
                        string degree = item.GetAttribute("Degree");
                        string desc = item.GetAttribute("Description");
                        string name = item.GetAttribute("Name");

                        if (string.IsNullOrEmpty(degree) && string.IsNullOrEmpty(desc)) continue;

                        string line = name + ":" + (string.IsNullOrEmpty(degree) ? "" : degree + "/") + (string.IsNullOrEmpty(desc) ? "" : desc);
                        if (line.EndsWith("/")) line = line.Substring(0, line.Length - 1);
                        text += line;
                    }

                    publicServiceRow.Add(semester, text);
                }

                XmlElement schoolSpecial = (XmlElement)record.TextScore.SelectSingleNode("SchoolSpecial");
                if (schoolSpecial != null)
                {
                    string GroupName = "";
                    if (Utility.MorItemDict.ContainsKey("SchoolSpecial"))
                        GroupName = Utility.MorItemDict["SchoolSpecial"];

                    if (schoolSpecialRow == null)
                        schoolSpecialRow = new MoralItemRow(new string[] { GroupName });

                    string text = string.Empty;

                    foreach (XmlElement item in schoolSpecial.SelectNodes("Item"))
                    {
                        string degree = item.GetAttribute("Degree");
                        string desc = item.GetAttribute("Description");
                        string name = item.GetAttribute("Name");

                        if (string.IsNullOrEmpty(degree) && string.IsNullOrEmpty(desc)) continue;

                        string line = name + ":" + (string.IsNullOrEmpty(degree) ? "" : degree + "/") + (string.IsNullOrEmpty(desc) ? "" : desc);
                        if (line.EndsWith("/")) line = line.Substring(0, line.Length - 1);
                        text += line;
                    }

                    schoolSpecialRow.Add(semester, text);
                }
            }
            #endregion

            #region 定位,產生Row
            _builder.MoveToMergeField("日常行為表現");
            Cell currentCell = _builder.CurrentParagraph.ParentNode as Cell;
            Row currentRow = currentCell.ParentRow;
            Table table = currentRow.ParentTable;

            int rowCount = items.Count;
            int insertIndex = table.Rows.IndexOf(currentRow) + 1;
            for (int i = 1; i < rowCount; i++)
                table.Rows.Insert(insertIndex, currentRow.Clone(true));
            #endregion

            #region 寫入日常行為表現
            Cell cell = currentCell;

            foreach (string key in items.Keys)
            {
                WordHelper.Write(cell, key, _builder);

                Cell indexCell = WordHelper.GetMoveRightCell(cell, 1);
                WriteMoralItemRow(indexCell, items[key]);

                cell = WordHelper.GetMoveDownCell(cell, 1);
            }
            #endregion

            #region 寫入團體活動表現
            _builder.MoveToMergeField("團體活動");
            if (groupActivityRow != null && groupActivityRow.Items.Count > 0)
            {
                currentCell = _builder.CurrentParagraph.ParentNode as Cell;
                WriteMoralItemRow(currentCell, groupActivityRow);
                if (currentCell.Paragraphs.Count > 0) currentCell.Paragraphs[0].ParagraphFormat.Alignment = ParagraphAlignment.Center;
            }
            else
                (_builder.CurrentParagraph.ParentNode as Cell).ParentRow.Remove();
            #endregion

            #region 寫入公共服務表現
            _builder.MoveToMergeField("公共服務");
            if (publicServiceRow != null && publicServiceRow.Items.Count > 0)
            {
                currentCell = _builder.CurrentParagraph.ParentNode as Cell;
                WriteMoralItemRow(currentCell, publicServiceRow);
                if (currentCell.Paragraphs.Count > 0) currentCell.Paragraphs[0].ParagraphFormat.Alignment = ParagraphAlignment.Center;
            }
            else
                (_builder.CurrentParagraph.ParentNode as Cell).ParentRow.Remove();
            #endregion

            #region 寫入校內外特殊表現
            _builder.MoveToMergeField("校內外特殊");
            if (schoolSpecialRow != null && schoolSpecialRow.Items.Count > 0)
            {
                currentCell = _builder.CurrentParagraph.ParentNode as Cell;
                WriteMoralItemRow(currentCell, schoolSpecialRow);
                if (currentCell.Paragraphs.Count > 0) currentCell.Paragraphs[0].ParagraphFormat.Alignment = ParagraphAlignment.Center;
            }
            else
                (_builder.CurrentParagraph.ParentNode as Cell).ParentRow.Remove();
            #endregion

            #region 寫入具體建議
            _builder.MoveToMergeField("具體建議");
            if (recommendRow != null && recommendRow.Items.Count > 0)
            {
                currentCell = _builder.CurrentParagraph.ParentNode as Cell;
                WriteMoralItemRow(currentCell, recommendRow);
                if (currentCell.Paragraphs.Count > 0) currentCell.Paragraphs[0].ParagraphFormat.Alignment = ParagraphAlignment.Center;
            }
            else
                (_builder.CurrentParagraph.ParentNode as Cell).ParentRow.Remove();
            #endregion
        }
        private void ProcessDiscipline(List<AutoSummaryRecord> autoSummaryList)
        {
            #region 定位,產生Row
            _builder.MoveToMergeField("獎懲");
            Cell currentCell = _builder.CurrentParagraph.ParentNode as Cell;
            Row currentRow = currentCell.ParentRow;
            Table table = currentRow.ParentTable;

            int rowCount = 6;
            int insertIndex = table.Rows.IndexOf(currentRow) + 1;
            for (int i = 1; i < rowCount; i++)
                table.Rows.Insert(insertIndex, currentRow.Clone(true));
            #endregion

            string postfix = "次數";

            #region 寫入獎勵資料
            Dictionary<string, ValueItemRow> items = new Dictionary<string, ValueItemRow>();

            foreach (string name in new string[] { "嘉獎", "小功", "大功" })
                items.Add(name + postfix, new ValueItemRow(name + postfix));

            foreach (AutoSummaryRecord record in autoSummaryList)
            {
                SemesterData semester = new SemesterData("" + record.SchoolYear, "" + record.Semester);

                items["大功" + postfix].Add(semester, record.MeritA);
                items["小功" + postfix].Add(semester, record.MeritB);
                items["嘉獎" + postfix].Add(semester, record.MeritC);
            }

            Cell cell = currentCell;

            WordHelper.MergeVerticalCell(cell, 3);
            WordHelper.Write(cell, "獎勵", _builder);

            Cell itemCell = WordHelper.GetMoveRightCell(cell, 1);
            foreach (string type in items.Keys)
            {
                WriteValueItemRow(itemCell, items[type]);
                itemCell = WordHelper.GetMoveDownCell(itemCell, 1);
                if (itemCell == null) break;
            }

            Cell tempCell = WordHelper.GetMoveDownCell(cell, 3);
            if (tempCell != null) cell = tempCell;
            currentCell = cell;
            #endregion

            #region 寫入懲戒資料
            items.Clear();

            foreach (string name in new string[] { "警告", "小過", "大過" })
                items.Add(name + postfix, new ValueItemRow(name + postfix));

            foreach (var record in autoSummaryList)
            {
                SemesterData semester = new SemesterData("" + record.SchoolYear, "" + record.Semester);

                items["大過" + postfix].Add(semester, record.DemeritA);
                items["小過" + postfix].Add(semester, record.DemeritB);
                items["警告" + postfix].Add(semester, record.DemeritC);
            }

            cell = currentCell;

            WordHelper.MergeVerticalCell(cell, 3);
            WordHelper.Write(cell, "懲戒", _builder);

            itemCell = WordHelper.GetMoveRightCell(cell, 1);
            foreach (string type in items.Keys)
            {
                WriteValueItemRow(itemCell, items[type]);
                itemCell = WordHelper.GetMoveDownCell(itemCell, 1);
                if (itemCell == null) break;
            }

            tempCell = WordHelper.GetMoveDownCell(cell, 3);
            if (tempCell != null) cell = tempCell;
            #endregion
        }
        private void ProcessAttendance(List<AutoSummaryRecord> autoSummaryList)
        {
            #region 定位,產生Row
            _builder.MoveToMergeField("缺曠");
            Cell currentCell = _builder.CurrentParagraph.ParentNode as Cell;
            Row currentRow = currentCell.ParentRow;
            Table table = currentRow.ParentTable;

            if (_types.Count <= 0)
            {
                currentRow.Remove();
                return;
            }
            else
            {
                int rowCount = 0;
                foreach (string type in _types.Keys)
                    rowCount += _types[type].Count;

                int insertIndex = table.Rows.IndexOf(currentRow) + 1;
                for (int i = 1; i < rowCount; i++)
                    table.Rows.Insert(insertIndex, currentRow.Clone(true));
            }
            #endregion

            string postfix = "節數";

            #region 寫入缺曠資料
            Dictionary<string, Dictionary<string, ValueItemRow>> items = new Dictionary<string, Dictionary<string, ValueItemRow>>();

            foreach (string type in _types.Keys)
            {
                if (!items.ContainsKey(type))
                    items.Add(type, new Dictionary<string, ValueItemRow>());
                foreach (string name in _types[type])
                {
                    if (!items[type].ContainsKey(name + postfix))
                        items[type].Add(name + postfix, new ValueItemRow(name + postfix));
                }
            }

            foreach (AutoSummaryRecord record in autoSummaryList)
            {
                SemesterData semester = new SemesterData("" + record.SchoolYear, "" + record.Semester);

                foreach (AbsenceCountRecord absence in record.AbsenceCounts)
                {
                    if (items.ContainsKey(absence.PeriodType) && items[absence.PeriodType].ContainsKey(absence.Name + postfix))
                        items[absence.PeriodType][absence.Name + postfix].Add(semester, absence.Count);
                }
            }

            Cell cell = currentCell;

            foreach (string type in items.Keys)
            {
                int count = items[type].Count;
                WordHelper.MergeVerticalCell(cell, count);

                WordHelper.Write(cell, type, _builder);

                Cell itemCell = WordHelper.GetMoveRightCell(cell, 1);
                foreach (ValueItemRow row in items[type].Values)
                {
                    WriteValueItemRow(itemCell, row);
                    itemCell = WordHelper.GetMoveDownCell(itemCell, 1);
                    if (itemCell == null) break;
                }

                Cell tempCell = WordHelper.GetMoveDownCell(cell, count);
                if (tempCell == null) break;
                cell = tempCell;
            }
            #endregion
        }
 public bool Add(SemesterData semester, K12.Data.DomainScore domain)
 {
     if (!_scores.ContainsKey(semester))
     {
         _scores.Add(semester, new ScoreData("" + domain.Period, "" + domain.Credit, "" + domain.Score));
         return true;
     }
     return false;
 }
        private void PrintDomainOnly(DocumentBuilder builder, ReportStudent student, Row template, Table table)
        {
            #region 列印領域
            UniqueSet<RowHeader> RowIndexs = new UniqueSet<RowHeader>();

            #region 列印 RowHeader
            foreach (SemesterData semester in student.SHistory.GetGradeYearSemester())
            {
                SemesterData sysems = new SemesterData(0, semester.SchoolYear, semester.Semester);

                //如果不包含該學期成績資料,就跳過。
                if (!student.SemestersScore.Contains(sysems)) continue;

                SemesterScore semsscore = student.SemestersScore[sysems];

                //準備彈性課程的科目(要詳列出來)。
                foreach (string strSubject in semsscore.Subject)
                {
                    SemesterSubjectScore subject = semsscore.Subject[strSubject];

                    if (DetailDomain.Contains(subject.Domain))
                    {
                        RowHeader header = new RowHeader(subject.Domain, strSubject);
                        header.IsDomain = false;

                        if (!RowIndexs.Contains(header))
                            RowIndexs.Add(header);
                    }
                }

                //準備領域資料。
                foreach (string strDomain in semsscore.Domain)
                {
                    if (!Subj.Domains.Contains(strDomain)) continue;

                    SemesterDomainScore domain = semsscore.Domain[strDomain];

                    if (!DetailDomain.Contains(strDomain))
                    {
                        RowHeader header = new RowHeader(strDomain, string.Empty);
                        header.IsDomain = true;

                        if (!RowIndexs.Contains(header))
                            RowIndexs.Add(header);
                    }
                }
            }

            List<RowHeader> sortedHeaders = SortHeader(RowIndexs.ToList());

            //產生 Row。
            List<RowHeader> indexHeaders = new List<RowHeader>();
            Row current = template;
            int rowIndex = 0;
            foreach (RowHeader header in sortedHeaders)
            {
                RowHeader indexH = header;
                indexH.Index = rowIndex++;
                indexHeaders.Add(indexH);
                bool hasGroup = !string.IsNullOrEmpty(Subj.GetDomainGroup(header.Domain));
                string groupName = Subj.GetDomainGroup(header.Domain);

                Row datarow = table.InsertBefore(template.Clone(true), current) as Row;

                if (header.IsDomain)
                {
                    string domainCName = header.Domain;
                    string domainEName = Subj.GetDomainEnglish(header.Domain);
                    string domainString = domainCName + (string.IsNullOrEmpty(domainEName) ? "" : domainEName);

                    if (hasGroup)
                    {
                        string gn = groupName;

                        if (groupName == "語文")
                            gn = "語文\nLanguage";

                        datarow.Cells[0].Write(builder, gn);
                        datarow.Cells[1].Write(builder, domainString);
                    }
                    else
                        datarow.Cells[0].Write(builder, domainString);
                }
                else
                {
                    string gn = "";
                    //Additional Classes

                    if (IsFlexible(header.Domain))
                        gn = "彈性課程\nAdditional Classes";
                    else
                        gn = header.Domain;

                    string subjCName = header.Subject;
                    string subjEName = Subj.GetSubjectEnglish(header.Subject);
                    string subjString = header.Subject + (string.IsNullOrEmpty(subjEName) ? "" : "\n" + subjEName);

                    //把空白的領域當成「彈性課程」。
                    string domain = gn;
                    datarow.Cells[0].Write(builder, domain);
                    datarow.Cells[1].Write(builder, subjString);
                }
            }
            #endregion

            #region 填資料
            //Row RatingRow = null;
            foreach (RowHeader header in indexHeaders)
            {
                SemesterDataCollection semesters = new SemesterDataCollection();
                Row row = table.Rows[header.Index + DataRowOffset];
                foreach (SemesterData semester in student.SHistory.GetGradeYearSemester())
                {
                    SemesterData sysems = new SemesterData(0, semester.SchoolYear, semester.Semester);
                    semesters.Add(sysems);

                    if (!student.SemestersScore.Contains(sysems)) continue;
                    if (!student.HeaderList.ContainsKey(sysems)) continue;

                    int columnIndex = student.HeaderList[sysems];
                    SemesterScore semsscore = student.SemestersScore[sysems];

                    decimal? score = null;
                    decimal? weight = null;

                    if (header.IsDomain)
                    {
                        if (semsscore.Domain.Contains(header.Domain))
                        {
                            score = semsscore.Domain[header.Domain].Value;
                            weight = semsscore.Domain[header.Domain].Weight;
                        }
                    }
                    else
                    {
                        if (semsscore.Subject.Contains(header.Subject))
                        {
                            score = semsscore.Subject[header.Subject].Value;
                            weight = semsscore.Subject[header.Subject].Weight;
                        }
                    }

                    if (!score.HasValue) continue;
                    if (!weight.HasValue) weight = 0;

                    if (PrintScore)
                        row.Cells[columnIndex + 2].Write(builder, score.Value + "");
                    else
                        row.Cells[columnIndex + 2].Write(builder, Util.GetDegreeEnglish(score.Value));
                }

            }

            #endregion

            #region 合併相關欄位。
            string previousCellDomain = string.Empty;
            foreach (RowHeader header in indexHeaders)
            {
                bool hasGroup = !string.IsNullOrEmpty(Subj.GetDomainGroup(header.Domain));
                string groupName = Subj.GetDomainGroup(header.Domain);

                Row row = table.Rows[header.Index + DataRowOffset];

                if (previousCellDomain == row.Cells[0].ToTxt())
                    row.Cells[0].CellFormat.VerticalMerge = CellMerge.Previous;
                else
                    row.Cells[0].CellFormat.VerticalMerge = CellMerge.First;

                if (header.IsDomain)
                {
                    if (!hasGroup)
                    {
                        row.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                        row.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;
                    }
                }

                previousCellDomain = row.Cells[0].ToTxt();
            }
            #endregion

            #endregion
        }
示例#37
0
        private void SetFilterSource()
        {
            foreach (MenuButton button in Panel.FilterMenu.SubItems)
            {
                button.Visible = false;
            }

            if (Selected == null)
                Selected = new SemesterData(int.Parse(School.DefaultSchoolYear), int.Parse(School.DefaultSemester));

            foreach (SemesterData sems in Semesters)
            {
                MenuButton button = Panel.FilterMenu[string.Format("[{0}] [{1}]", sems.SchoolYear, DataItems.SemesterItem.GetSemesterByCode(sems.Semester.ToString()).Name)];
                InitButton(sems, button);

                if (sems == Selected)
                    button.Checked = true;
            }

            MenuButton mb = Panel.FilterMenu["其他學期"];
            InitButton(SemesterData.Undefined, mb);
            if (SemesterData.Undefined == Selected)
                mb.Checked = true;

            if (Selected.Value == SemesterData.Undefined)
                Panel.FilterMenu.Text = "其他學期";
            else
            {
                //  學年度與學期是否顯示中文要請示長官再修改。
                Panel.FilterMenu.Text = string.Format("[{0}] [{1}]", Selected.Value.SchoolYear,  DataItems.SemesterItem.GetSemesterByCode(Selected.Value.Semester.ToString()).Name);
            }

            HashSet<string> result = new HashSet<string>();

            foreach (dynamic course in CacheProvider.Course)
            {
                int sy, ss;

                if (!int.TryParse(course.SchoolYear + "", out sy))
                    sy = -1;

                if (!int.TryParse(course.Semester + "", out ss))
                    ss = -1;

                SemesterData sd;
                if (sy == -1 || ss == -1)
                    sd = SemesterData.Undefined;
                else
                    sd = new SemesterData(sy, ss);

                if (Selected.Value == sd)
                    result.Add(course.Id);
            }
            this.resultCourseIDs = result.ToList();
            this.semesterData = Selected.Value ;
            Panel.SetFilteredSource(this.resultCourseIDs);
        }
示例#38
0
        //最好這程式有人能維護的了.......
        private void MailMerge_MergeField(object sender, MergeFieldEventArgs e)
        {
            //不是 Fix 開頭的合併欄位不處理。
            if (!e.FieldName.ToUpper().StartsWith("Fix".ToUpper())) return;

            DocumentBuilder builder = new DocumentBuilder(e.Document);

            ReportStudent student = e.FieldValue as ReportStudent;

            //如果合併值不是 ReportStudent 就跳過...意思是有問題...。
            if (student == null) return;

            builder.MoveToField(e.Field, true);
            e.Field.Remove();

            if (e.FieldName == "Fix:年級學期")
            {
                #region 列印年級學期資訊(有點複雜)。
                SemesterDataCollection semesters = student.SHistory.GetGradeYearSemester().GetSemesters(PrintSetting.PrintSemesters);
                Row SemesterRow = builder.CurrentParagraph.ParentNode.ParentNode.NextSibling as Row; //下一個 Row。
                Paragraph originParagraph = builder.CurrentParagraph;

                int count = 0, offset = 1;

                foreach (SemesterData each in semesters)
                {
                    string currentGradeyear = Util.GetGradeyearString(each.GradeYear.ToString());

                    //如果沒有年級,就跳過。
                    if (string.IsNullOrEmpty(currentGradeyear)) continue;

                    builder.Write(currentGradeyear + "年級");
                    Paragraph nextPh = Util.NextCell(builder.CurrentParagraph);
                    if (nextPh == null) break; //沒有下一個 Cell ,就不印資料了。
                    builder.MoveTo(nextPh);

                    Paragraph resetParagraph = builder.CurrentParagraph;
                    SemesterRow.Cells[count + offset].Write(builder, GetSemesterString(each));

                    SemesterData semester = new SemesterData(0, each.SchoolYear, each.Semester);
                    if (!student.HeaderList.ContainsKey(semester))
                        student.HeaderList.AddRaw(each, count); //不要懷疑,這是對的。

                    builder.MoveTo(resetParagraph);
                    count++;
                }

                builder.MoveTo(originParagraph);
                (originParagraph.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.First;
                Paragraph nextParagrap = originParagraph;
                string previousGradeyear = GetText(originParagraph);
                while ((nextParagrap = Util.NextCell(nextParagrap)) != null)
                {
                    if (GetText(nextParagrap) == previousGradeyear && !string.IsNullOrEmpty(previousGradeyear))
                    {
                        (nextParagrap.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.Previous;
                        (nextParagrap.ParentNode as Cell).Paragraphs[0].Runs.Clear();
                    }
                    else
                        (nextParagrap.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.First;

                    previousGradeyear = GetText(nextParagrap);
                }
                #endregion
            }
            else if (e.FieldName == "Fix:科目資訊")
            {
                #region 列印科目資料(爆炸複雜)

                Row template = builder.CurrentParagraph.ParentNode.ParentNode as Row;
                Table table = template.ParentNode as Table;

                if (PrintSetting.ListMethod == ListMethod.DomainOnly)
                {
                    #region 列印領域
                    UniqueSet<RowHeader> RowIndexs = new UniqueSet<RowHeader>();
                    //Environment.OSVersion.Platform
                    #region 列印 RowHeader
                    foreach (SemesterData semester in student.SHistory.GetGradeYearSemester().GetSemesters(PrintSetting.PrintSemesters))
                    {
                        SemesterData sysems = new SemesterData(0, semester.SchoolYear, semester.Semester);

                        //如果不包含該學期成績資料,就跳過。
                        if (!student.SemestersScore.Contains(sysems)) continue;

                        SemesterScore semsscore = student.SemestersScore[sysems];

                        ////準備彈性課程的科目(要詳列出來)。
                        //foreach (string strSubject in semsscore.Subject)
                        //{
                        //    SemesterSubjectScore subject = semsscore.Subject[strSubject];

                        //    if (DetailDomain.Contains(subject.Domain))
                        //    {
                        //        RefineDomain(subject);

                        //        RowHeader header = new RowHeader(subject.Domain, strSubject);
                        //        header.IsDomain = false;

                        //        if (!RowIndexs.Contains(header))
                        //            RowIndexs.Add(header);
                        //    }
                        //}

                        //準備領域資料。
                        foreach (string strDomain in semsscore.Domain)
                        {
                            if (!Subj.Domains.Contains(strDomain)) continue;

                            SemesterDomainScore domain = semsscore.Domain[strDomain];

                            if (!DetailDomain.Contains(strDomain))
                            {
                                RowHeader header = new RowHeader(strDomain, string.Empty);
                                header.IsDomain = true;

                                if (!RowIndexs.Contains(header))
                                    RowIndexs.Add(header);
                            }
                        }
                    }

                    RowHeader lheader = new RowHeader(LearningDomainName, string.Empty);
                    RowHeader lheader1 = new RowHeader(LearningDomainNameSpcAdd, string.Empty);
                    RowHeader lheader2 = new RowHeader(LearningDomainNameP, string.Empty);
                    RowHeader lheader3 = new RowHeader(LearningDomainNameSpcAddP, string.Empty);
                    RowHeader lheader4 = new RowHeader(CalcMessage, string.Empty);

                    lheader.IsDomain = true;
                    lheader1.IsDomain = true;
                    lheader2.IsDomain = true;
                    lheader3.IsDomain = true;
                    lheader4.IsDomain = true;
                    RowIndexs.Add(lheader);
                    RowIndexs.Add(lheader1);
                    RowIndexs.Add(lheader2);
                    RowIndexs.Add(lheader3);
                    RowIndexs.Add(lheader4);

                    List<RowHeader> sortedHeaders = SortHeader(RowIndexs.ToList());

                    //產生 Row。
                    List<RowHeader> indexHeaders = new List<RowHeader>();
                    Row current = template;
                    int rowIndex = 0;
                    foreach (RowHeader header in sortedHeaders)
                    {
                        RowHeader indexH = header;
                        indexH.Index = rowIndex++;
                        indexHeaders.Add(indexH);
                        bool hasGroup = !string.IsNullOrEmpty(Subj.GetDomainGroup(header.Domain));
                        string groupName = Subj.GetDomainGroup(header.Domain);

                        Row datarow = table.InsertBefore(template.Clone(true), current) as Row;

                        //if (header.Domain == LearningDomainName)
                        //{
                        //    string headerName = string.Empty;

                        //    if (PrintSetting.PrintRank)
                        //        headerName = "學期成績平均排名";

                        //    if (PrintSetting.PrintRankPercentage)
                        //        headerName = "學期成績平均百分比";

                        //    if (PrintSetting.PrintRank && PrintSetting.PrintRankPercentage)
                        //        headerName = "學期成績平均排名/百分比";

                        //    if (PrintSetting.PrintRank || PrintSetting.PrintRankPercentage)
                        //    {
                        //        Row lrow = table.InsertAfter(template.Clone(true), datarow) as Row;
                        //        lrow.Cells[0].Write(builder, headerName);
                        //        rowIndex++;
                        //    }
                        //}

                        //if (header.Domain == LearningDomainNameSpcAdd)
                        //{
                        //    string headerName = string.Empty;

                        //    if (PrintSetting.PrintRank)
                        //        headerName = "特種身分加分後之學期成績平均排名";

                        //    if (PrintSetting.PrintRankPercentage)
                        //        headerName = "特種身分加分後之學期成績平均百分比";

                        //    if (PrintSetting.PrintRank && PrintSetting.PrintRankPercentage)
                        //        headerName = "特種身分加分後之學期成績平均排名/百分比";

                        //    if (PrintSetting.PrintRank || PrintSetting.PrintRankPercentage)
                        //    {
                        //        Row lrow = table.InsertAfter(template.Clone(true), datarow) as Row;
                        //        lrow.Cells[0].Write(builder, headerName);
                        //        rowIndex++;
                        //    }
                        //}

                        if (header.IsDomain)
                        {
                            if (hasGroup)
                            {
                                datarow.Cells[0].Write(builder, groupName);
                                datarow.Cells[1].Write(builder, header.Domain);
                            }
                            else
                            {
                                datarow.Cells[0].Write(builder, header.Domain);
                            }
                        }
                        else
                        {
                            if (header.Domain == LearningDomainNameP)
                            {
                                string headerName = string.Empty;

                                if (PrintSetting.PrintRank)
                                    headerName = "學期成績平均排名";

                                if (PrintSetting.PrintRankPercentage)
                                    headerName = "學期成績平均百分比";

                                if (PrintSetting.PrintRank && PrintSetting.PrintRankPercentage)
                                    headerName = "學期成績平均排名/百分比";

                                if (PrintSetting.PrintRank || PrintSetting.PrintRankPercentage)
                                {
                                    Row lrow = table.InsertAfter(template.Clone(true), datarow) as Row;
                                    lrow.Cells[0].Write(builder, headerName);
                                    rowIndex++;
                                }
                            }

                            if (header.Domain == LearningDomainNameSpcAddP)
                            {
                                string headerName = string.Empty;

                                if (PrintSetting.PrintRank)
                                    headerName = "特種身分加分後之學期成績平均排名";

                                if (PrintSetting.PrintRankPercentage)
                                    headerName = "特種身分加分後之學期成績平均百分比";

                                if (PrintSetting.PrintRank && PrintSetting.PrintRankPercentage)
                                    headerName = "特種身分加分後之學期成績平均排名/百分比";

                                if (PrintSetting.PrintRank || PrintSetting.PrintRankPercentage)
                                {
                                    Row lrow = table.InsertAfter(template.Clone(true), datarow) as Row;
                                    lrow = table.InsertAfter(template.Clone(true), datarow) as Row;
                                    lrow.Cells[0].Write(builder, headerName);
                                    rowIndex++;
                                }
                            }

                            //把空白的領域當成「彈性課程」。
                            string domain = IsFlexible(header.Domain) ? "彈性課程" : header.Domain;

                            // 修改不需要彈性課程,標頭
                            datarow.Cells[0].Write(builder, "^^");
                            datarow.Cells[1].Write(builder, "^_^");
                        }
                    }
                    #endregion

                    #region 填資料
                    Row RatingRow = null;
                    // 用在加分後
                    Row RatingRowAdd = null;
                    // 是否已有年排名資料
                    List<DAL.UserDefData> uddList = new List<JointAdmissionModule.DAL.UserDefData>();
                    if (_StudRankData.ContainsKey(student.StudentID))
                        uddList = _StudRankData[student.StudentID];

                    foreach (RowHeader header in indexHeaders)
                    {
                        SemesterDataCollection semesters = new SemesterDataCollection();
                        Row row = table.Rows[header.Index + 3];
                        foreach (SemesterData semester in student.SHistory.GetGradeYearSemester().GetSemesters(PrintSetting.PrintSemesters))
                        {
                            SemesterData sysems = new SemesterData(0, semester.SchoolYear, semester.Semester);
                            semesters.Add(sysems);

                            if (!student.SemestersScore.Contains(sysems)) continue;
                            if (!student.HeaderList.ContainsKey(sysems)) continue;

                            int columnIndex = student.HeaderList[sysems];
                            SemesterScore semsscore = student.SemestersScore[sysems];

                            decimal? score = null;
                            decimal? weight = null;

                            if (header.IsDomain)
                            {
                                if (semsscore.Domain.Contains(header.Domain))
                                {
                                    score = semsscore.Domain[header.Domain].Value;
                                    weight = semsscore.Domain[header.Domain].Weight;
                                }
                            }
                            else
                            {
                                // 這段在顯示彈性課程成績,先註。
                                //if (semsscore.Subject.Contains(header.Subject))
                                //{
                                //    score = semsscore.Subject[header.Subject].Value;
                                //    weight = semsscore.Subject[header.Subject].Weight;
                                //}
                            }

                            if (header.Domain == LearningDomainName)
                            {
                                score = semsscore.LearnDomainScore;

                                row.Cells[columnIndex * 3 + 2].CellFormat.FitText = false;
                                row.Cells[columnIndex * 3 + 2].CellFormat.HorizontalMerge = CellMerge.First;
                                row.Cells[columnIndex * 3 + 3].CellFormat.HorizontalMerge = CellMerge.Previous;

                                if (!score.HasValue) continue;

                                row.Cells[columnIndex * 3 + 2].Write(builder, ((double)score) + "");
                                row.Cells[columnIndex * 3 + 4].Write(builder, (Util.GetDegree(score.Value)));

                                if (PrintSetting.PrintRank || PrintSetting.PrintRankPercentage)
                                {
                                    RatingRow = row.NextSibling as Row;
                                    RatingRow = RatingRow.NextSibling as Row;
                                }
                            }
                            else if (header.Domain == LearningDomainNameSpcAdd)
                            {
                                // 加分後填入值
                                score = semsscore.LearnDomainScore;

                                row.Cells[columnIndex * 3 + 2].CellFormat.FitText = false;
                                row.Cells[columnIndex * 3 + 2].CellFormat.HorizontalMerge = CellMerge.First;
                                row.Cells[columnIndex * 3 + 3].CellFormat.HorizontalMerge = CellMerge.Previous;

                                if (!score.HasValue) continue;
                                // 處理加分
                                decimal sc = score.Value;
                                if (student.AddWeight.HasValue)
                                    sc = Math.Round(sc * student.AddWeight.Value, 2,MidpointRounding.AwayFromZero); ;

                                // 一般生填空白
                                if (string.IsNullOrEmpty(student.SpcStudTypeName))
                                {
                                    row.Cells[columnIndex * 3 + 2].Write(builder, "");
                                    row.Cells[columnIndex * 3 + 4].Write(builder, "");
                                }
                                else
                                {
                                    // 特種身
                                    row.Cells[columnIndex * 3 + 2].Write(builder, sc + "");
                                    row.Cells[columnIndex * 3 + 4].Write(builder, (Util.GetDegree(sc)));
                                }

                                if (PrintSetting.PrintRank || PrintSetting.PrintRankPercentage)
                                {
                                    if (RatingRow != null)
                                    {
                                        RatingRowAdd = RatingRow.NextSibling as Row;

                                    }
                                }
                            }
                            else
                            {
                                if (!score.HasValue) continue;
                                if (!weight.HasValue) weight = 0;

                                row.Cells[columnIndex * 3 + 2].Write(builder, ((double)weight) + "");
                                row.Cells[columnIndex * 3 + 3].Write(builder, ((double)score) + "");
                                row.Cells[columnIndex * 3 + 4].Write(builder, (Util.GetDegree(score.Value)));
                            }
                        }

                        //算平均...
                        decimal? avgScore = null;
                        if (header.IsDomain)
                        {
                            if (header.Domain == LearningDomainName)
                            {
                                avgScore = student.SemestersScore.AvgLearningDomainScore(semesters);

                                if (!avgScore.HasValue) continue;

                                if (student.CalculationRule == null)
                                    avgScore = Math.Round(avgScore.Value, 2, MidpointRounding.AwayFromZero);
                                else
                                    avgScore = student.CalculationRule.ParseLearnDomainScore(avgScore.Value);
                            }
                            else
                            {
                                avgScore = student.SemestersScore.AvgDomainScore(semesters, header.Domain);

                                if (!avgScore.HasValue) continue;

                                if (student.CalculationRule == null)
                                    avgScore = Math.Round(avgScore.Value, 2, MidpointRounding.AwayFromZero);
                                else
                                    avgScore = student.CalculationRule.ParseDomainScore(avgScore.Value);
                            }
                        }
                        else
                        {
                            // 這段在處理彈性課程平均,先註。
                            //avgScore = student.SemestersScore.AvgSubjectScore(semesters, header.Subject);

                            //if (!avgScore.HasValue) continue;

                            //if (student.CalculationRule == null)
                            //    avgScore = Math.Round(avgScore.Value, 2, MidpointRounding.AwayFromZero);
                            //else
                            //    avgScore = student.CalculationRule.ParseSubjectScore(avgScore.Value);
                        }

                        if (avgScore.HasValue)
                        {
                            row.Cells[20].Write(builder, (double)avgScore + "");
                            row.Cells[21].Write(builder, Util.GetDegree(avgScore.Value));
                            //decimal scAddScore = 0;
                            //// 特種身分
                            //if (student.AddWeight.HasValue)
                            //{
                            //    Row RowSp = row.NextSibling as Row;
                            //    scAddScore = student.AddWeight.Value * avgScore.Value;
                            //    RowSp.Cells[20].Write(builder, (double)scAddScore + "");
                            //    RowSp.Cells[21].Write(builder, Util.GetDegree(scAddScore));

                            //}
                        }
                    }

                    // 處理特種分身平均顯示
                    decimal scAddScore = 0;
                    // 特種身分
                    int rrIdx = 0;
                    foreach(RowHeader rh in indexHeaders)
                    {
                        if (rh.Domain == LearningDomainNameSpcAdd)
                        {
                            rrIdx = rh.Index + 3;
                            break;
                        }
                    }

                    if (student.AddWeight.HasValue && rrIdx >0)
                    {
                        // 顯示平均
                        if (student.Places.NS("年排名").Contains("學習領域"))
                        {
                            scAddScore = Math.Round(student.Places.NS("年排名")["學習領域"].Score * student.AddWeight.Value,2,MidpointRounding.AwayFromZero);
                            table.Rows[rrIdx].Cells[20].Write(builder, (double)scAddScore + "");
                            table.Rows[rrIdx].Cells[21].Write(builder, Util.GetDegree(scAddScore));
                        }

                    }

                    // 處理年排名與百分比
                    if (RatingRow != null)
                    {
                        PlaceCollection places = student.Places.NS("年排名");

                        foreach (SemesterData semsIndex in student.HeaderList.Keys)
                        {
                            SemesterData raw = student.HeaderList.GetSRaw(semsIndex);

                            if (raw == SemesterData.Empty) continue;

                            string placeKey = SLearningDomainParser.GetSemesterString(raw);

                            Cell datacell = RatingRow.Cells[student.HeaderList[semsIndex] * 3 + 2];

                            bool UseRatingRank = true;
                            // 處理已有年排名(在UDT有存資料)
                            if (uddList.Count > 0 && student.LastEnterSemester.HasValue)
                            {
                                foreach (DAL.UserDefData udd in uddList)
                                {
                                    if (udd.SchoolYear == semsIndex.SchoolYear && udd.Semester == semsIndex.Semester)
                                    {
                                        datacell.Write(builder, GetPlaceString2(udd.GradeRank, udd.GradeRankPercent));
                                        UseRatingRank = false;
                                    }
                                }
                            }

                            // 判斷轉入生
                            if (student.LastEnterGradeYear.HasValue && student.LastEnterSchoolyear.HasValue)
                            {
                                if (semsIndex.SchoolYear <= student.LastEnterSchoolyear.Value)
                                {

                                        bool clear = true;

                                        // 當有資料
                                        foreach (DAL.UserDefData udd in (from data in uddList where data.SchoolYear== semsIndex.SchoolYear && data.Semester== semsIndex.Semester select data))
                                                clear = false;

                                        if (clear)
                                        {
                                            // 和異動同年同學期不動
                                            if (semsIndex.SchoolYear == student.LastEnterSchoolyear && semsIndex.Semester == student.LastEnterSemester)
                                                clear = false;
                                        }

                                        if (clear)
                                        {
                                            // 當同一學年第2學期,如果維持不清空
                                            if (semsIndex.SchoolYear == student.LastEnterSchoolyear.Value && semsIndex.Semester == 2)
                                                clear = false;
                                        }

                                        if (clear)
                                        {
                                            datacell.Write(builder, "");
                                            UseRatingRank = false;
                                        }

                                }

                                if (uddList.Count == 0)
                                {
                                    if (semsIndex.SchoolYear <= student.LastEnterSchoolyear.Value)
                                    {
                                        if (semsIndex.SchoolYear < student.LastEnterSchoolyear.Value)
                                        {
                                            datacell.Write(builder, "");
                                            UseRatingRank = false;
                                        }
                                        else if (semsIndex.SchoolYear == student.LastEnterSchoolyear.Value && semsIndex.Semester < student.LastEnterSemester)
                                        {
                                            datacell.Write(builder, "");
                                            UseRatingRank = false;
                                        }
                                    }
                                }
                            }

                            // 使用即時運算排名與百分比
                            if(UseRatingRank)
                                if (places.Contains(placeKey))
                                    datacell.Write(builder, GetPlaceString(places, placeKey));
                        }

                        // 顯示平均
                        if (places.Contains("學習領域"))
                            RatingRow.Cells[20].Write(builder, GetPlaceString(places, "學習領域"));
                    }

                    int? LevelAdd=null,PercentageAdd=null;
                    // 處理年排名與百分比(加分後)
                    if (RatingRowAdd != null)
                    {
                        PlaceCollection places = student.Places.NS("年排名");

                        foreach (SemesterData semsIndex in student.HeaderList.Keys)
                        {
                            SemesterData raw = student.HeaderList.GetSRaw(semsIndex);

                            if (raw == SemesterData.Empty) continue;

                            string placeKey = SLearningDomainParser.GetSemesterString(raw);

                            //if (!places.Contains(placeKey))
                            //    continue;

                            Cell datacell = RatingRowAdd.Cells[student.HeaderList[semsIndex] * 3 + 2];

                            // 如果是一般生直接填空白
                            if (string.IsNullOrEmpty(student.SpcStudTypeName))
                            {
                                datacell.Write(builder, "");
                                continue;
                            }
                            int Level=1,Percentage=1;

                            // 處理加分後
                            if (places.Contains(placeKey))
                            {
                                if (student.AddWeight.HasValue)
                                {
                                    List<Place> PList = new List<Place>();
                                    decimal sc = places[placeKey].Score * student.AddWeight.Value;
                                    if (DAL.DALTransfer.StudRankScoreDict.ContainsKey(student.GradeYear))
                                    {
                                        if (DAL.DALTransfer.StudRankScoreDict[student.GradeYear].ContainsKey(placeKey))
                                        {
                                            PList = (from data in DAL.DALTransfer.StudRankScoreDict[student.GradeYear][placeKey] where data.Place.Score >= sc orderby data.Place.Score ascending select data.Place).ToList();
                                            if (PList.Count > 0)
                                            {
                                                PList.OrderBy(x => x.Score);
                                                Level = PList[0].Level;
                                                Percentage = PList[0].Percentage;
                                            }
                                            else
                                            {
                                                Level = 1;
                                                Percentage = 1;
                                            }
                                        }
                                    }
                                }
                            }

                            bool UseRatingRank = true;
                            // 處理已有年排名(UDT)
                            if (uddList.Count > 0 && student.LastEnterSemester.HasValue)
                            {
                                foreach (DAL.UserDefData udd in uddList)
                                {
                                    if (udd.SchoolYear == semsIndex.SchoolYear && udd.Semester == semsIndex.Semester)
                                    {
                                        datacell.Write(builder, GetPlaceString2(udd.GradeRankAdd, udd.GradeRankPercentAdd));
                                        UseRatingRank = false;
                                    }
                                }
                            }

                            // 判斷轉入生
                            if (student.LastEnterGradeYear.HasValue && student.LastEnterSchoolyear.HasValue)
                            {
                                if (semsIndex.SchoolYear <= student.LastEnterSchoolyear.Value)
                                {

                                    bool clear = true;

                                    // 當有資料
                                    foreach (DAL.UserDefData udd in (from data in uddList where data.SchoolYear == semsIndex.SchoolYear && data.Semester == semsIndex.Semester select data))
                                        clear = false;

                                    if (clear)
                                    {
                                        // 和異動同年同學期不動
                                        if (semsIndex.SchoolYear == student.LastEnterSchoolyear && semsIndex.Semester == student.LastEnterSemester)
                                            clear = false;
                                    }

                                    if (clear)
                                    {
                                        // 當同一學年第2學期,如果維持不清空
                                        if (semsIndex.SchoolYear == student.LastEnterSchoolyear.Value && semsIndex.Semester == 2)
                                            clear = false;
                                    }

                                    if (clear)
                                    {
                                        datacell.Write(builder, "");
                                        UseRatingRank = false;
                                    }

                                }

                                if (uddList.Count == 0)
                                {
                                    if (semsIndex.SchoolYear <= student.LastEnterSchoolyear.Value)
                                    {
                                        if (semsIndex.SchoolYear < student.LastEnterSchoolyear.Value)
                                        {
                                            datacell.Write(builder, "");
                                            UseRatingRank = false;
                                        }
                                        else if (semsIndex.SchoolYear == student.LastEnterSchoolyear.Value && semsIndex.Semester < student.LastEnterSemester)
                                        {
                                            datacell.Write(builder, "");
                                            UseRatingRank = false;
                                        }
                                    }
                                }
                            }

                            //// 使用即時運算排名與百分比
                            if (UseRatingRank)
                            {
                                if (places.Contains(placeKey))
                                {
                                    if (student.AddWeight.HasValue)
                                        datacell.Write(builder, GetPlaceString2(Level, Percentage));
                                    else
                                        datacell.Write(builder, GetPlaceString(places, placeKey));

                                }
                            }

                            //// 每學期加分後
                            //if (places.Contains(placeKey))
                            //    datacell.Write(builder, "^_^");

                        }

                        //這是加分後平均
                        //if (places.Contains(LearningDomainNameSpcAddP))
                        //    RatingRowAdd.Cells[20].Write(builder, GetPlaceString(places, LearningDomainNameSpcAddP));

                        // 加分後
                        if (student.AddWeight.HasValue)
                        {
                            decimal sc1=0;
                            PercentageAdd = null; LevelAdd = null;
                            List<Place> PList = new List<Place>();
                            if(places.Contains("學習領域"))
                                sc1 = places["學習領域"].Score * student.AddWeight.Value;
                            if (DAL.DALTransfer.StudRankScoreDict.ContainsKey(student.GradeYear))
                            {
                                if (DAL.DALTransfer.StudRankScoreDict[student.GradeYear].ContainsKey("學期總平均"))
                                {
                                    PList = (from data in DAL.DALTransfer.StudRankScoreDict[student.GradeYear]["學期總平均"] where data.Place.Score >= sc1 orderby data.Place.Score ascending select data.Place).ToList();
                                    if (PList.Count > 0)
                                    {
                                        PList.OrderBy(x => x.Score);
                                        LevelAdd = PList[0].Level;
                                        PercentageAdd = PList[0].Percentage;
                                    }
                                    else
                                    {
                                        LevelAdd = 1;
                                        PercentageAdd = 1;
                                    }
                                }
                                if(LevelAdd.HasValue && PercentageAdd.HasValue )
                                    RatingRowAdd.Cells[20].Write(builder, GetPlaceString2(LevelAdd.Value, PercentageAdd.Value));
                            }
                        }

                    }

                    // 樂學計分方式
                    if(RatingRowAdd !=null )
                    {
                        //string str = "單一學期學習領域成績計分=100-(名次百分比)×100+1";
                        Row RowStr = RatingRowAdd.NextSibling as Row;
                        //RowStr.Cells[2].Write(builder, str);

                        PlaceCollection places = student.Places.NS("年排名");
                        foreach (SemesterData semsIndex in student.HeaderList.Keys)
                        {
                            SemesterData raw = student.HeaderList.GetSRaw(semsIndex);

                            if (raw == SemesterData.Empty) continue;

                            string placeKey = SLearningDomainParser.GetSemesterString(raw);

                            Cell datacell = RowStr.Cells[student.HeaderList[semsIndex] * 3 + 2];

                            bool UseRatingRank = true;

                            // 處理已有年排名(在UDT有存資料)
                            if (uddList.Count > 0 && student.LastEnterSemester.HasValue)
                            {
                                foreach (DAL.UserDefData udd in uddList)
                                {
                                    if (udd.SchoolYear == semsIndex.SchoolYear && udd.Semester == semsIndex.Semester)
                                    {
                                        if(student.AddWeight.HasValue )
                                            datacell.Write(builder, GetPlaceString3(udd.GradeRankPercentAdd));
                                        else
                                            datacell.Write(builder, GetPlaceString3(udd.GradeRankPercent));
                                        UseRatingRank = false;
                                    }
                                }
                            }

                            // 判斷轉入生
                            if (student.LastEnterGradeYear.HasValue && student.LastEnterSchoolyear.HasValue )
                            {
                                if (semsIndex.SchoolYear <= student.LastEnterSchoolyear.Value)
                                {

                                    bool clear = true;

                                    // 當有資料
                                    foreach (DAL.UserDefData udd in (from data in uddList where data.SchoolYear == semsIndex.SchoolYear && data.Semester == semsIndex.Semester select data))
                                        clear = false;

                                    if (clear)
                                    {
                                        // 和異動同年同學期不動
                                        if (semsIndex.SchoolYear == student.LastEnterSchoolyear && semsIndex.Semester == student.LastEnterSemester)
                                            clear = false;
                                    }

                                    if (clear)
                                    {
                                        // 當同一學年第2學期,如果維持不清空
                                        if (semsIndex.SchoolYear == student.LastEnterSchoolyear.Value && semsIndex.Semester == 2)
                                            clear = false;
                                    }

                                    if (clear)
                                    {
                                        datacell.Write(builder, "");
                                        UseRatingRank = false;
                                    }

                                }

                                if (uddList.Count == 0)
                                {
                                    if (semsIndex.SchoolYear <= student.LastEnterSchoolyear.Value)
                                    {
                                        if (semsIndex.SchoolYear < student.LastEnterSchoolyear.Value)
                                        {
                                            datacell.Write(builder, "");
                                            UseRatingRank = false;
                                        }
                                        else if (semsIndex.SchoolYear == student.LastEnterSchoolyear.Value && semsIndex.Semester < student.LastEnterSemester)
                                        {
                                            datacell.Write(builder, "");
                                            UseRatingRank = false;
                                        }
                                    }
                                }
                            }

                            if (UseRatingRank)
                            {

                                // 處理樂學計算
                                if (student.AddWeight.HasValue == false)
                                    if (places.Contains(placeKey))
                                        datacell.Write(builder, GetPlaceString3(places[placeKey].Percentage));

                                int Level = 1, Percentage = 1;

                                // 處理加分後
                                if (places.Contains(placeKey))
                                {
                                    if (student.AddWeight.HasValue)
                                    {
                                        List<Place> PList = new List<Place>();
                                        decimal sc = places[placeKey].Score * student.AddWeight.Value;
                                        if (DAL.DALTransfer.StudRankScoreDict.ContainsKey(student.GradeYear))
                                        {
                                            if (DAL.DALTransfer.StudRankScoreDict[student.GradeYear].ContainsKey(placeKey))
                                            {
                                                PList = (from data in DAL.DALTransfer.StudRankScoreDict[student.GradeYear][placeKey] where data.Place.Score >= sc orderby data.Place.Score ascending select data.Place).ToList();
                                                if (PList.Count > 0)
                                                {
                                                    PList.OrderBy(x => x.Score);
                                                    Level = PList[0].Level;
                                                    Percentage = PList[0].Percentage;
                                                }
                                                else
                                                {
                                                    Level = 1;
                                                    Percentage = 1;
                                                }
                                            }
                                        }
                                        datacell.Write(builder, GetPlaceString3(Percentage));
                                    }
                                }
                            }

                        }

                        //// 顯示平均
                        //Place p;
                        //if (places.Contains("學習領域"))
                        //{
                            //if (student.AddWeight.HasValue)
                            //{
                            //    if(PercentageAdd.HasValue )
                            //        RowStr.Cells[20].Write(builder, GetPlaceString3(PercentageAdd.Value));
                            //}
                            //else
                            //{
                        //        p = places["學習領域"];
                        //        RowStr.Cells[20].Write(builder, GetPlaceString3(p.Percentage));
                        //    //}
                        //}
                    }
                    #endregion

                    #region 合併相關欄位。
                    string previousCellDomain = string.Empty;
                    foreach (RowHeader header in indexHeaders)
                    {
                        bool hasGroup = !string.IsNullOrEmpty(Subj.GetDomainGroup(header.Domain));
                        string groupName = Subj.GetDomainGroup(header.Domain);

                        Row row = table.Rows[header.Index + 3];

                        if (previousCellDomain == row.Cells[0].ToTxt())
                            row.Cells[0].CellFormat.VerticalMerge = CellMerge.Previous;
                        else
                            row.Cells[0].CellFormat.VerticalMerge = CellMerge.First;

                        if (header.IsDomain)
                        {
                            if (header.Domain == LearningDomainName)
                            {
                                #region 學習領域
                                // 這段在處理 header
                                row.Cells[0].CellFormat.FitText = false;
                                row.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                                row.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;

                                #endregion
                            }
                            else if (header.Domain == LearningDomainNameSpcAdd)
                            {
                                #region 學習領域(加分後)
                                row.Cells[0].CellFormat.FitText = false;
                                row.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                                row.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;

                                #endregion
                            }
                            else if (header.Domain == LearningDomainNameP)
                            {
                                // 學成成績排名與百分比
                                row.Cells[0].CellFormat.FitText = false;
                                row.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                                row.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;

                                if (PrintSetting.PrintRank || PrintSetting.PrintRankPercentage)
                                {

                                    //Row lrow = row.NextSibling as Row;
                                    Row lrow = row;
                                    lrow.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                                    lrow.Cells[0].CellFormat.FitText = false;
                                    lrow.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;
                                    Paragraph mp = lrow.Cells[2].Paragraphs[0];
                                    for (int i = 0; i < (3 * 6); i++)
                                    {
                                        if (i % 3 == 0)
                                        {
                                            (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.First;
                                            (mp.ParentNode as Cell).CellFormat.FitText = false;
                                        }
                                        else
                                            (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.Previous;

                                        mp = Util.NextCell(mp as Paragraph);
                                    }
                                    (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.First;
                                    mp = Util.NextCell(mp as Paragraph);
                                    (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.Previous;
                                }

                            }
                            else if (header.Domain == LearningDomainNameSpcAddP)
                            {
                                // 學習成績排名與百分比(加分後)
                                row.Cells[0].CellFormat.FitText = false;
                                row.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                                row.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;

                                if (PrintSetting.PrintRank || PrintSetting.PrintRankPercentage)
                                {
                                    //Row lrow = row.NextSibling as Row;

                                    Row lrow = row;
                                    lrow.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                                    lrow.Cells[0].CellFormat.FitText = false;
                                    lrow.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;
                                    Paragraph mp = lrow.Cells[2].Paragraphs[0];
                                    for (int i = 0; i < (3 * 6); i++)
                                    {
                                        if (i % 3 == 0)
                                        {
                                            (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.First;
                                            (mp.ParentNode as Cell).CellFormat.FitText = false;
                                        }
                                        else
                                            (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.Previous;

                                        mp = Util.NextCell(mp as Paragraph);
                                    }
                                    (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.First;
                                    mp = Util.NextCell(mp as Paragraph);
                                    (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.Previous;
                                }

                            }
                            else if (header.Domain==CalcMessage)
                            {
                                // 文字字串
                                row.Cells[0].CellFormat.FitText = false;
                                row.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                                row.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;
                                Row lrow = row;
                                lrow.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                                lrow.Cells[0].CellFormat.FitText = false;
                                lrow.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;
                                Paragraph mp = lrow.Cells[2].Paragraphs[0];
                                for (int i = 0; i < (3 * 6); i++)
                                {
                                   // if (i % 18 == 0)
                                        if (i % 3 == 0)
                                        {
                                            (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.First;
                                            (mp.ParentNode as Cell).CellFormat.FitText = false;
                                        }
                                        else
                                            (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.Previous;

                                    mp = Util.NextCell(mp as Paragraph);
                                }
                                (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.First;
                                mp = Util.NextCell(mp as Paragraph);
                                (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.Previous;

                            }
                            else
                            {
                                if (!hasGroup)
                                {
                                    row.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                                    row.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;
                                }
                            }
                        }

                        previousCellDomain = row.Cells[0].ToTxt();
                    }
                    #endregion

                    #endregion
                }
                else if (PrintSetting.ListMethod == ListMethod.SubjectOnly)
                {
                    #region 列印科目
                    UniqueSet<RowHeader> RowIndexs = new UniqueSet<RowHeader>();

                    foreach (SemesterData semester in student.SHistory.GetGradeYearSemester().GetSemesters(PrintSetting.PrintSemesters))
                    {
                        SemesterData sysems = new SemesterData(0, semester.SchoolYear, semester.Semester);
                        if (!student.SemestersScore.Contains(sysems)) continue;

                        SemesterScore semsscore = student.SemestersScore[sysems];

                        foreach (string strSubject in semsscore.Subject)
                        {
                            SemesterSubjectScore subject = semsscore.Subject[strSubject];

                            RowHeader header;
                            if (IsFlexible(subject.Domain))
                                header = new RowHeader("彈性課程", strSubject);
                            else
                                header = new RowHeader(subject.Domain, strSubject);

                            header.IsDomain = false;

                            if (!RowIndexs.Contains(header))
                                RowIndexs.Add(header);
                        }
                    }

                    RowHeader lheader = new RowHeader(LearningDomainName, string.Empty);
                    lheader.IsDomain = true;
                    //RowIndexs.Add(lheader);

                    //List<RowHeader> sortedHeaders = SortHeader(RowIndexs.ToList());
                    List<RowHeader> sortedHeaders = RowIndexs.ToList();

                    sortedHeaders.Sort(delegate(RowHeader x, RowHeader y)
                    {
                        Subj xx = new JHSchool.Evaluation.Subject(x.Subject, x.Domain);
                        Subj yy = new JHSchool.Evaluation.Subject(y.Subject, y.Domain);

                        return xx.CompareTo(yy);
                    });
                    //sortedHeaders.Sort(Util.SortSubject);
                    //sortedHeaders.Sort(Util.SortDomain);

                    //把學習領域放在正確的地方。
                    foreach (RowHeader eachHeader in sortedHeaders.ToArray())
                    {
                        if (IsFlexible(eachHeader.Domain))
                        {
                            int index = sortedHeaders.IndexOf(eachHeader);
                            sortedHeaders.Insert(index, lheader);
                            break;
                        }
                    }
                    if (sortedHeaders.IndexOf(lheader) < 0)
                        sortedHeaders.Add(lheader);

                    //產生 Row。
                    List<RowHeader> indexHeaders = new List<RowHeader>();
                    Row current = template;
                    int rowIndex = 0;
                    foreach (RowHeader header in sortedHeaders)
                    {
                        RowHeader indexH = header;
                        indexH.Index = rowIndex++;
                        indexHeaders.Add(indexH);

                        Row datarow = table.InsertBefore(template.Clone(true), current) as Row;

                        if (header.Domain == LearningDomainName)
                        {
                            string headerName = string.Empty;

                            if (PrintSetting.PrintRank)
                                headerName = "學習領域排名";

                            if (PrintSetting.PrintRankPercentage)
                                headerName = "學習領域百分比";

                            if (PrintSetting.PrintRank && PrintSetting.PrintRankPercentage)
                                headerName = "學習領域排名/百分比";

                            if (PrintSetting.PrintRank || PrintSetting.PrintRankPercentage)
                            {
                                Row lrow = table.InsertAfter(template.Clone(true), datarow) as Row;
                                lrow.Cells[0].Write(builder, headerName);
                                rowIndex++;
                            }
                        }

                        if (IsFlexible(header.Domain))
                        {
                            datarow.Cells[0].Write(builder, header.Domain);
                            datarow.Cells[1].Write(builder, header.Subject);
                        }
                        else if (header.Domain == LearningDomainName)
                            datarow.Cells[0].Write(builder, header.Domain);
                        else
                            datarow.Cells[0].Write(builder, header.Subject);
                    }

                    //填資料
                    Row RatingRow = null;
                    foreach (RowHeader header in indexHeaders)
                    {
                        SemesterDataCollection semesters = new SemesterDataCollection();
                        Row row = table.Rows[header.Index + 3];
                        foreach (SemesterData semester in student.SHistory.GetGradeYearSemester().GetSemesters(PrintSetting.PrintSemesters))
                        {
                            SemesterData sysems = new SemesterData(0, semester.SchoolYear, semester.Semester);
                            semesters.Add(sysems);

                            if (!student.SemestersScore.Contains(sysems)) continue;
                            if (!student.HeaderList.ContainsKey(sysems)) continue;

                            int columnIndex = student.HeaderList[sysems];
                            SemesterScore semsscore = student.SemestersScore[sysems];

                            decimal? score = null;
                            decimal? weight = null;

                            if (header.IsDomain)
                            {
                                if (semsscore.Domain.Contains(header.Domain))
                                {
                                    score = semsscore.Domain[header.Domain].Value;
                                    weight = semsscore.Domain[header.Domain].Weight;
                                }
                            }
                            else
                            {
                                if (semsscore.Subject.Contains(header.Subject))
                                {
                                    score = semsscore.Subject[header.Subject].Value;
                                    weight = semsscore.Subject[header.Subject].Weight;
                                }
                            }

                            if (header.Domain == LearningDomainName)
                            {
                                score = semsscore.LearnDomainScore;

                                row.Cells[columnIndex * 3 + 2].CellFormat.FitText = false;
                                row.Cells[columnIndex * 3 + 2].CellFormat.HorizontalMerge = CellMerge.First;
                                row.Cells[columnIndex * 3 + 3].CellFormat.HorizontalMerge = CellMerge.Previous;

                                if (!score.HasValue) continue;

                                row.Cells[columnIndex * 3 + 2].Write(builder, ((double)score) + "");
                                row.Cells[columnIndex * 3 + 4].Write(builder, (Util.GetDegree(score.Value)));

                                if (PrintSetting.PrintRank || PrintSetting.PrintRankPercentage)
                                    RatingRow = row.NextSibling as Row;
                            }
                            else
                            {
                                if (!score.HasValue) continue;
                                if (!weight.HasValue) weight = 0;

                                row.Cells[columnIndex * 3 + 2].Write(builder, ((double)weight) + "");
                                row.Cells[columnIndex * 3 + 3].Write(builder, ((double)score) + "");
                                row.Cells[columnIndex * 3 + 4].Write(builder, (Util.GetDegree(score.Value)));
                            }
                        }

                        //算平均...
                        decimal? avgScore = null;
                        if (header.IsDomain)
                        {
                            if (header.Domain == LearningDomainName)
                            {
                                avgScore = student.SemestersScore.AvgLearningDomainScore(semesters);

                                if (!avgScore.HasValue) continue;

                                if (student.CalculationRule == null)
                                    avgScore = Math.Round(avgScore.Value, 2, MidpointRounding.AwayFromZero);
                                else
                                    avgScore = student.CalculationRule.ParseLearnDomainScore(avgScore.Value);
                            }
                            else
                            {
                                avgScore = student.SemestersScore.AvgDomainScore(semesters, header.Domain);

                                if (!avgScore.HasValue) continue;

                                if (student.CalculationRule == null)
                                    avgScore = Math.Round(avgScore.Value, 2, MidpointRounding.AwayFromZero);
                                else
                                    avgScore = student.CalculationRule.ParseDomainScore(avgScore.Value);
                            }
                        }
                        else
                        {
                            avgScore = student.SemestersScore.AvgSubjectScore(semesters, header.Subject);

                            if (!avgScore.HasValue) continue;

                            if (student.CalculationRule == null)
                                avgScore = Math.Round(avgScore.Value, 2, MidpointRounding.AwayFromZero);
                            else
                                avgScore = student.CalculationRule.ParseSubjectScore(avgScore.Value);
                        }

                        row.Cells[20].Write(builder, (double)avgScore + "");
                        row.Cells[21].Write(builder, Util.GetDegree(avgScore.Value));
                    }
                    if (RatingRow != null)
                    {
                        PlaceCollection places = student.Places.NS("年排名");

                        foreach (SemesterData semsIndex in student.HeaderList.Keys)
                        {
                            SemesterData raw = student.HeaderList.GetSRaw(semsIndex);

                            if (raw == SemesterData.Empty) continue;

                            string placeKey = SLearningDomainParser.GetSemesterString(raw);

                            Cell datacell = RatingRow.Cells[student.HeaderList[semsIndex] * 3 + 2];

                            if (places.Contains(placeKey))
                                datacell.Write(builder, GetPlaceString(places, placeKey));
                        }

                        if (places.Contains(LearningDomainName))
                            RatingRow.Cells[20].Write(builder, GetPlaceString(places, LearningDomainName));
                    }

                    //合併相關欄位。
                    string previousCellDomain = string.Empty;
                    foreach (RowHeader header in indexHeaders)
                    {
                        Row row = table.Rows[header.Index + 3];

                        if (header.IsDomain)
                        {
                            if (header.Domain == LearningDomainName)
                            {
                                row.Cells[0].CellFormat.FitText = false;
                                row.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                                row.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;

                                if (PrintSetting.PrintRank || PrintSetting.PrintRankPercentage)
                                {
                                    Row lrow = row.NextSibling as Row;
                                    lrow.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                                    lrow.Cells[0].CellFormat.FitText = false;
                                    lrow.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;
                                    Paragraph mp = lrow.Cells[2].Paragraphs[0];
                                    for (int i = 0; i < (3 * 6); i++)
                                    {
                                        if (i % 3 == 0)
                                        {
                                            (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.First;
                                            (mp.ParentNode as Cell).CellFormat.FitText = false;
                                        }
                                        else
                                            (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.Previous;

                                        mp = Util.NextCell(mp as Paragraph);
                                    }
                                    (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.First;
                                    mp = Util.NextCell(mp as Paragraph);
                                    (mp.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.Previous;
                                }
                            }
                        }
                        else if (IsFlexible(header.Domain))
                        {
                            if (previousCellDomain == header.Domain)
                                row.Cells[0].CellFormat.VerticalMerge = CellMerge.Previous;
                            else
                                row.Cells[0].CellFormat.VerticalMerge = CellMerge.First;

                            previousCellDomain = header.Domain;
                        }
                        else
                        {
                            //row.Cells[0].CellFormat.FitText = true;
                            row.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                            row.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;
                        }
                    }
                    #endregion
                }

                template.NextSibling.Remove();
                template.Remove();
                #endregion
            }
            else if (e.FieldName == "Fix:缺曠獎懲")
            {
                #region 列印獎懲資料
                int Offset = 2;
                Row MeritA = builder.CurrentParagraph.ParentNode.ParentNode as Row;
                Row MeritB = MeritA.NextSibling as Row;
                Row MeritC = MeritB.NextSibling as Row;
                Row DemeritA = MeritC.NextSibling as Row;
                Row DemeritB = DemeritA.NextSibling as Row;
                Row DemeritC = DemeritB.NextSibling as Row;
                Row DisciplineSet = DemeritC.NextSibling as Row;
                Row DisciplineNormal = DisciplineSet.NextSibling as Row;

                foreach (SemesterData each in student.Summaries.Keys)
                {
                    XmlElement summary = student.Summaries[each];

                    if (!student.HeaderList.ContainsKey(each)) continue;

                    int ColumnIndex = student.HeaderList[each];

                    XmlElement xmlmerit = summary.SelectSingleNode("DisciplineStatistics/Merit") as XmlElement;
                    XmlElement xmldemerit = summary.SelectSingleNode("DisciplineStatistics/Demerit") as XmlElement;

                    if (xmlmerit != null)
                    {
                        if (!string.IsNullOrEmpty(GetString(xmlmerit.GetAttribute("A"))))
                            MeritA.Cells[Offset + ColumnIndex].Write(builder, GetString(xmlmerit.GetAttribute("A")));
                        if (!string.IsNullOrEmpty(GetString(xmlmerit.GetAttribute("B"))))
                            MeritB.Cells[Offset + ColumnIndex].Write(builder, GetString(xmlmerit.GetAttribute("B")));
                        if (!string.IsNullOrEmpty(GetString(xmlmerit.GetAttribute("C"))))
                            MeritC.Cells[Offset + ColumnIndex].Write(builder, GetString(xmlmerit.GetAttribute("C")));
                    }

                    if (xmldemerit != null)
                    {
                        if (!string.IsNullOrEmpty(GetString(xmldemerit.GetAttribute("A"))))
                            DemeritA.Cells[Offset + ColumnIndex].Write(builder, GetString(xmldemerit.GetAttribute("A")));
                        if (!string.IsNullOrEmpty(GetString(xmldemerit.GetAttribute("B"))))
                            DemeritB.Cells[Offset + ColumnIndex].Write(builder, GetString(xmldemerit.GetAttribute("B")));
                        if (!string.IsNullOrEmpty(GetString(xmldemerit.GetAttribute("C"))))
                            DemeritC.Cells[Offset + ColumnIndex].Write(builder, GetString(xmldemerit.GetAttribute("C")));
                    }

                    StringBuilder normalString = new StringBuilder();
                    StringBuilder setString = new StringBuilder();

                    foreach (XmlElement absence in summary.SelectNodes("AttendanceStatistics/Absence"))
                    {
                        string count = absence.GetAttribute("Count");
                        string periodType = absence.GetAttribute("PeriodType");
                        string periodName = absence.GetAttribute("Name");

                        if (string.IsNullOrEmpty(count)) continue;
                        if (!PrintAbsences.ContainsKey(periodType)) continue;
                        if (!PrintAbsences[periodType].Contains(periodName)) continue;

                        if (periodType == "一般")
                        {
                            if (normalString.Length > 0) normalString.AppendLine();
                            normalString.Append(periodName + ":" + count);
                        }
                        else if (periodType == "集會")
                        {
                            if (setString.Length > 0) setString.AppendLine();
                            setString.Append(periodName + ":" + count);
                        }
                    }

                    DisciplineNormal.Cells[Offset + ColumnIndex].Write(builder, normalString.ToString());
                    DisciplineSet.Cells[Offset + ColumnIndex].Write(builder, setString.ToString());
                }
                #endregion
            }
        }
        public void Add(JHSemesterScoreRecord record)
        {
            SemesterData semester = new SemesterData("" + record.SchoolYear, "" + record.Semester);

            //foreach (K12.Data.SubjectScore subject in record.Subjects.Values)
            //{
                //if (!_config.ContainsKey(subject.Domain)) continue;

                //if (!_config[subject.Domain].Contains(subject.Subject)) continue;
                //else
                //{
                //    if (!_removeDomains.Contains(subject.Domain))
                //        _removeDomains.Add(subject.Domain);
                //}

            //    if (!_domains.ContainsKey(subject.Subject))
            //        _domains.Add(subject.Subject, new DomainText(subject.Subject));

            //    DomainText text = _domains[subject.Subject];
            //    text.Add(semester, subject.Text);
            //}

            foreach (K12.Data.DomainScore domain in record.Domains.Values)
            {
                //if (!_config.ContainsKey(domain.Domain)) continue;
                //if (_removeDomains.Contains(domain.Domain)) continue;

                if (!_domains.ContainsKey(domain.Domain))
                    _domains.Add(domain.Domain, new DomainText(domain.Domain));

                DomainText text = _domains[domain.Domain];
                text.Add(semester, domain.Text);
            }
        }
        private void MasterWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            StudentScore.SetClassMapping();

            // 取得學生類別List
            //            List<K12.Data.StudentTagRecord> StudTagRecList = K12.Data.StudentTag.SelectByStudentIDs(StudentIDs);
            List<K12.Data.StudentTagRecord> StudTagRecList = K12.Data.StudentTag.SelectAll();

            // 過濾不排學生ID
            List<string> NonStudentIDList = DAL.DALTransfer.GetNonRankStudentIDFromUDTByStudentTag(StudTagRecList, JointAdmissionModule.DAL.DALTransfer.SchoolType.高中);
            foreach (string id in NonStudentIDList)
                if (StudentIDs.Contains(id))
                    StudentIDs.Remove(id);

            List<ReportStudent> PrintStudents = StudentIDs.ToReportStudent();

            if (Preference.PrintRank || Preference.PrintRankPercentage || Preference.FilterRankScope)
            {
                #region 如果要排名。
                //List<ReportStudent> RatingStudents = Util.GetAllStudents();
                List<ReportStudent> RatingStudents = Util.GetStudentsDef(NonStudentIDList);

                RatingStudents.ToSC().ReadSemesterScore(this);
                RatingStudents.ToSC().ReadSemesterHistory(this);

                List<IScoreParser<ReportStudent>> parsers = new List<IScoreParser<ReportStudent>>();
                List<SLearningDomainParser> allsems = new List<SLearningDomainParser>();

                parsers.Add(new LearningDomainParser(Preference.PrintSemesters));
                allsems.Add(new SLearningDomainParser(1, 1));
                allsems.Add(new SLearningDomainParser(1, 2));
                allsems.Add(new SLearningDomainParser(2, 1));
                allsems.Add(new SLearningDomainParser(2, 2));
                allsems.Add(new SLearningDomainParser(3, 1));
                allsems.Add(new SLearningDomainParser(3, 2));
                allsems.Add(new SLearningDomainParser(7, 1));
                allsems.Add(new SLearningDomainParser(7, 2));
                allsems.Add(new SLearningDomainParser(8, 1));
                allsems.Add(new SLearningDomainParser(8, 2));
                allsems.Add(new SLearningDomainParser(9, 1));
                allsems.Add(new SLearningDomainParser(9, 2));
                foreach (SLearningDomainParser each in allsems)
                    parsers.Add(each);

                // 將學生加入年排名
                List<RatingScope<ReportStudent>> scopes = RatingStudents.ToGradeYearScopes();
                foreach (RatingScope<ReportStudent> each in scopes)
                    foreach (IScoreParser<ReportStudent> parser in parsers)
                        each.Rank(parser, PlaceOptions.Unsequence);

                Dictionary<string, StudentScore> DicPrintStudents = PrintStudents.ToSC().ToDictionary();

                foreach (ReportStudent each in RatingStudents)
                {
                    if (DicPrintStudents.ContainsKey(each.Id))
                        DicPrintStudents[each.Id] = each;

                    //each.Places["學習領域"].Percentage
                    //each.Places["學習領域"].GetPercentage();
                    //each.Places["學習領域"].Score
                }

                // 整理全部學生年排名
                DAL.DALTransfer.StudRankScoreDict.Clear();

                // 建立Key
                foreach (RatingScope<ReportStudent> scope in scopes)
                {
                    DAL.DALTransfer.StudRankScoreDict.Add(scope.Name, new Dictionary<string, List<JointAdmissionModule.DAL.StudRankScore>>());
                    DAL.DALTransfer.StudRankScoreDict[scope.Name].Add("學期總平均", new List<JointAdmissionModule.DAL.StudRankScore>());
                    foreach (SLearningDomainParser semsIndex in allsems)
                        DAL.DALTransfer.StudRankScoreDict[scope.Name].Add(semsIndex.Name, new List<JointAdmissionModule.DAL.StudRankScore>());
                }

                foreach (RatingScope<ReportStudent> scope in scopes)
                {
                    // 學習領域
                    foreach (ReportStudent stud in (from xx in scope where xx.Places.NS("年排名").Contains("學習領域") select xx).ToList())
                    {
                        DAL.StudRankScore srs = new JointAdmissionModule.DAL.StudRankScore();
                        srs.StudentID = stud.StudentID;
                        srs.Place = stud.Places.NS("年排名")["學習領域"];
                        DAL.DALTransfer.StudRankScoreDict[scope.Name]["學期總平均"].Add(srs);
                    }

                    foreach (SLearningDomainParser semsIndex in allsems)
                    {
                        foreach (ReportStudent stud in (from xx in scope where xx.Places.NS("年排名").Contains(semsIndex.Name) select xx).ToList())
                        {
                            DAL.StudRankScore srs = new JointAdmissionModule.DAL.StudRankScore();
                            srs.StudentID = stud.StudentID;
                            srs.Place = stud.Places.NS("年排名")[semsIndex.Name];
                            DAL.DALTransfer.StudRankScoreDict[scope.Name][semsIndex.Name].Add(srs);
                        }
                    }
                }

                //foreach (ReportStudent stud in RatingStudents)
                //{
                //-----------------
                //foreach (RatingScope<ReportStudent> scope in scopes)
                //{
                //    if (!DAL.DALTransfer.StudRankScoreDict.ContainsKey(scope.Name))
                //        DAL.DALTransfer.StudRankScoreDict.Add(scope.Name, new Dictionary<string, List<DAL.StudRankScore>>());

                //    foreach (ReportStudent stud in scope)
                //    {
                //        // 學期總平均
                //            if (stud.Places.NS("年排名").Contains("學習領域"))
                //            {
                //                DAL.StudRankScore srs = new JointAdmissionModule.DAL.StudRankScore();
                //                srs.StudentID = stud.StudentID;
                //                srs.Place = stud.Places.NS("年排名")["學習領域"];
                //                if (DAL.DALTransfer.StudRankScoreDict[scope.Name].ContainsKey("學期總平均"))
                //                {
                //                    DAL.DALTransfer.StudRankScoreDict[scope.Name]["學期總平均"].Add(srs);
                //                }
                //                else
                //                {
                //                    List<DAL.StudRankScore> srsList = new List<JointAdmissionModule.DAL.StudRankScore>();
                //                    srsList.Add(srs);
                //                    DAL.DALTransfer.StudRankScoreDict[scope.Name].Add("學期總平均", srsList);
                //                }
                //            }

                //            foreach (SLearningDomainParser semsIndex in allsems)
                //            {

                //                    if (stud.Places.NS("年排名").Contains(semsIndex.Name))
                //                    {
                //                        DAL.StudRankScore srs = new JointAdmissionModule.DAL.StudRankScore();
                //                        srs.StudentID = stud.StudentID;
                //                        srs.Place = stud.Places.NS("年排名")[semsIndex.Name];
                //                        if (DAL.DALTransfer.StudRankScoreDict[scope.Name].ContainsKey(semsIndex.Name))
                //                        {
                //                            DAL.DALTransfer.StudRankScoreDict[scope.Name][semsIndex.Name].Add(srs);
                //                        }
                //                        else
                //                        {
                //                            List<DAL.StudRankScore> srsList = new List<JointAdmissionModule.DAL.StudRankScore>();
                //                            srsList.Add(srs);
                //                            DAL.DALTransfer.StudRankScoreDict[scope.Name].Add(semsIndex.Name, srsList);
                //                        }

                //                    }
                //            }

                //    }
                //}
                //------------------------------------
                //}

                //// 排序對照年排名資料 debug 用
                //for (int i = 1; i <= 9; i++)
                //{
                //    if (DAL.DALTransfer.StudRankScoreDict.ContainsKey(i.ToString()))
                //    {
                //        string idx = i.ToString();
                //        foreach (SLearningDomainParser semsIndex in allsems)
                //        {
                //            if (DAL.DALTransfer.StudRankScoreDict[idx].ContainsKey(semsIndex.Name))
                //            {
                //                var x = from xx in DAL.DALTransfer.StudRankScoreDict[idx][semsIndex.Name] orderby xx.Place.Score descending select xx;
                //                DAL.DALTransfer.StudRankScoreDict[idx][semsIndex.Name] = x.ToList();

                //            }

                //        }
                //    }
                //}

                Workbook wb = new Workbook();
                Dictionary<string, ReportStudent> students = RatingStudents.ToDictionary(x => x.Id);
                int wstCot = 0;
                // 排序對照年排名資料 debug 用

                foreach (RatingScope<ReportStudent> scope in scopes)
                {
                    if (DAL.DALTransfer.StudRankScoreDict.ContainsKey(scope.Name))
                    {
                        string idx = scope.Name;

                        string AvggName = "學期總平均";
                        if (DAL.DALTransfer.StudRankScoreDict[idx].ContainsKey(AvggName))
                        {
                            int row = 1;

                            wb.Worksheets.Add();
                            wb.Worksheets[wstCot].Name = idx + AvggName;
                            wb.Worksheets[wstCot].Cells[0, 0].PutValue("成績");
                            wb.Worksheets[wstCot].Cells[0, 1].PutValue("年排名");
                            wb.Worksheets[wstCot].Cells[0, 2].PutValue("分類");
                            wb.Worksheets[wstCot].Cells[0, 3].PutValue("年級");
                            wb.Worksheets[wstCot].Cells[0, 4].PutValue("SID");
                            wb.Worksheets[wstCot].Cells[0, 5].PutValue("StudCount");

                            foreach (JointAdmissionModule.DAL.StudRankScore xx in DAL.DALTransfer.StudRankScoreDict[idx][AvggName].OrderByDescending(x => x.Place.Score))
                            {
                                wb.Worksheets[wstCot].Cells[row, 0].PutValue(xx.Place.Score);
                                wb.Worksheets[wstCot].Cells[row, 1].PutValue(xx.Place.Percentage);
                                wb.Worksheets[wstCot].Cells[row, 2].PutValue(AvggName);
                                wb.Worksheets[wstCot].Cells[row, 3].PutValue(idx);
                                wb.Worksheets[wstCot].Cells[row, 4].PutValue(xx.StudentID);
                                wb.Worksheets[wstCot].Cells[row, 5].PutValue(xx.Place.Radix);
                                wb.Worksheets[wstCot].Cells[row, 6].PutValue(students[xx.StudentID].GradeYear);
                                row++;
                            }
                            wstCot++;
                        }

                        foreach (SLearningDomainParser semsIndex in allsems)
                        {
                            int row = 1;

                            wb.Worksheets.Add();
                            wb.Worksheets[wstCot].Name = idx + semsIndex.Name.Replace(":", "-");
                            wb.Worksheets[wstCot].Cells[0, 0].PutValue("成績");
                            wb.Worksheets[wstCot].Cells[0, 1].PutValue("年排名");
                            wb.Worksheets[wstCot].Cells[0, 2].PutValue("分類");
                            wb.Worksheets[wstCot].Cells[0, 3].PutValue("年級");
                            wb.Worksheets[wstCot].Cells[0, 4].PutValue("SID");
                            wb.Worksheets[wstCot].Cells[0, 5].PutValue("StudCount");

                            if (DAL.DALTransfer.StudRankScoreDict[idx].ContainsKey(semsIndex.Name))
                            {
                                foreach (JointAdmissionModule.DAL.StudRankScore xx in DAL.DALTransfer.StudRankScoreDict[idx][semsIndex.Name].OrderByDescending(x => x.Place.Score))
                                {
                                    wb.Worksheets[wstCot].Cells[row, 0].PutValue(xx.Place.Score);
                                    wb.Worksheets[wstCot].Cells[row, 1].PutValue(xx.Place.Percentage);
                                    wb.Worksheets[wstCot].Cells[row, 2].PutValue(semsIndex.Name);
                                    wb.Worksheets[wstCot].Cells[row, 3].PutValue(semsIndex.Grade);
                                    wb.Worksheets[wstCot].Cells[row, 4].PutValue(xx.StudentID);
                                    wb.Worksheets[wstCot].Cells[row, 5].PutValue(xx.Place.Radix);
                                    wb.Worksheets[wstCot].Cells[row, 6].PutValue(students[xx.StudentID].GradeYear);
                                    row++;
                                }

                            }
                            wstCot++;

                        }
                    }
                }

                for (int i = 0; i < wb.Worksheets.Count; i++)
                {
                    if (wb.Worksheets[i].Cells.MaxDataRow < 2)
                        wb.Worksheets.RemoveAt(i);
                }

                try
                {
                    wb.Save(Application.StartupPath + "\\樂學成績debug.xls", FileFormatType.Excel2003);

                   // System.Diagnostics.Process.Start(Application.StartupPath + "\\樂學成績debug.xls");
                }
                catch (Exception ex)
                {

                }

                if (Preference.FilterRankScope)
                {
                    List<ReportStudent> filteredStudent = new List<ReportStudent>();
                    foreach (ReportStudent each in DicPrintStudents.Values.ToSS())
                    {
                        //看是否有「學習領域」的年排名。
                        if (each.Places.NS("年排名").Contains(LearningDomainParser.PlaceName))
                        {
                            Place place = each.Places.NS("年排名")[LearningDomainParser.PlaceName];
                            if (place.Level >= Preference.RankStart && place.Level <= Preference.RankEnd)
                                filteredStudent.Add(each);
                        }
                        PrintStudents = filteredStudent;
                    }
                }
                else
                    PrintStudents = new List<ReportStudent>(DicPrintStudents.Values.ToSS());
                #endregion
            }
            else
            {
                PrintStudents.ToSC().ReadSemesterScore(this);
                PrintStudents.ToSC().ReadSemesterHistory(this);
            }

            List<StudentScore> CalcStudents;
            if (PrintStudents.Count <= 0)
            {
                Feedback("", -1);  //把 Status bar Reset...
                throw new ArgumentException("沒有任何學生資料可列印。");
            }
            else
            {

                CalcStudents = PrintStudents.ToSC();
                CalcStudents.ReadCalculationRule(this); //讀取成績計算規則。

                #region 讀取缺曠獎懲。
                //List<JHMoralScoreRecord> jhmorals = JHSchool.Data.JHMoralScore.SelectByStudentIDs(StudentIDs);
                List<AutoSummaryRecord> jhsummary = AutoSummary.Select(StudentIDs, null);

                Dictionary<string, ReportStudent> DicStudents = PrintStudents.ToDictionary();
                //foreach (JHMoralScoreRecord each in jhmorals)
                foreach (AutoSummaryRecord each in jhsummary)
                {
                    if (!DicStudents.ContainsKey(each.RefStudentID)) continue;

                    SemesterData semester = new SemesterData(0, each.SchoolYear, each.Semester);
                    ReportStudent student = DicStudents[each.RefStudentID];

                    if (!student.Summaries.ContainsKey(semester))
                        student.Summaries.Add(semester, each.AutoSummary);
                }
                #endregion

                PrintStudents.ReadUpdateRecordDate(this);

                e.Result = new Report(PrintStudents, Preference).Print();

                Feedback("列印完成", -1);
            }
        }
        internal void Add(SemesterData semester, string text)
        {
            if (!_texts.ContainsKey(semester))
                _texts.Add(semester, string.Empty);

            if (!string.IsNullOrEmpty(text))
            {
                text = text.Replace('>', ':').Replace('<', ',');
                if (text.StartsWith(",")) text = text.Substring(1);
                _texts[semester] = text;
            }
        }
        //最好這程式有人能維護的了.......
        private void MailMerge_MergeField(object sender, MergeFieldEventArgs e)
        {
            //不是 Fix 開頭的合併欄位不處理。
            if (!e.FieldName.ToUpper().StartsWith("Fix".ToUpper())) return;

            DocumentBuilder builder = new DocumentBuilder(e.Document);

            ReportStudent student = e.FieldValue as ReportStudent;

            //如果合併值不是 ReportStudent 就跳過...意思是有問題...。
            if (student == null) return;

            builder.MoveToField(e.Field, true);
            e.Field.Remove();

            if (e.FieldName == "Fix:科目資訊")
            {
                #region 列印年級學期資訊(有點複雜)。
                SemesterDataCollection semses = student.SHistory.GetGradeYearSemester();
                //Row SemesterRow = builder.CurrentParagraph.ParentNode.ParentNode.NextSibling as Row; //下一個 Row。
                //Paragraph originParagraph = builder.CurrentParagraph;

                int count = 0;//, offset = 1;

                foreach (SemesterData each in semses)
                {
                    //string currentGradeyear = Util.GetGradeyearString(each.GradeYear.ToString());

                    ////如果沒有年級,就跳過。
                    //if (string.IsNullOrEmpty(currentGradeyear)) continue;

                    //builder.Write(currentGradeyear + "年級");
                    Paragraph nextPh = Util.NextCell(builder.CurrentParagraph);
                    if (nextPh == null) break; //沒有下一個 Cell ,就不印資料了。
                    builder.MoveTo(nextPh);

                    //Paragraph resetParagraph = builder.CurrentParagraph;
                    //SemesterRow.Cells[count + offset].Write(builder, GetSemesterString(each));

                    SemesterData semester = new SemesterData(0, each.SchoolYear, each.Semester);
                    if (!student.HeaderList.ContainsKey(semester))
                        student.HeaderList.AddRaw(each, count); //不要懷疑,這是對的。

                    //builder.MoveTo(resetParagraph);
                    count++;
                }

                //builder.MoveTo(originParagraph);
                //Paragraph nextParagrap = originParagraph;
                //string previousGradeyear = GetText(originParagraph);
                //while ((nextParagrap = Util.NextCell(nextParagrap)) != null)
                //{
                //    if (GetText(nextParagrap) == previousGradeyear)
                //        (nextParagrap.ParentNode as Cell).CellFormat.HorizontalMerge = CellMerge.Previous;

                //    previousGradeyear = GetText(nextParagrap);
                //}
                #endregion

                #region 列印科目資料(爆炸複雜)

                Row template = builder.CurrentParagraph.ParentNode.ParentNode as Row;
                Table table = template.ParentNode as Table;

                if (PrintSetting.ListMethod == ListMethod.DomainOnly)
                    PrintDomainOnly(builder, student, template, table);
                else
                    PrintSubjectOnly(builder, student, template, table);

                //設定表格下方線寬。
                double borderWidth = (template.NextSibling as Row).Cells[0].CellFormat.Borders.Bottom.LineWidth;
                foreach (Cell each in (template.PreviousSibling as Row).Cells)
                    each.CellFormat.Borders.Bottom.LineWidth = borderWidth;

                template.NextSibling.Remove();
                template.Remove();
                #endregion
            }
            if (e.FieldName == "Fix:照片")
            {
                if (student.GraduatePhoto != null)
                {
                    Shape photo = builder.InsertImage(student.GraduatePhoto);
                    Cell cell = builder.CurrentParagraph.ParentNode as Cell;
                    Row row = cell.ParentRow;

                    double rectHeight = row.RowFormat.Height, rectWidth = cell.CellFormat.Width;

                    double heightRate = (rectHeight / photo.Height);
                    double widthRate = (rectWidth / photo.Width);
                    double rate = 0;
                    if (heightRate < widthRate)
                        rate = heightRate;
                    else
                        rate = widthRate;

                    photo.Width = photo.Width * rate;
                    photo.Height = photo.Height * rate;
                }
            }
        }
 public bool Add(SemesterData semester, string text)
 {
     if (!_items.ContainsKey(semester))
     {
         _items.Add(semester, text);
         return true;
     }
     else
         return false;
 }
示例#44
0
        private void InitButton(SemesterData sems, MenuButton button)
        {
            button.Tag = sems;
            button.AutoCheckOnClick = true;
            button.AutoCollapseOnClick = true;
            button.Visible = true;

            if (InitedSet.Contains(sems))
                return;

            button.Click += Button_Click;
            InitedSet.Add(sems);
        }
 public bool Add(SemesterData semester, K12.Data.SubjectScore subject)
 {
     if (!_subjectScores.ContainsKey(subject.Subject))
         _subjectScores.Add(subject.Subject, new Dictionary<SemesterData, ScoreData>());
     if (!_subjectScores[subject.Subject].ContainsKey(semester))
     {
         _subjectScores[subject.Subject].Add(semester, new ScoreData("" + subject.Period, "" + subject.Credit, "" + subject.Score));
         return true;
     }
     return false;
 }
        private void PrintSubjectOnly(DocumentBuilder builder, ReportStudent student, Row template, Table table)
        {
            #region 列印科目
            UniqueSet<RowHeader> RowIndexs = new UniqueSet<RowHeader>();

            #region 列印 RowHeader
            Dictionary<string, string> subjToDomain = new Dictionary<string, string>();
            foreach (SemesterData semester in student.SHistory.GetGradeYearSemester())
            {
                SemesterData sysems = new SemesterData(0, semester.SchoolYear, semester.Semester);
                if (!student.SemestersScore.Contains(sysems)) continue;

                SemesterScore semsscore = student.SemestersScore[sysems];

                foreach (string strSubject in semsscore.Subject)
                {
                    SemesterSubjectScore subject = semsscore.Subject[strSubject];

                    if (!subjToDomain.ContainsKey(strSubject))
                        subjToDomain.Add(strSubject, subject.Domain);

                    RowHeader header = new RowHeader(subjToDomain[strSubject], strSubject);
                    header.IsDomain = false;

                    if (!RowIndexs.Contains(header))
                        RowIndexs.Add(header);
                }
            }

            List<RowHeader> sortedHeaders = RowIndexs.ToList();
            sortedHeaders.Sort(delegate(RowHeader x, RowHeader y)
            {
                Subj xx = new JHSchool.Evaluation.Subject(x.Subject, x.Domain);
                Subj yy = new JHSchool.Evaluation.Subject(y.Subject, y.Domain);

                return xx.CompareTo(yy);
            });

            //產生 Row。
            List<RowHeader> indexHeaders = new List<RowHeader>();
            Row current = template;
            int rowIndex = 0;
            foreach (RowHeader header in sortedHeaders)
            {
                RowHeader indexH = header;
                indexH.Index = rowIndex++;
                indexHeaders.Add(indexH);

                Row datarow = table.InsertBefore(template.Clone(true), current) as Row;

                string gn = "";
                //Additional Classes

                string subjCName = header.Subject;
                string subjEName = Subj.GetSubjectEnglish(header.Subject);
                string subjString = header.Subject + (string.IsNullOrEmpty(subjEName) ? "" : " " + subjEName);

                datarow.Cells[0].Write(builder, subjString);

                //if (IsFlexible(header.Domain))
                //{
                //    gn = "彈性課程\nAdditional Classes";
                //    //把空白的領域當成「彈性課程」。
                //    datarow.Cells[0].Write(builder, gn);
                //    datarow.Cells[1].Write(builder, subjString);
                //}
                //else
                //{
                //}
            }
            #endregion

            #region 填資料
            //填資料
            foreach (RowHeader header in indexHeaders)
            {
                SemesterDataCollection semesters = new SemesterDataCollection();
                Row row = table.Rows[header.Index + DataRowOffset];
                foreach (SemesterData semester in student.SHistory.GetGradeYearSemester())
                {
                    SemesterData sysems = new SemesterData(0, semester.SchoolYear, semester.Semester);
                    semesters.Add(sysems);

                    if (!student.SemestersScore.Contains(sysems)) continue;
                    if (!student.HeaderList.ContainsKey(sysems)) continue;

                    int columnIndex = student.HeaderList[sysems];
                    SemesterScore semsscore = student.SemestersScore[sysems];

                    decimal? score = null;
                    decimal? weight = null;

                    //if (header.IsDomain)
                    //{
                    //    if (semsscore.Domain.Contains(header.Domain))
                    //    {
                    //        score = semsscore.Domain[header.Domain].Value;
                    //        weight = semsscore.Domain[header.Domain].Weight;
                    //    }
                    //}
                    //else
                    //{
                    if (semsscore.Subject.Contains(header.Subject))
                    {
                        score = semsscore.Subject[header.Subject].Value;
                        weight = semsscore.Subject[header.Subject].Weight;
                    }
                    //}

                    if (!score.HasValue) continue;
                    if (!weight.HasValue) weight = 0;

                    if (PrintScore)
                        row.Cells[columnIndex + 2].Write(builder, score.Value + "");
                    else
                        row.Cells[columnIndex + 2].Write(builder, Util.GetDegreeEnglish(score.Value));
                }
            }
            #endregion

            #region 合併相關欄位。
            string previousCellDomain = string.Empty;
            foreach (RowHeader header in indexHeaders)
            {
                Row row = table.Rows[header.Index + DataRowOffset];

                //if (IsFlexible(header.Domain))
                //{
                //    if (previousCellDomain == row.Cells[0].ToTxt())
                //        row.Cells[0].CellFormat.VerticalMerge = CellMerge.Previous;
                //    else
                //        row.Cells[0].CellFormat.VerticalMerge = CellMerge.First;
                //}
                //else
                {
                    row.Cells[0].CellFormat.HorizontalMerge = CellMerge.First;
                    row.Cells[1].CellFormat.HorizontalMerge = CellMerge.Previous;
                }

                previousCellDomain = row.Cells[0].ToTxt();
            }
            #endregion

            #endregion
        }
 private static string GetSemesterString(SemesterData each)
 {
     return string.Format("{0} {1}", each.SchoolYear.ToString(), each.Semester == 1 ? "上" : "下");
 }