Example #1
0
        private void btnRun_Click(object sender, EventArgs e)
        {
            string SelectedSchoolYear = "" + cmbSchoolYear.SelectedItem;
            List<string> SelectedStudentIDs = K12.Presentation.NLDPanels.Student.SelectedSource;

            if (K12.Data.Utility.Utility.IsNullOrEmpty(SelectedStudentIDs))
            {
                MessageBox.Show("請選取學生!");
                return;
            }

            if (!string.IsNullOrEmpty(SelectedSchoolYear))
            {
                this.btnPrint.Enabled = false;

                Task<Document> task = Task<Document>.Factory.StartNew(() =>
                {
                    MemoryStream template = new MemoryStream(this.template);
                    Document doc = new Document();
                    doc.Sections.Clear();
                    List<string> keys = new List<string>();
                    List<object> values = new List<object>();
                    Dictionary<string, object> mergeKeyValue = new Dictionary<string,object>();
                    List<Student> Students = new List<Student>();

                    if (this.title.Contains("9"))
                        Students = DataAccess.GetGrade(SelectedSchoolYear, SelectedStudentIDs, false);
                    else
                        Students = DataAccess.GetGrade(SelectedSchoolYear, SelectedStudentIDs, true);

                    foreach (Student vStudent in Students)
                    {
                        Document dataDoc = new Document(template, "", LoadFormat.Doc, "");
                        dataDoc.MailMerge.MergeField += new Aspose.Words.Reporting.MergeFieldEventHandler(MailMerge_MergeField);
                        dataDoc.MailMerge.RemoveEmptyParagraphs = true;

                        mergeKeyValue = vStudent.OutputValue();

                        dataDoc.MailMerge.Execute(mergeKeyValue.Keys.ToArray(), mergeKeyValue.Values.ToArray());
                        doc.Sections.Add(doc.ImportNode(dataDoc.Sections[0], true));
                    }

                    return doc;
                });
                task.ContinueWith((x) =>
                {
                    this.btnPrint.Enabled = true;

                    if (x.Exception != null)
                        MessageBox.Show(x.Exception.InnerException.Message);
                    else
                        Completed(this.TitleText, x.Result);
                }, System.Threading.CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());
            }
        }
        private void btnPrint_Click(object sender, EventArgs e)
        {
            string survey_year = this.nudSchoolYear.Value + "";
            this.btnPrint.Enabled = false;
            this.circularProgress.Visible = true;
            this.circularProgress.IsRunning = true;

            Task<Document> task = Task<Document>.Factory.StartNew(() =>
            {
                MemoryStream template = new MemoryStream(this.template);
                Document doc = new Document();
                Document dataDoc = new Document(template, "", LoadFormat.Doc, "");
                dataDoc.MailMerge.MergeField += new Aspose.Words.Reporting.MergeFieldEventHandler(MailMerge_MergeField);
                dataDoc.MailMerge.RemoveEmptyParagraphs = true;
                doc.Sections.Clear();
                List<string> keys = new List<string>();
                List<object> values = new List<object>();
                Dictionary<string, object> mergeKeyValue = ApproachStatisticsCalculator
                    .Calculate(survey_year);

                foreach (string key in mergeKeyValue.Keys)
                {
                    keys.Add(key);
                    values.Add(mergeKeyValue[key]);
                }

                dataDoc.MailMerge.Execute(keys.ToArray(), values.ToArray());
                doc.Sections.Add(doc.ImportNode(dataDoc.Sections[0], true));
                return doc;
            });
            task.ContinueWith((x) =>
            {
                this.btnPrint.Enabled = true;
                this.circularProgress.Visible = false;
                this.circularProgress.IsRunning = false;

                if (x.Exception != null)
                    MessageBox.Show(x.Exception.InnerException.Message);
                else
                    Completed(this.TitleText, x.Result);
            }, System.Threading.CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());
        }
        private void btnPrint_Click(object sender, EventArgs e)
        {
            string survey_year = this.nudSchoolYear.Value + "";
            this.btnPrint.Enabled = false;
            this.circularProgress.Visible = true;
            this.circularProgress.IsRunning = true;

            Task<Dictionary<string, object>> task = Accessor.ApproachStatistics.Execute(int.Parse(survey_year));
            task.ContinueWith((x) =>
            {
                this.btnPrint.Enabled = true;
                this.circularProgress.Visible = false;
                this.circularProgress.IsRunning = false;

                if (x.Exception != null)
                    MessageBox.Show(x.Exception.InnerException.Message);
                else
                {
                    MemoryStream template = Accessor.ApproachReportTemplate.Execute(int.Parse(survey_year));
                    Document doc = new Document();
                    Document dataDoc = new Document(template, "", LoadFormat.Doc, "");
                    dataDoc.MailMerge.RemoveEmptyParagraphs = true;
                    doc.Sections.Clear();
                    List<string> keys = new List<string>();
                    List<object> values = new List<object>();
                    Dictionary<string, object> mergeKeyValue = x.Result;
                    foreach (string key in mergeKeyValue.Keys)
                    {
                        keys.Add(key);
                        values.Add(mergeKeyValue[key]);
                    }
                    dataDoc.MailMerge.Execute(keys.ToArray(), values.ToArray());
                    dataDoc.MailMerge.DeleteFields();
                    doc.Sections.Add(doc.ImportNode(dataDoc.Sections[0], true));
                    Completed(survey_year + "學年度國中畢業學生進路調查填報表格", doc);
                }
            }, System.Threading.CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());
        }
        private void btnSubjectSemesterScoreStatistics_Click(object sender, EventArgs e)
        {
            this.circularProgress.Visible = true;
            this.circularProgress.IsRunning = true;
            this.btnPrint.Enabled = false;
            int SchoolYear = int.Parse(this.nudSchoolYear.Value + "");
            int Semester = int.Parse((this.cboSemester.SelectedItem as EMBACore.DataItems.SemesterItem).Value);

            Task<Document> task = Task<Document>.Factory.StartNew(() =>
            {
                MemoryStream template = new MemoryStream(Properties.Resources.EMBA_研究生成績審核表_樣版);
                Document doc = new Document();
                doc.Sections.Clear();
                IEnumerable<StudentRecord> Students = this.dicStudents.Values.OrderBy(x => x.StudentNumber.ToLower());
                foreach (StudentRecord Student in Students)
                {
                    UDT.StudentBrief2 StudentBrief2 = new UDT.StudentBrief2();
                    if (this.dicStudentBrief2.ContainsKey(Student.ID))
                        StudentBrief2 = this.dicStudentBrief2[Student.ID];

                    Dictionary<int, UDT.GraduationSubjectList> dicGraduationSubjectLists = new Dictionary<int, UDT.GraduationSubjectList>();
                    if (this.dicStudentBrief2.ContainsKey(Student.ID))
                    {
                        if (this.dicGraduationSubjectLists.ContainsKey(StudentBrief2.GraduationRequirementID))
                            dicGraduationSubjectLists = this.dicGraduationSubjectLists[StudentBrief2.GraduationRequirementID];
                    }
                    //  非停修生修課記錄:學年度	學期	課號	課程識別碼		課程名稱
                    string SQL = string.Format(@"Select subject.uid as subject_id, course.school_year, course.semester, subject.name as subject_name From $ischool.emba.scattend_ext as se join course on course.id=se.ref_course_id
            join student on student.id=se.ref_student_id
            join $ischool.emba.course_ext as ce on ce.ref_course_id=course.id
            join $ischool.emba.subject as subject on subject.uid=ce.ref_subject_id where student.id={0} and course.school_year={1} and course.semester={2} order by ce.serial_no", Student.ID, SchoolYear, Semester);
                    DataTable dataTable = Query.Select(SQL);
                    Dictionary<string, dynamic> dicSCAttends = new Dictionary<string, dynamic>();
                    foreach (DataRow row in dataTable.Rows)
                    {
                        dynamic o = new ExpandoObject();

                        o.SchoolYear = SchoolYear;
                        o.Semester = Semester;
                        o.SubjectName = row["subject_name"] + "";
                        o.SubjectID = row["subject_id"] + "";

                        dicSCAttends.Add(SchoolYear + "-" + Semester + "-" + row["subject_id"] + "", o);
                    }

                    Document eachStudentDoc = new Document(template, "", LoadFormat.Doc, "");
                    Dictionary<string, object> mergeKeyValue = new Dictionary<string, object>();

                    #region 學生基本資料
                    mergeKeyValue.Add("學號", Student.StudentNumber);
                    mergeKeyValue.Add("姓名", Student.Name);

                    UDT.DepartmentGroup DepartmentGroup = new UDT.DepartmentGroup();
                    if (this.dicStudentBrief2.ContainsKey(Student.ID))
                    {
                        if (this.dicDepartmentGroups.ContainsKey(this.dicStudentBrief2[Student.ID].DepartmentGroupID.ToString()))
                            DepartmentGroup = this.dicDepartmentGroups[this.dicStudentBrief2[Student.ID].DepartmentGroupID.ToString()];
                    }
                    mergeKeyValue.Add("系所組別代碼", DepartmentGroup.Code);
                    mergeKeyValue.Add("組別", DepartmentGroup.Name);
                    #endregion

                    mergeKeyValue.Add("學年度", SchoolYear);
                    mergeKeyValue.Add("學期", Semester);

                    List<UDT.SubjectSemesterScore> SubjectSemesterScores = new List<UDT.SubjectSemesterScore>();
                    if (this.dicSubjectSemesterScores.ContainsKey(Student.ID))
                        SubjectSemesterScores = this.dicSubjectSemesterScores[Student.ID];

                    //  重覆修課
                    Dictionary<int, List<UDT.SubjectSemesterScore>> dicDuplicateSubjectSemesterScores = new Dictionary<int, List<UDT.SubjectSemesterScore>>();
                    foreach (UDT.SubjectSemesterScore SubjectSemesterScore in SubjectSemesterScores)
                    {
                        //  是否重覆修課
                        if (!dicDuplicateSubjectSemesterScores.ContainsKey(SubjectSemesterScore.SubjectID))
                            dicDuplicateSubjectSemesterScores.Add(SubjectSemesterScore.SubjectID, new List<UDT.SubjectSemesterScore>());
                        dicDuplicateSubjectSemesterScores[SubjectSemesterScore.SubjectID].Add(SubjectSemesterScore);
                    }

                    //mergeKeyValue.Add("抵免紀錄_上學期", SubjectSemesterScores.Where(x => !string.IsNullOrWhiteSpace(x.OffsetCourse)).Where(x => x.Semester == 1).Sum(x => x.Credit));
                    //mergeKeyValue.Add("抵免紀錄_下學期", SubjectSemesterScores.Where(x => !string.IsNullOrWhiteSpace(x.OffsetCourse)).Where(x => x.Semester == 2).Sum(x => x.Credit));
                    mergeKeyValue.Add("抵免紀錄", SubjectSemesterScores.Where(x => !string.IsNullOrWhiteSpace(x.OffsetCourse)).Sum(x => x.Credit));

                    List<UDT.SubjectSemesterScore> SubjectSemesterScores_Current_Semester = new List<UDT.SubjectSemesterScore>();
                    if (SubjectSemesterScores.Count > 0)
                        SubjectSemesterScores_Current_Semester = SubjectSemesterScores.Where(x=>string.IsNullOrEmpty(x.OffsetCourse)).Where(x => x.SchoolYear.HasValue).Where(x => x.Semester.HasValue).Where(x => (x.SchoolYear.Value == SchoolYear && x.Semester.Value == Semester)).OrderBy(x => x.SchoolYear.Value).ThenBy(x => x.Semester.Value).ToList();

                    for (int i = 1; i < 11; i++)
                    {
                        mergeKeyValue.Add("本學期必修科目_" + i, string.Empty);
                        mergeKeyValue.Add("本學期必修學分_" + i, string.Empty);
                    }
                    mergeKeyValue.Add("本學期選修總學分", string.Empty);
                    List<dynamic> present_subject_lists = new List<dynamic>();
                    foreach (string key in dicSCAttends.Keys)
                    {
                        dynamic o = dicSCAttends[key];
                        string SubjectName = o.SubjectName + "";

                        int SubjectID = int.Parse(o.SubjectID + "");

                        dynamic oo = new ExpandoObject();

                        oo.IsDeptRequired = false;
                        oo.SubjectName = SubjectName;
                        oo.SubjectID = SubjectID;
                        oo.SubjectGroup = string.Empty;

                        if (dicGraduationSubjectLists.ContainsKey(SubjectID))
                        {
                            UDT.GraduationSubjectList GraduationSubjectList = dicGraduationSubjectLists[SubjectID];
                            oo.SubjectGroup = GraduationSubjectList.SubjectGroup;
                            if (string.IsNullOrEmpty(GraduationSubjectList.SubjectGroup))
                                oo.IsRequired = false;
                            else
                                oo.IsRequired = true;
                            if (GraduationSubjectList.IsDeptRequired)
                            {
                                oo.IsDeptRequired = true;
                            }
                        }
                        else
                        {
                            oo.IsRequired = false;
                        }
                        present_subject_lists.Add(oo);
                    }

                    int credit_is_not_requred_total = 0;
                    int credit_current = 0;
                    int index = 0;
                    foreach (dynamic o in present_subject_lists.Where(x => x.IsRequired == false))
                    {
                        string SubjectID = o.SubjectID + "";
                        if (this.dicSubjects.ContainsKey(SubjectID))
                        {
                            credit_is_not_requred_total += this.dicSubjects[SubjectID].Credit;
                        }
                    }
                    foreach(dynamic o in present_subject_lists.Where(x=>x.IsDeptRequired == true))
                    {
                        index += 1;
                        if (mergeKeyValue.ContainsKey("本學期必修科目_" + index))
                            mergeKeyValue["本學期必修科目_" + index] = o.SubjectName + "";

                        string SubjectID = o.SubjectID + "";
                        if (this.dicSubjects.ContainsKey(SubjectID))
                        {
                            if (mergeKeyValue.ContainsKey("本學期必修學分_" + index))
                                mergeKeyValue["本學期必修學分_" + index] = this.dicSubjects[SubjectID].Credit;

                            credit_current += this.dicSubjects[SubjectID].Credit;
                        }
                    }
                    var group_subjects = present_subject_lists.Where(x => x.IsDeptRequired == false).Where(x => !string.IsNullOrEmpty(x.SubjectGroup + "")).GroupBy(x=>x.SubjectGroup);
                    foreach (var groupOfStudents in group_subjects)
                    {
                        index += 1;
                        if (mergeKeyValue.ContainsKey("本學期必修科目_" + index))
                            mergeKeyValue["本學期必修科目_" + index] = string.Join("或", groupOfStudents.Select(x=>x.SubjectName + ""));

                        List<int> Credits = new List<int>();
                        foreach(var g in groupOfStudents)
                        {
                            string SubjectID = g.SubjectID + "";

                            if (this.dicSubjects.ContainsKey(SubjectID))
                            {
                                if (!Credits.Contains(this.dicSubjects[SubjectID].Credit))
                                {
                                    Credits.Add(this.dicSubjects[SubjectID].Credit);
                                    credit_current += this.dicSubjects[SubjectID].Credit;
                                }
                            }
                        }
                        if (mergeKeyValue.ContainsKey("本學期必修學分_" + index))
                            mergeKeyValue["本學期必修學分_" + index] = string.Join("或", Credits);
                    }

                    //foreach (UDT.SubjectSemesterScore SubjectSemesterScore in SubjectSemesterScores_Current_Semester)
                    //{
                    //    if (!SubjectSemesterScore.IsRequired)
                    //        credit_is_not_requred_total += SubjectSemesterScore.Credit;
                    //    else
                    //    {
                    //        index += 1;
                    //        if (mergeKeyValue.ContainsKey("本學期必修科目_" + index))
                    //            mergeKeyValue["本學期必修科目_" + index] = SubjectSemesterScore.SubjectName;

                    //        if (mergeKeyValue.ContainsKey("本學期必修學分_" + index))
                    //            mergeKeyValue["本學期必修學分_" + index] = SubjectSemesterScore.Credit;
                    //    }
                    //}

                    List<UDT.SubjectSemesterScore> SubjectSemesterScores_Not_Current_Semester = new List<UDT.SubjectSemesterScore>();
                    if (SubjectSemesterScores.Count > 0)
                        SubjectSemesterScores_Not_Current_Semester = SubjectSemesterScores.Where(x => string.IsNullOrEmpty(x.OffsetCourse)).Where(x => x.SchoolYear.HasValue).Where(x => x.Semester.HasValue).Where(x => !(x.SchoolYear.Value == SchoolYear && x.Semester.Value == Semester)).OrderBy(x => x.SchoolYear.Value).ThenBy(x => x.Semester.Value).ToList();

                    for (int i = 1; i < 8; i++)
                    {
                        mergeKeyValue.Add("修業歷程之學年_" + i, string.Empty);

                        mergeKeyValue.Add("修業歷程之學期_" + i + "_" + 0, string.Empty);
                        mergeKeyValue.Add("修業歷程之學期_" + i + "_" + 1, string.Empty);
                        mergeKeyValue.Add("修業歷程之學期_" + i + "_" + 2, string.Empty);

                        mergeKeyValue.Add("修業歷程之實得學分_" + i + "_" + 0, 0);
                        mergeKeyValue.Add("修業歷程之實得學分_" + i + "_" + 1, 0);
                        mergeKeyValue.Add("修業歷程之實得學分_" + i + "_" + 2, 0);

                        mergeKeyValue.Add("畢業修業歷程之實得學分_" + i + "_" + 0, 0);
                        mergeKeyValue.Add("畢業修業歷程之實得學分_" + i + "_" + 1, 0);
                        mergeKeyValue.Add("畢業修業歷程之實得學分_" + i + "_" + 2, 0);

                        mergeKeyValue.Add("不計入畢業學分_" + i + "_" + 0, 0);
                        mergeKeyValue.Add("不計入畢業學分_" + i + "_" + 1, 0);
                        mergeKeyValue.Add("不計入畢業學分_" + i + "_" + 2, 0);
                    }
                    int idx = 0;
                    int school_year = 0;
                    int credit_total = 0;
                    Dictionary<int, int> dicSchoolYearMappings = new Dictionary<int, int>();
                    foreach (UDT.SubjectSemesterScore SubjectSemesterScore in SubjectSemesterScores_Not_Current_Semester)
                    {
                        if (school_year != SubjectSemesterScore.SchoolYear.Value)
                        {
                            idx += 1;
                            school_year = SubjectSemesterScore.SchoolYear.Value;
                        }
                        if (mergeKeyValue.ContainsKey("修業歷程之學年_" + idx))
                            mergeKeyValue["修業歷程之學年_" + idx] = SubjectSemesterScore.SchoolYear + "學年度";

                        if (mergeKeyValue.ContainsKey("修業歷程之學期_" + idx + "_" + SubjectSemesterScore.Semester.Value))
                            mergeKeyValue["修業歷程之學期_" + idx + "_" + SubjectSemesterScore.Semester.Value] = EMBACore.DataItems.SemesterItem.GetSemesterByCode(SubjectSemesterScore.Semester + "").Name;

                        if (string.IsNullOrEmpty(SubjectSemesterScore.OffsetCourse) && !SubjectSemesterScore.IsPass)
                            continue;

                        if (mergeKeyValue.ContainsKey("修業歷程之實得學分_" + idx + "_" + SubjectSemesterScore.Semester))
                            mergeKeyValue["修業歷程之實得學分_" + idx + "_" + SubjectSemesterScore.Semester] = int.Parse(mergeKeyValue["修業歷程之實得學分_" + idx + "_" + SubjectSemesterScore.Semester] + "") + SubjectSemesterScore.Credit;

                        if (mergeKeyValue.ContainsKey("畢業修業歷程之實得學分_" + idx + "_" + SubjectSemesterScore.Semester))
                            mergeKeyValue["畢業修業歷程之實得學分_" + idx + "_" + SubjectSemesterScore.Semester] = int.Parse(mergeKeyValue["畢業修業歷程之實得學分_" + idx + "_" + SubjectSemesterScore.Semester] + "") + SubjectSemesterScore.Credit;

                        credit_total += SubjectSemesterScore.Credit;

                        if (!dicSchoolYearMappings.ContainsKey(school_year))
                            dicSchoolYearMappings.Add(school_year, idx);
                    }

                    mergeKeyValue.Add("實得總學分", credit_total + SubjectSemesterScores.Where(x => !string.IsNullOrWhiteSpace(x.OffsetCourse)).Sum(x => x.Credit));
                    mergeKeyValue.Add("畢業實得總學分", credit_total + SubjectSemesterScores.Where(x => !string.IsNullOrWhiteSpace(x.OffsetCourse)).Sum(x => x.Credit));
                    mergeKeyValue.Add("應修最低畢業學分數", string.Empty);

                    if (this.dicStudentBrief2.ContainsKey(Student.ID))
                    {
                        if (this.dicGraduationRequirements.ContainsKey(this.dicStudentBrief2[Student.ID].GraduationRequirementID + ""))
                            mergeKeyValue["應修最低畢業學分數"] = this.dicGraduationRequirements[this.dicStudentBrief2[Student.ID].GraduationRequirementID + ""].RequiredCredit;
                    }

                    DateTime print_date;
                    if (!DateTime.TryParse(this.dtDueDate.Text, out print_date))
                        print_date = DateTime.Today;

                    mergeKeyValue.Add("列印日期_年", print_date.Year - 1911);
                    mergeKeyValue.Add("列印日期_月", print_date.Month.ToString("00"));
                    mergeKeyValue.Add("列印日期_日", print_date.Day.ToString("00"));

                    //  重覆修課
                    int total_credit_reduce = 0;
                    foreach (int SubjectID in dicDuplicateSubjectSemesterScores.Keys)
                    {
                        if (dicDuplicateSubjectSemesterScores[SubjectID].Count < 2)
                            continue;

                        List<UDT.SubjectSemesterScore> DuplicateSubjectSemesterScores = dicDuplicateSubjectSemesterScores[SubjectID];
                        bool init = false;
                        foreach (UDT.SubjectSemesterScore SubjectSemesterScore in DuplicateSubjectSemesterScores.OrderBy(x=>(x.SchoolYear.HasValue ? x.SchoolYear.Value : 0)).ThenBy(x=>(x.Semester.HasValue ? x.Semester.Value : 0)))
                        {
                            if (init)
                            {
                                if (dicSchoolYearMappings.ContainsKey((SubjectSemesterScore.SchoolYear.HasValue ? SubjectSemesterScore.SchoolYear.Value : 0)))
                                {
                                    mergeKeyValue["不計入畢業學分_" + dicSchoolYearMappings[(SubjectSemesterScore.SchoolYear.HasValue ? SubjectSemesterScore.SchoolYear.Value : 0)] + "_" + (SubjectSemesterScore.Semester.HasValue ? SubjectSemesterScore.Semester.Value : 0)] = SubjectSemesterScore.Credit;
                                    total_credit_reduce += SubjectSemesterScore.Credit;
                                    int oCredit = int.Parse(mergeKeyValue["畢業修業歷程之實得學分_" + dicSchoolYearMappings[(SubjectSemesterScore.SchoolYear.HasValue ? SubjectSemesterScore.SchoolYear.Value : 0)] + "_" + (SubjectSemesterScore.Semester.HasValue ? SubjectSemesterScore.Semester.Value : 0)] + "");
                                    mergeKeyValue["畢業修業歷程之實得學分_" + dicSchoolYearMappings[(SubjectSemesterScore.SchoolYear.HasValue ? SubjectSemesterScore.SchoolYear.Value : 0)] + "_" + (SubjectSemesterScore.Semester.HasValue ? SubjectSemesterScore.Semester.Value : 0)] = oCredit - SubjectSemesterScore.Credit;
                                }
                            }

                            init = true;
                        }
                    }
                    mergeKeyValue.Add("不計入畢業總學分", total_credit_reduce);
                    mergeKeyValue["畢業實得總學分"] = int.Parse(mergeKeyValue["畢業實得總學分"] + "") - total_credit_reduce;

                    int lowest_credit = 0;
                    int.TryParse(mergeKeyValue["應修最低畢業學分數"] + "", out lowest_credit);
                    int credit_differ = lowest_credit - int.Parse(mergeKeyValue["畢業實得總學分"] + "");
                    if (credit_differ > 0)
                        mergeKeyValue["本學期選修總學分"] = credit_differ - credit_current; // credit_is_not_requred_total;
                    else
                        mergeKeyValue["本學期選修總學分"] = 0;

                    eachStudentDoc.MailMerge.MergeField += new Aspose.Words.Reporting.MergeFieldEventHandler(MailMerge_MergeField);
                    eachStudentDoc.MailMerge.RemoveEmptyParagraphs = true;

                    List<string> keys = new List<string>();
                    List<object> values = new List<object>();

                    foreach (string key in mergeKeyValue.Keys)
                    {
                        keys.Add(key);
                        values.Add(mergeKeyValue[key]);
                    }
                    eachStudentDoc.MailMerge.Execute(keys.ToArray(), values.ToArray());

                    doc.Sections.Add(doc.ImportNode(eachStudentDoc.Sections[0], true));
                }
                return doc;
            });
            task.ContinueWith((x) =>
            {
                this.circularProgress.Visible = false;
                this.circularProgress.IsRunning = false;
                this.btnPrint.Enabled = true;

                if (x.Exception != null)
                    MessageBox.Show(x.Exception.InnerException.Message);
                else
                    Completed("畢業生成績審核表", x.Result);
            }, System.Threading.CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());
        }
        void _bgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            UDTTransfer _UDTTransfer = new UDTTransfer();
            // 清空暫存 table
            _dtTable.Clear();
            _dtTable.Columns.Clear();
            _ErrorList.Clear();
            // 新增欄位
            AddTableSColumn();

            Document docTemplae = new Document();

            // 檢查所使用樣板
            if(_SelectTemplateType == SelectTemplateType.預設)
                docTemplae = new Document(new MemoryStream(Properties.Resources.輔導資料紀錄表範本));

            if (_SelectTemplateType == SelectTemplateType.自訂)
                docTemplae = _Config.Template.ToDocument();

            _bgWorker.ReportProgress(1);
            // 加入樣板內合併欄位名稱
            _TemplateFieldDict.Clear();
            foreach (string name in docTemplae.MailMerge.GetFieldNames())
                if (!_TemplateFieldDict.ContainsKey(name))
                    _TemplateFieldDict.Add(name, 1);

            // word 資料合併
            Document doc = new Document();
            doc.Sections.Clear();

            // 讀取需要資料並建立索引
            _StudRecDict.Clear();
            foreach (StudentRecord rec in Student.SelectByIDs(_StudentIDList))
                _StudRecDict.Add(rec.ID, rec);

            // 學習歷程
            _SemesterHistoryRecordDict.Clear();
            foreach (SemesterHistoryRecord rec in SemesterHistory.SelectByStudentIDs(_StudentIDList))
            {
                if (!_SemesterHistoryRecordDict.ContainsKey(rec.RefStudentID))
                    // 排序
                    rec.SemesterHistoryItems = (from data in rec.SemesterHistoryItems orderby data.SchoolYear, data.Semester select data).ToList();
                    _SemesterHistoryRecordDict.Add(rec.RefStudentID, rec);
            }

            // 建立地址
            _AddressRecordDict.Clear();
            foreach (AddressRecord rec in Address.SelectByStudentIDs(_StudentIDList))
                _AddressRecordDict.Add(rec.RefStudentID, rec);

            // 建立電話
            _PhoneRecordDict.Clear();
            foreach (PhoneRecord rec in Phone.SelectByStudentIDs(_StudentIDList))
                _PhoneRecordDict.Add(rec.RefStudentID, rec);

            // 建立異動
            _UpdateRecordRecordDict.Clear();
            foreach (UpdateRecordRecord rec in UpdateRecord.SelectByStudentIDs(_StudentIDList))
            {
                if (!_UpdateRecordRecordDict.ContainsKey(rec.StudentID))
                    _UpdateRecordRecordDict.Add(rec.StudentID, new List<UpdateRecordRecord>());

                _UpdateRecordRecordDict[rec.StudentID].Add(rec);

            }
            _UpdateRecordRecordInfoDict.Clear();
            _UpdateRecordRecordInfoDict = Utility.GetUpdateRecordInfo(_StudentIDList);

            // 建立AutoSummary
            _AutoSummaryRecordDict.Clear();
            foreach (K12.BusinessLogic.AutoSummaryRecord rec in K12.BusinessLogic.AutoSummary.Select(_StudentIDList, null))
            {
                if (!_AutoSummaryRecordDict.ContainsKey(rec.RefStudentID))
                    _AutoSummaryRecordDict.Add(rec.RefStudentID, new List<K12.BusinessLogic.AutoSummaryRecord>());

                _AutoSummaryRecordDict[rec.RefStudentID].Add(rec);
            }

            // 建立文字評量
            _StudentTextScoreDict.Clear();
            _StudentTextScoreDict = Utility.GetABCard_StudentTextScoreDict(_StudentIDList);

            //// 建立缺曠
            //_AttendanceRecordDict.Clear();
            //foreach (AttendanceRecord rec in Attendance.SelectByStudentIDs(_StudentIDList))
            //{
            //    if (!_AttendanceRecordDict.ContainsKey(rec.RefStudentID))
            //        _AttendanceRecordDict.Add(rec.RefStudentID, new List<AttendanceRecord>());

            //    _AttendanceRecordDict[rec.RefStudentID].Add(rec);
            //}

            // 學期
            _SemesterScoreRecordDict.Clear();
            foreach (SemesterScoreRecord data in SemesterScore.SelectByStudentIDs(_StudentIDList))
            {
                if (!_SemesterScoreRecordDict.ContainsKey(data.RefStudentID))
                    _SemesterScoreRecordDict.Add(data.RefStudentID,new List<SemesterScoreRecord> ());

                _SemesterScoreRecordDict[data.RefStudentID].Add(data);
            }

            _SemesterDomainScoreDict.Clear();
            // 國中
            _SemesterDomainScoreDict = Utility.GetSemeterDomainScoreByStudentIDList(_StudentIDList);
            // 高中
            _SemesterEnrtyScoreDict = Utility.GetSemeterEntryScoreByStudentIDList(_StudentIDList);
            _SemesterEnrtyScoreSchoolYearDict = Utility.GetSemeterSchoolYearScoreByStudentIDList(_StudentIDList);

            // 國中畢業成績
            _GradeScoreDict.Clear();
            _GradeScoreDict = Utility.GetStudGraduateDictJH(_StudentIDList);

            // 高中畢業
            _GradeScoreSHDict.Clear();
            _GradeScoreSHDict = Utility.GetGradeScoreSHByStudentIDList(_StudentIDList);

            // 建立獎懲明細
            _DisciplineRecordDict.Clear();
            foreach (DisciplineRecord rec in Discipline.SelectByStudentIDs(_StudentIDList))
            {
                if(!_DisciplineRecordDict.ContainsKey(rec.RefStudentID))
                    _DisciplineRecordDict.Add(rec.RefStudentID, new List<DisciplineRecord>());

                _DisciplineRecordDict[rec.RefStudentID].Add(rec);
            }
            // 入學照片
            _FreshmanPhotoDict.Clear();
            _FreshmanPhotoDict = K12.Data.Photo.SelectFreshmanPhoto(_StudentIDList);

            // 畢業照片
            _GraduatePhotoDict.Clear();
            _GraduatePhotoDict = K12.Data.Photo.SelectGraduatePhoto(_StudentIDList);

            // 學校名稱
            string SchoolName = K12.Data.School.ChineseName;

            // 輔導資料
            // 建立心理測驗
            _QuizDefDict.Clear();
            foreach(UDT_QuizDef da in _UDTTransfer.GetAllQuizData())
            {
                int id=int.Parse(da.UID);
                _QuizDefDict.Add(id, da);
            }

            _StudQuizDataDict.Clear();
            foreach (UDT_StudQuizDataDef data in _UDTTransfer.GetStudQuizDataByStudentIDList(_StudentIDList))
            {
                string sid = data.StudentID.ToString();
                if (!_StudQuizDataDict.ContainsKey(sid))
                    _StudQuizDataDict.Add(sid, new List<UDT_StudQuizDataDef>());

                _StudQuizDataDict[sid].Add(data);
            }

            // 建立晤談記錄
            _CounselStudentInterviewRecordDict.Clear();
            foreach (UDT_CounselStudentInterviewRecordDef data in _UDTTransfer.GetCounselStudentInterviewRecordByStudentIDList(_StudentIDList))
            {
                string key = data.StudentID.ToString();
                if (!_CounselStudentInterviewRecordDict.ContainsKey(key))
                    _CounselStudentInterviewRecordDict.Add(key, new List<UDT_CounselStudentInterviewRecordDef>());

                _CounselStudentInterviewRecordDict[key].Add(data);
            }

            // 個案會議
            _CounselCaseMeetingRecordDict.Clear();
            foreach (UDT_CounselCaseMeetingRecordDef data in _UDTTransfer.GetCaseMeetingRecordListByStudentIDList(_StudentIDList))
            {
                string key = data.StudentID.ToString();
                if (!_CounselCaseMeetingRecordDict.ContainsKey(key))
                    _CounselCaseMeetingRecordDict.Add(key, new List<UDT_CounselCaseMeetingRecordDef>());

                _CounselCaseMeetingRecordDict[key].Add(data);
            }

            // 優先關懷
            _CounselCareRecordDict.Clear();
            foreach (UDT_CounselCareRecordDef data in _UDTTransfer.GetCareRecordsByStudentIDList(_StudentIDList))
            {
                string key = data.StudentID.ToString();
                if (!_CounselCareRecordDict.ContainsKey(key))
                    _CounselCareRecordDict.Add(key, new List<UDT_CounselCareRecordDef>());

                _CounselCareRecordDict[key].Add(data);
            }

            // 綜合紀錄表-單值
            _SingleRecordDict.Clear();
            foreach (UDTSingleRecordDef data in UDTTransfer.ABUDTSingleRecordSelectByStudentIDList(_StudentIDList))
            {
                string key = data.StudentID.ToString();
                if (!_SingleRecordDict.ContainsKey(key))
                    _SingleRecordDict.Add(key, new List<UDTSingleRecordDef>());

                _SingleRecordDict[key].Add(data);

            }

            // 綜合紀錄表-多值
            _MultipleRecordDict.Clear();
            foreach (UDTMultipleRecordDef data in UDTTransfer.ABUDTMultipleRecordSelectByStudentIDList(_StudentIDList))
            {
                string key = data.StudentID.ToString();
                if (!_MultipleRecordDict.ContainsKey(key))
                    _MultipleRecordDict.Add(key, new List<UDTMultipleRecordDef>());

                _MultipleRecordDict[key].Add(data);
            }

            // 綜合紀錄表-學期
            _SemesterDataDict.Clear();
            foreach (UDTSemesterDataDef data in UDTTransfer.ABUDTSemesterDataSelectByStudentIDList(_StudentIDList))
            {
                string key = data.StudentID.ToString();
                if (!_SemesterDataDict.ContainsKey(key))
                    _SemesterDataDict.Add(key, new List<UDTSemesterDataDef>());

                _SemesterDataDict[key].Add(data);
            }

            // 綜合紀錄表-學年
            _YearlyDataDict.Clear();
            foreach (UDTYearlyDataDef data in UDTTransfer.ABUDTYearlyDataSelectByStudentIDList(_StudentIDList))
            {
                string key = data.StudentID.ToString();
                if (!_YearlyDataDict.ContainsKey(key))
                    _YearlyDataDict.Add(key, new List<UDTYearlyDataDef>());

                _YearlyDataDict[key].Add(data);
            }

            // 綜合紀錄表-直系血親
            _RelativeDict.Clear();
            foreach (UDTRelativeDef data in UDTTransfer.ABUDTRelativeSelectByStudentIDList(_StudentIDList))
            {
                string key = data.StudentID.ToString();
                if (!_RelativeDict.ContainsKey(key))
                    _RelativeDict.Add(key, new List<UDTRelativeDef>());

                _RelativeDict[key].Add(data);
            }

            // 綜合紀錄表-兄弟姊妹
            _SiblingDict.Clear();
            foreach (UDTSiblingDef data in UDTTransfer.ABUDTSiblingSelectByStudentIDList(_StudentIDList))
            {
                string key = data.StudentID.ToString();
                if (!_SiblingDict.ContainsKey(key))
                    _SiblingDict.Add(key, new List<UDTSiblingDef>());

                _SiblingDict[key].Add(data);
            }

            // 綜合紀錄表-優先順序
            _PriorityDataDict.Clear();
            foreach (UDTPriorityDataDef data in UDTTransfer.ABUDTPriorityDataSelectByStudentIDList(_StudentIDList))
            {
                string key = data.StudentID.ToString();
                if (!_PriorityDataDict.ContainsKey(key))
                    _PriorityDataDict.Add(key, new List<UDTPriorityDataDef>());

                _PriorityDataDict[key].Add(data);
            }

            _bgWorker.ReportProgress(30);

            // 儲存獎懲明細使用
            StringBuilder sbDisciplineRecord = new StringBuilder();

            // 開始填入資料
            int idx = 1;
            foreach (string StudID in _StudentIDList)
            {
                _ErrMsg1 = "";
                DataRow row = _dtTable.NewRow();

                row["學校名稱"] = SchoolName;

                row["姓名"] = "";
                row["性別"] = "";
                row["學號"] = "";
                row["身分證號"] = "";
                row["生日"] = "";
                row["生日2"] = "";
                row["出生地"] = "";
                if (_StudRecDict.ContainsKey(StudID))
                {
                    _ErrMsg1=_StudRecDict[StudID].Name+":";
                    row["姓名"] = _StudRecDict[StudID].Name;
                    row["性別"] = _StudRecDict[StudID].Gender;
                    row["學號"] = _StudRecDict[StudID].StudentNumber;
                    row["身分證號"] = _StudRecDict[StudID].IDNumber;
                    if (_StudRecDict[StudID].Birthday.HasValue)
                    {
                        row["生日"] = _StudRecDict[StudID].Birthday.Value.ToShortDateString();
                        // 100/1/1
                        row["生日2"] = (_StudRecDict[StudID].Birthday.Value.Year - 1911) + "/" + _StudRecDict[StudID].Birthday.Value.Month + "/" + _StudRecDict[StudID].Birthday.Value.Day;
                    }
                    row["出生地"] = _StudRecDict[StudID].BirthPlace;
                }

                row["入學照片"] = "";
                row["入學照片2"] = "";

                if (_FreshmanPhotoDict.ContainsKey(StudID))
                {
                    row["入學照片"] = _FreshmanPhotoDict[StudID];
                    row["入學照片2"] = _FreshmanPhotoDict[StudID];
                }
                if(_GraduatePhotoDict.ContainsKey(StudID))
                {
                    row["畢業照片"] = _GraduatePhotoDict[StudID];
                    row["畢業照片2"] = _GraduatePhotoDict[StudID];
                }

                row["戶籍地址"] = "";
                row["聯絡地址"] = "";
                row["戶籍電話"] = "";
                row["聯絡電話"] = "";
                if (_AddressRecordDict.ContainsKey(StudID))
                {
                    row["戶籍地址"] = _AddressRecordDict[StudID].PermanentAddress;
                    row["聯絡地址"] = _AddressRecordDict[StudID].MailingAddress;
                }
                if (_PhoneRecordDict.ContainsKey(StudID))
                {
                    row["戶籍電話"] = _PhoneRecordDict[StudID].Permanent;
                    row["聯絡電話"] = _PhoneRecordDict[StudID].Contact;
                }

                idx = 1;
                // 學習歷程
                foreach (SemesterHistoryItem item in _SemesterHistoryRecordDict[StudID].SemesterHistoryItems)
                {
                    // 檢查料是否超過可合併欄位
                    ChechMapFieldName("學習歷程_學年度", idx);
                    ChechMapFieldName("學習歷程_學期", idx);
                    ChechMapFieldName("學習歷程_班級", idx);
                    ChechMapFieldName("學習歷程_班導師", idx);

                    row["學習歷程_學年度" + idx] = item.SchoolYear;
                    row["學習歷程_學期" + idx] = item.Semester;
                    row["學習歷程_班級" + idx] = item.ClassName;
                    row["學習歷程_班導師" + idx] = item.Teacher;
                    idx++;
                }

                row["入學年月"] = "";
                row["入學學校"] = "";
                row["畢業年月"] = "";
                row["學籍核准文號"] = "";
                row["畢業證書字號"] = "";
                idx = 1;
                // 異動高中
                if (_UpdateRecordRecordDict.ContainsKey(StudID) && _UpdateRecordRecordDict[StudID].Count>0)
                {

                    DateTime dtLast = DateTime.MinValue;
                    int lastUID = 0;
                    foreach (UpdateRecordRecord rec in _UpdateRecordRecordDict[StudID])
                    {
                        if (rec.UpdateCode.Length < 3)
                            continue;

                        int code = int.Parse(rec.UpdateCode);
                        DateTime dt = DateTime.Parse(rec.UpdateDate);

                        // 新生
                        if (code < 100)
                        {
                            row["入學年月"] = dt.Year + string.Format("{0:00}", dt.Month);

                            if (_UpdateRecordRecordInfoDict[rec.ID].Element("GraduateSchool") != null)
                                row["入學學校"] = _UpdateRecordRecordInfoDict[rec.ID].Element("GraduateSchool").Value;  // 畢

                            if(row["學籍核准文號"].ToString()=="")
                                row["學籍核准文號"] = rec.ADNumber;

                            //row["入學學校"] = rec.;  // 畢業國中
                        }
                        else if (code == 501)
                        {
                            // 畢業
                            row["畢業年月"] = dt.Year + string.Format("{0:00}", dt.Month);
                            //row["畢業證書字號"] = rec.GraduateCertificateNumber;
                        }
                        else
                        {
                            // 找最後一筆
                            DateTime dtL;
                            if (DateTime.TryParse(rec.LastADDate, out dtL))
                            {
                                if (dtLast == null)
                                    dtLast = dtL;
                                int uid = int.Parse(rec.ID);
                                if (dtL >=dtLast)
                                {
                                    if (uid > lastUID)
                                    {
                                        row["學籍核准文號"] = rec.LastADNumber;
                                        dtLast = dtL;
                                        lastUID = uid;
                                    }
                                }
                            }
                            // 檢查料是否超過可合併欄位
                            ChechMapFieldName("異動日期", idx);
                            ChechMapFieldName("異動原因", idx);
                            row["異動日期" + idx] = dt.ToShortDateString();
                            row["異動原因" + idx] = rec.UpdateDescription;
                            idx++;
                        }
                    }
                }

                // 異動國中
                if (_UpdateRecordRecordDict.ContainsKey(StudID) && _UpdateRecordRecordDict[StudID].Count > 0)
                {
                    DateTime dtLast1 = DateTime.MinValue;
                    int lastUID1=0;
                    foreach (UpdateRecordRecord rec in _UpdateRecordRecordDict[StudID])
                    {
                        if (rec.UpdateCode.Length > 1)
                            continue;

                        int code = int.Parse(rec.UpdateCode);
                        DateTime dt = DateTime.Parse(rec.UpdateDate);

                        // 新生
                        if (code == 1)
                        {
                            if (_UpdateRecordRecordInfoDict.ContainsKey(rec.ID))
                            {
                                if (_UpdateRecordRecordInfoDict[rec.ID].Element("EnrollmentSchoolYear") != null)
                                    row["入學年月"] = _UpdateRecordRecordInfoDict[rec.ID].Element("EnrollmentSchoolYear").Value;
                                if (_UpdateRecordRecordInfoDict[rec.ID].Element("GraduateSchool") != null)
                                    row["入學學校"] = _UpdateRecordRecordInfoDict[rec.ID].Element("GraduateSchool").Value;  // 畢

                                if (row["學籍核准文號"].ToString() == "")
                                    row["學籍核准文號"] = rec.ADNumber;
                            }
                        }
                        else if (code == 2)
                        {
                            // 畢業
                            if (_UpdateRecordRecordInfoDict.ContainsKey(rec.ID))
                            {
                                if (_UpdateRecordRecordInfoDict[rec.ID].Element("GraduateSchoolYear") != null)
                                    row["畢業年月"] = _UpdateRecordRecordInfoDict[rec.ID].Element("GraduateSchoolYear").Value;

                                if (_UpdateRecordRecordInfoDict[rec.ID].Element("GraduateCertificateNumber") != null)
                                    row["畢業證書字號"] = _UpdateRecordRecordInfoDict[rec.ID].Element("GraduateCertificateNumber").Value;
                            }
                            //row["畢業年月"] = rec.GraduateSchoolYear;
                            //row["畢業證書字號"] = rec.GraduateCertificateNumber;
                        }
                        else
                        {
                            //// 找最後一筆
                            //DateTime dtL;
                            //if (DateTime.TryParse(rec.LastADDate, out dtL))
                            //{
                            //    if (dtLast1 == null)
                            //        dtLast1 = dtL;

                            //    if (dtL >= dtLast1)
                            //    {
                            //        row["學籍核准文號"] = rec.LastADNumber;
                            //        dtLast1 = dtL;
                            //    }
                            //}
                            // 檢查料是否超過可合併欄位
                            ChechMapFieldName("異動日期", idx);
                            ChechMapFieldName("異動原因", idx);
                            row["異動日期" + idx] = dt.ToShortDateString();
                            row["異動原因" + idx] = rec.UpdateDescription;
                            idx++;
                        }
                        // 找最後一筆
                        DateTime dtL;
                        if (DateTime.TryParse(rec.LastADDate, out dtL))
                        {
                            int uid=int.Parse(rec.ID);
                            if (dtLast1 == null)
                                dtLast1 = dtL;

                            if (dtL >= dtLast1)
                            {
                                if (uid > lastUID1)
                                {
                                    row["學籍核准文號"] = rec.LastADNumber;
                                    dtLast1 = dtL;
                                    lastUID1 = uid;
                                }
                            }
                        }
                    }
                }

                if (_SemesterScoreRecordDict.ContainsKey(StudID))
                {
                    List<SemesterScoreRecord> dataList = (from da in _SemesterScoreRecordDict[StudID] orderby da.SchoolYear, da.Semester select da).ToList();
                    int i = 1;
                    foreach (SemesterScoreRecord rec in dataList)
                    {
                        // 國中成績
                        if (_SemesterDomainScoreDict.ContainsKey(rec.ID))
                        {

                            // 檢查料是否超過可合併欄位
                            ChechMapFieldName("學年學期", i);
                            ChechMapFieldName("學期成績", i);
                            List<string> strList = new List<string>();

                            row["學年學期" + i] = rec.SchoolYear + "學年第" + rec.Semester + "學期";

                            if (_SemesterDomainScoreDict[rec.ID].Element("Domains") != null)
                            {
                                foreach (XElement elm in _SemesterDomainScoreDict[rec.ID].Element("Domains").Elements("Domain"))
                                {
                                    string str = elm.Attribute("領域").Value + ":" + elm.Attribute("成績").Value;
                                    strList.Add(str);
                                }
                            }
                            if (strList.Count > 0)
                                row["學期成績" + i] = string.Join(",", strList.ToArray());
                            i++;
                        }
                    }
                }
                    // 高中分項
                    if (_SemesterEnrtyScoreSchoolYearDict.ContainsKey(StudID))
                    {
                        List<AB_SchoolYearSemesterIdx> dataList = (from da in _SemesterEnrtyScoreSchoolYearDict[StudID] orderby da.SchoolYear, da.Semester select da).ToList();
                        int i = 1;
                        foreach (AB_SchoolYearSemesterIdx rec in dataList)
                        {
                            if (_SemesterEnrtyScoreDict.ContainsKey(rec.id))
                            {
                                    if (_SemesterEnrtyScoreDict[rec.id].Elements("Entry").Count() > 0)
                                    {
                                        // 檢查料是否超過可合併欄位
                                        ChechMapFieldName("學年學期", i);
                                        ChechMapFieldName("學期成績", i);
                                        List<string> strList = new List<string>();

                                        row["學年學期" + i] = rec.SchoolYear + "學年第" + rec.Semester + "學期";

                                        foreach (XElement elm in _SemesterEnrtyScoreDict[rec.id].Elements("Entry"))
                                        {
                                            string str = elm.Attribute("分項").Value + ":" + elm.Attribute("成績").Value;
                                            strList.Add(str);
                                        }

                                        if (strList.Count > 0)
                                            row["學期成績" + i] = string.Join(",", strList.ToArray());
                                        i++;
                                    }
                            }
                        }
                    }

                // 國中畢業成績
                if (_GradeScoreDict.ContainsKey(StudID))
                {
                    if (_GradeScoreDict[StudID].Count > 0)
                    {
                        List<string> strList = new List<string>();

                        foreach (KeyValuePair<string, decimal?> data in _GradeScoreDict[StudID])
                        {
                            if (data.Value.HasValue)
                                strList.Add(data.Key + ":" + data.Value.Value);
                        }
                        row["畢業成績"] = string.Join(",", strList.ToArray());
                    }
                }

                // 高中畢業成績
                if (_GradeScoreSHDict.ContainsKey(StudID))
                {
                    if (_GradeScoreSHDict[StudID].Elements("EntryScore").Count() > 0)
                    {
                        List<string> strList = new List<string>();
                        foreach (XElement elm in _GradeScoreSHDict[StudID].Elements("EntryScore"))
                        {
                            if (elm.Attribute("Entry").Value == "德行")
                                continue;

                            string str = elm.Attribute("Entry").Value + ":" + elm.Attribute("Score").Value;
                            strList.Add(str);
                        }
                        row["畢業成績"] = string.Join(",", strList.ToArray());
                    }
                }

                row["導師評語"] = "";
                // 文字評量
                if (_StudentTextScoreDict.ContainsKey(StudID))
                {
                    List<string> strList = new List<string>();
                    foreach (ABCard_StudentTextScore sts in _StudentTextScoreDict[StudID])
                    {
                        string str = "";
                        switch (sts.GradeYear)
                        {
                            case 1: str = "一"; break;
                            case 2: str = "二"; break;
                            case 3: str = "三"; break;
                            case 4: str = "四"; break;
                            case 5: str = "五"; break;
                            case 6: str = "六"; break;
                            case 7: str = "一"; break;
                            case 8: str = "二"; break;
                            case 9: str = "三"; break;
                        }

                        if (str != "")
                        {
                            if (sts.Semester == 1)
                                str += "上:";

                            if (sts.Semester == 2)
                                str += "下:";
                            strList.Add(str + sts.sb_Comment + sts.DailyLifeRecommend);
                        }

                    }
                    if (strList.Count > 0)
                        row["導師評語"] = string.Join("\n", strList.ToArray());
                }

                // 處理AutoSummary
                if (_AutoSummaryRecordDict.ContainsKey(StudID))
                {
                    List<K12.BusinessLogic.AutoSummaryRecord> dataList = (from da in _AutoSummaryRecordDict[StudID] orderby da.SchoolYear, da.Semester select da).ToList();
                    int i=1;
                    foreach (K12.BusinessLogic.AutoSummaryRecord data in dataList)
                    {
                        List<string> strList = new List<string> ();
                        foreach (K12.BusinessLogic.AbsenceCountRecord rec in data.AbsenceCounts)
                            strList.Add(rec.PeriodType+":"+rec.Name + rec.Count + "節");

                        if (strList.Count > 0)
                        {
                            // 檢查料是否超過可合併欄位
                            ChechMapFieldName("缺曠統計", i);
                            row["缺曠統計" + i] =data.SchoolYear+"學年第"+data.Semester+"學期:"+ string.Join(",", strList.ToArray());
                            i++;
                        }
                    }
                }

                // 獎懲
                if (_DisciplineRecordDict.ContainsKey(StudID))
                {
                    sbDisciplineRecord.Clear();

                    int i=1,ia = 1,ib=1;
                    List<DisciplineRecord> dataList = (from da in _DisciplineRecordDict[StudID] orderby da.OccurDate select da).ToList();
                    foreach (DisciplineRecord data in dataList)
                    {
                        string str = "";
                        // 檢查料是否超過可合併欄位
                        if (!_TemplateFieldDict.ContainsKey("獎懲明細"))
                        {
                            ChechMapFieldName("獎懲日期", i);
                            ChechMapFieldName("獎懲類別支數", i);
                            ChechMapFieldName("獎懲事由", i);
                        }
                        string spstr1 = "";
                        string spstr2 = "";
                        string spstr3 = "";

                        if (data.MeritFlag == "0" || data.MeritFlag == "2")
                        {
                            str = "";
                            if (data.DemeritA.HasValue && data.DemeritA.Value>0)
                                str += "大過 " + data.DemeritA.Value;

                            if (data.DemeritB.HasValue && data.DemeritB.Value>0)
                                str += "小過 " + data.DemeritB.Value;

                            if (data.DemeritC.HasValue && data.DemeritC.Value>0)
                                str += "警告 " + data.DemeritC.Value;

                            row["懲戒日期" + ia] = data.OccurDate.ToShortDateString();
                            row["懲戒類別支數" + ia] = str;
                            row["懲戒事由" + ia] = data.Reason;

                            row["獎懲日期" + i] = data.OccurDate.ToShortDateString();
                            row["獎懲類別支數" + i] = str;
                            row["獎懲事由" + i] = data.Reason;

                            spstr1 = data.OccurDate.ToShortDateString();
                            spstr2 = str;
                            spstr3 = data.Reason;

                            if (data.MeritFlag == "2")
                            {
                                row["懲戒類別支數" + ia] = "留校察看";
                                row["獎懲類別支數" + i] = "留校察看";
                                spstr2 = "留校察看";
                            }
                            if (data.ClearDate.HasValue)
                            {
                                row["懲戒日期" + ia] = data.ClearDate.Value.ToShortDateString();
                                row["懲戒類別支數" + ia] = "銷過";
                                row["懲戒事由" + ia] = data.ClearReason;

                                row["獎懲日期" + i] = data.ClearDate.Value.ToShortDateString();
                                row["獎懲類別支數" + i] = "銷過";
                                row["獎懲事由" + i] = data.ClearReason;

                                spstr1 = data.ClearDate.Value.ToShortDateString();
                                spstr2 = "銷過";
                                spstr3 = data.ClearReason;
                            }
                            i++;
                            ia++;
                        }
                        if (data.MeritFlag == "1")
                        {
                            str = "";
                            if (data.MeritA.HasValue && data.MeritA.Value >0)
                                str += "大功 " + data.MeritA.Value;

                            if (data.MeritB.HasValue && data.MeritB.Value>0)
                                str += "小功 " + data.MeritB.Value;

                            if (data.MeritC.HasValue && data.MeritC.Value >0)
                                str += "嘉獎 " + data.MeritC.Value;

                            row["獎勵日期" + ib] = data.OccurDate.ToShortDateString();
                            row["獎勵類別支數" + ib] = str;
                            row["獎勵事由" + ib] = data.Reason;

                            row["獎懲日期" + i] = data.OccurDate.ToShortDateString();
                            row["獎懲類別支數" + i] = str;
                            row["獎懲事由" + i] = data.Reason;

                            spstr1 = data.OccurDate.ToShortDateString();
                            spstr2 = str;
                            spstr3 = data.Reason;

                            i++;
                            ib++;
                        }
                        sbDisciplineRecord.AppendLine(spstr1 + " " + spstr2 + " " + spstr3);
                    }
                    row["獎懲明細"] = sbDisciplineRecord.ToString();
                }

                // 單值
                if (_SingleRecordDict.ContainsKey(StudID))
                {
                    foreach (UDTSingleRecordDef data in _SingleRecordDict[StudID])
                    {
                        switch (data.Key)
                        {
                            case "本人概況_血型": row["血型"] = data.Data; break;
                            case "本人概況_宗教": row["宗教"] = data.Data; break;
                            case "家庭狀況_監護人_姓名": row["監護人_姓名"] = data.Data; break;
                            case "家庭狀況_監護人_關係": row["監護人_關係"] = data.Data; break;
                            case "家庭狀況_監護人_通訊地址": row["監護人_通訊地址"] = data.Data; break;
                            case "家庭狀況_監護人_電話": row["監護人_電話"] = data.Data; break;
                            case "自傳_家中最了解我的人": row["家中最了解我的人"] = data.Data; break;
                            case "自傳_常指導我做功課的人": row["常指導我做功課的人"] = data.Data; break;
                            case "自傳_讀過且印象最深刻的課外書": row["讀過且印象最深刻的課外書"] = data.Data; break;
                            case "自傳_喜歡的人": row["喜歡的人"] = data.Data; break;
                            case "自傳_喜歡的人_因為": row["喜歡的人_因為"] = data.Data; break;
                            case "自傳_最要好的朋友": row["最要好的朋友"] = data.Data; break;
                            case "自傳_他是怎樣的人": row["他是怎樣的人"] = data.Data; break;
                            case "自傳_最喜歡做的事": row["最喜歡做的事"] = data.Data; break;
                            case "自傳_最喜歡做的事_因為":row["最喜歡做的事_因為"] = data.Data; break;
                            case "自傳_最不喜歡做的事": row["最不喜歡做的事"] = data.Data; break;
                            case "自傳_最不喜歡做的事_因為": row["最不喜歡做的事_因為"] = data.Data; break;
                            case "自傳_國中時的學校生活": row["國中時的學校生活"] = data.Data; break;
                            case "自傳_最快樂的回憶": row["最快樂的回憶"] = data.Data; break;
                            case "自傳_最痛苦的回憶": row["最痛苦的回憶"] = data.Data; break;
                            case "自傳_最足以描述自己的幾句話": row["最足以描述自己的幾句話"] = data.Data; break;

                            case "自我認識_需要改進的地方_1": row["自我認識_需要改進的地方_1"] = data.Data; break;
                            case "自我認識_優點_1": row["自我認識_優點_1"] = data.Data; break;
                            case "自我認識_個性_1": row["自我認識_個性_1"] = data.Data; break;
                            case "自我認識_需要改進的地方_2": row["自我認識_需要改進的地方_2"] = data.Data; break;
                            case "自我認識_優點_2": row["自我認識_優點_2"] = data.Data; break;
                            case "自我認識_個性_2": row["自我認識_個性_2"] = data.Data; break;
                            case "自我認識_需要改進的地方_3": row["自我認識_需要改進的地方_3"] = data.Data; break;
                            case "自我認識_優點_3": row["自我認識_優點_3"] = data.Data; break;
                            case "自我認識_個性_3": row["自我認識_個性_3"] = data.Data; break;
                            case "生活感想_內容3_1": row["生活感想_內容3_1"] = data.Data; break;
                            case "生活感想_內容2_1": row["生活感想_內容2_1"] = data.Data; break;
                            case "生活感想_內容1_1": row["生活感想_內容1_1"] = data.Data; break;
                            case "生活感想_內容3_2": row["生活感想_內容3_2"] = data.Data; break;
                            case "生活感想_內容2_2": row["生活感想_內容2_2"] = data.Data; break;
                            case "生活感想_內容1_2": row["生活感想_內容1_2"] = data.Data; break;
                            case "備註_備註": row["備註_備註"] = data.Data; break;
                        }
                    }
                }

                // 學年型
                if (_YearlyDataDict.ContainsKey(StudID))
                {
                    // 組合方式一
                    foreach(UDTYearlyDataDef data in _YearlyDataDict[StudID])
                    {
                        switch (data.Key)
                        {
                            case "家庭狀況_父母關係": row["父母關係"] = Utility.Counsel_Yearly_Parse1(data); break;
                            case "家庭狀況_家庭氣氛": row["家庭氣氛"] = Utility.Counsel_Yearly_Parse1(data); break;
                            case "家庭狀況_父親管教方式": row["父管教方式"] = Utility.Counsel_Yearly_Parse1(data); break;
                            case "家庭狀況_母親管教方式": row["母管教方式"] = Utility.Counsel_Yearly_Parse1(data); break;
                            case "家庭狀況_居住環境":row["居住環境"] = Utility.Counsel_Yearly_Parse1(data); break;
                            case "家庭狀況_本人住宿":row["本人住宿"] = Utility.Counsel_Yearly_Parse1(data); break;
                            case "家庭狀況_經濟狀況": row["經濟狀況"] = Utility.Counsel_Yearly_Parse1(data); break;
                            case "家庭狀況_每星期零用錢": row["零用金"] = Utility.Counsel_Yearly_Parse1(data); break;
                            case "家庭狀況_每星期零用錢(元)": row["零用金"] = Utility.Counsel_Yearly_Parse1(data); break;
                            case "家庭狀況_我覺得是否足夠":row["零用金是否足夠"] = Utility.Counsel_Yearly_Parse1(data); break;
                            case "學習狀況_特殊專長": row["特殊專長"] = Utility.Counsel_Yearly_Parse1(data); break;
                            case "學習狀況_休閒興趣": row["休閒興趣"] = Utility.Counsel_Yearly_Parse1(data); break;
                            case "學習狀況_最喜歡的學科": row["最喜歡的學科"] = Utility.Counsel_Yearly_Parse1(data); break;
                            case "學習狀況_最感困難的學科": row["最感困難的學科"] = Utility.Counsel_Yearly_Parse1(data); break;
                        }
                    }

                    // 組合方式二
                    foreach (UDTYearlyDataDef data in _YearlyDataDict[StudID])
                    {
                        switch (data.Key)
                        {
                            case "適應情形_生活習慣":
                                for( int i=1;i<=6;i++)
                                    row["生活習慣"+i] = Utility.Counsel_Yearly_Parse2(data, i); break;

                            case "適應情形_人際關係":
                                for (int i = 1; i <= 6; i++)
                                    row["人際關係"+i] = Utility.Counsel_Yearly_Parse2(data,i); break;
                            case "適應情形_外向行為":
                                for (int i = 1; i <= 6; i++)
                                row["外向行為"+i] = Utility.Counsel_Yearly_Parse2(data,i); break;
                            case "適應情形_內向行為":
                                for (int i = 1; i <= 6; i++)
                                row["內向行為"+i] = Utility.Counsel_Yearly_Parse2(data, i); break;
                            case "適應情形_學習動機":
                                for (int i = 1; i <= 6; i++)
                                row["學習動機"+i] = Utility.Counsel_Yearly_Parse2(data, i); break;
                            case "適應情形_服務熱忱":
                                for (int i = 1; i <= 6; i++)
                                row["服務熱忱"+i] = Utility.Counsel_Yearly_Parse2(data, i); break;
                            case "適應情形_人生態度":
                                for (int i = 1; i <= 6; i++)
                                row["人生態度"+i] = Utility.Counsel_Yearly_Parse2(data, i); break;
                        }
                    }
                }

                // 多值
                if (_MultipleRecordDict.ContainsKey(StudID))
                {
                    row["生理狀態"] = Utility.Counsel_Multiple_Parse(_MultipleRecordDict[StudID], "本人概況_生理缺陷");
                    row["特殊疾病"] = Utility.Counsel_Multiple_Parse(_MultipleRecordDict[StudID], "本人概況_曾患特殊疾病");

                    row["升學意願"] = Utility.Counsel_Multiple_Parse(_MultipleRecordDict[StudID], "畢業後計畫_升學意願");
                    row["就業意願"] = Utility.Counsel_Multiple_Parse(_MultipleRecordDict[StudID], "畢業後計畫_就業意願");
                    row["職訓種類"] = Utility.Counsel_Multiple_Parse(_MultipleRecordDict[StudID], "畢業後計畫_參加職業訓練");
                    row["受訓地區"] = Utility.Counsel_Multiple_Parse(_MultipleRecordDict[StudID], "畢業後計畫_受訓地區");
                }
                // 優先順序
                if (_PriorityDataDict.ContainsKey(StudID))
                {
                    foreach (UDTPriorityDataDef data in _PriorityDataDict[StudID])
                    {
                        switch (data.Key)
                        {
                            case "畢業後計畫_將來職業": row["職業意願"] = Utility.Counsel_PriorityData_Parse1(data); break;
                            case "畢業後計畫_就業地區": row["就業地區"] = Utility.Counsel_PriorityData_Parse1(data); break;
                        }
                    }
                }

                // 直系血親
                if (_RelativeDict.ContainsKey(StudID))
                {
                    int i = 1;
                    foreach (UDTRelativeDef data in _RelativeDict[StudID])
                    {
                        // 檢查料是否超過可合併欄位
                        ChechMapFieldName("家長親屬_稱謂", i);
                        ChechMapFieldName("家長親屬_姓名", i);
                        ChechMapFieldName("家長親屬_出生年", i);
                        ChechMapFieldName("家長親屬_存歿", i);
                        ChechMapFieldName("家長親屬_教育程度", i);
                        ChechMapFieldName("家長親屬_職業", i);
                        ChechMapFieldName("家長親屬_工作機構", i);
                        ChechMapFieldName("家長親屬_職稱", i);

                        row["家長親屬_稱謂" + i] = data.Title;
                        row["家長親屬_姓名" + i] = data.Name;
                        row["家長親屬_出生年" + i] = data.BirthYear;
                        row["家長親屬_存歿" + i]="存";
                        if (data.IsAlive.HasValue && data.IsAlive.Value == false)
                            row["家長親屬_存歿" + i] = "歿";
                        row["家長親屬_教育程度" + i] = data.EduDegree;
                        row["家長親屬_職業" + i] = data.Job;
                        row["家長親屬_工作機構" + i] = data.Institute;
                        row["家長親屬_職稱" + i] = data.JobTitle;
                        i++;
                    }
                }

                // 兄弟姊妹
                if (_SiblingDict.ContainsKey(StudID))
                {
                    int i = 1;
                    foreach (UDTSiblingDef data in _SiblingDict[StudID])
                    {
                        // 檢查料是否超過可合併欄位
                        ChechMapFieldName("兄弟姊妹_稱謂", i);
                        ChechMapFieldName("兄弟姊妹_姓名", i);
                        ChechMapFieldName("兄弟姊妹_出生年", i);
                        ChechMapFieldName("兄弟姊妹_畢肄業學校", i);

                        row["兄弟姊妹_稱謂" + i] = data.Title;
                        row["兄弟姊妹_姓名" + i] = data.Name;
                        row["兄弟姊妹_出生年" + i] = data.BirthYear;
                        row["兄弟姊妹_畢肄業學校" + i] = data.SchoolName;
                        i++;
                    }
                }

                // 學期型
                if (_SemesterDataDict.ContainsKey(StudID))
                {
                    foreach (UDTSemesterDataDef data in _SemesterDataDict[StudID])
                    {
                        switch (data.Key)
                        {
                            case "本人概況_身高":
                                for (int i = 1; i <= 6; i++)
                                    row["身高" + i] = Utility.Counsel_SemesterData_Parse1(data,i);break;
                            case "本人概況_體重":
                                for (int i = 1; i <= 6; i++)
                                    row["體重" + i] = Utility.Counsel_SemesterData_Parse1(data,i);break;
                        }
                    }
                }

                // 心理測驗
                if (_StudQuizDataDict.ContainsKey(StudID))
                {
                    int i = 1;
                    List<UDT_StudQuizDataDef> dataList = (from da in _StudQuizDataDict[StudID] orderby da.ImplementationDate select da).ToList();
                    foreach (UDT_StudQuizDataDef data in dataList)
                    {
                        // 檢查料是否超過可合併欄位
                        ChechMapFieldName("測驗名稱", i);
                        ChechMapFieldName("測驗日期", i);
                        ChechMapFieldName("測驗結果", i);

                        row["測驗名稱" + i] = "";
                        if (_QuizDefDict.ContainsKey(data.QuizID))
                            row["測驗名稱" + i] = _QuizDefDict[data.QuizID].QuizName;
                        if (data.ImplementationDate.HasValue)
                            row["測驗日期" + i] = data.ImplementationDate.Value.ToShortDateString();
                        else
                            row["測驗日期" + i] = "";

                        row["測驗結果" + i] = Utility.CounselStudQuizXmlParse1(data.Content);

                        i++;
                    }
                }

                // 晤談紀錄
                if (_CounselStudentInterviewRecordDict.ContainsKey(StudID))
                {
                    int i1 = 1;
                    List<UDT_CounselStudentInterviewRecordDef> dataList = (from da in _CounselStudentInterviewRecordDict[StudID] orderby da.InterviewDate select da).ToList();
                    foreach (UDT_CounselStudentInterviewRecordDef data in dataList)
                    {
                        // 檢查料是否超過可合併欄位
                        ChechMapFieldName("晤談紀錄日期", i1);
                        ChechMapFieldName("晤談紀錄對象", i1);
                        ChechMapFieldName("晤談紀錄方式", i1);
                        ChechMapFieldName("晤談紀錄內容要點", i1);
                        ChechMapFieldName("晤談紀錄記錄者姓名", i1);

                        row["晤談紀錄日期"+i1]=data.InterviewDate.Value.ToShortDateString();
                        row["晤談紀錄對象" + i1] = data.IntervieweeType;
                        row["晤談紀錄方式" + i1] = data.InterviewType;
                        row["晤談紀錄內容要點" + i1] = data.ContentDigest;
                        row["晤談紀錄記錄者姓名" + i1] = data.AuthorName;
                        i1++;
                    }

                }

                // 個案會議
                if (_CounselCaseMeetingRecordDict.ContainsKey(StudID))
                {
                    int i2 = 1;
                    List<UDT_CounselCaseMeetingRecordDef> dataList = (from da in _CounselCaseMeetingRecordDict[StudID] orderby da.MeetingDate select da).ToList();
                    foreach (UDT_CounselCaseMeetingRecordDef data in dataList)
                    {
                        // 檢查料是否超過可合併欄位
                        ChechMapFieldName("個案會議會議日期", i2);
                        ChechMapFieldName("個案會議會議事由", i2);
                        ChechMapFieldName("個案會議內容要點", i2);
                        ChechMapFieldName("個案會議記錄者姓名", i2);

                        row["個案會議會議日期" + i2] = data.MeetingDate.Value.ToShortDateString();
                        row["個案會議會議事由" + i2] = data.MeetingCause;
                        row["個案會議內容要點" + 2] = data.ContentDigest;
                        row["個案會議記錄者姓名" + i2] = data.AuthorName;

                        i2++;
                    }
                }

                // 優先關懷
                if (_CounselCareRecordDict.ContainsKey(StudID))
                {
                    int i3 = 1;
                    List<UDT_CounselCareRecordDef> dataList = (from da in _CounselCareRecordDict[StudID] orderby da.FileDate select da).ToList();
                    foreach (UDT_CounselCareRecordDef data in dataList)
                    {
                        // 檢查料是否超過可合併欄位
                        ChechMapFieldName("優先關懷立案日期", i3);
                        ChechMapFieldName("優先關懷個案類別", i3);
                        ChechMapFieldName("優先關懷個案來源", i3);
                        ChechMapFieldName("優先關懷記錄者姓名", i3);

                        row["優先關懷立案日期" + i3] = data.FileDate.Value.ToShortDateString();
                        row["優先關懷個案類別" + i3] = data.CaseCategory;
                        row["優先關懷個案來源" + i3] = data.CaseOrigin;
                        row["優先關懷記錄者姓名" + i3] = data.AuthorName;
                        i3++;
                    }
                }

                _dtTable.Rows.Add(row);
            }
            Document document = new Document();
            document = docTemplae;

            doc.Sections.Add(doc.ImportNode(document.Sections[0], true));

            doc.MailMerge.MergeField += new Aspose.Words.Reporting.MergeFieldEventHandler(MailMerge_MergeField);
            doc.MailMerge.Execute(_dtTable);
            doc.MailMerge.RemoveEmptyParagraphs = true;
            doc.MailMerge.DeleteFields();
            _bgWorker.ReportProgress(95);
            e.Result = doc;
        }
Example #6
0
        private void button1_Click(object sender, EventArgs e)
        {
            //未輸入電子報表名稱的檢查
            if (textBox1.Text.Trim() != "")
            {
                //主要的Word文件
                Document doc = new Document();
                doc.Sections.Clear();

                if (radioButton2.Checked)
                {
                    #region 班級電子報表
                    //建立一個班級電子報表
                    //傳入參數 : 報表名稱,學年度,學期,類型(學生/班級/教師/課程)
                    paperForClass = new SmartSchool.ePaper.ElectronicPaper(textBox1.Text, School.DefaultSchoolYear, School.DefaultSemester, SmartSchool.ePaper.ViewerType.Class);

                    MemoryStream stream = new MemoryStream();

                    Document each_page = new Document(template, "", LoadFormat.Doc, "");
                    each_page.Save(stream, SaveFormat.Doc);

                    //取得所選擇的班級ID
                    List<string> ClassID = K12.Presentation.NLDPanels.Class.SelectedSource;
                    foreach (string each in ClassID)
                    {
                        //傳參數給PaperItem
                        //格式 / 內容 / 對象的系統編號
                        paperForClass.Append(new PaperItem(PaperFormat.Office2003Doc, stream, each));
                    }

                    //開始上傳
                    SmartSchool.ePaper.DispatcherProvider.Dispatch(paperForClass);
                    #endregion
                }
                else
                {
                    #region 班級學生的電子報表
                    //建立一個學生電子報表
                    //傳入參數 : 報表名稱,學年度,學期,類型(學生/班級/教師/課程)
                    paperForStudent = new SmartSchool.ePaper.ElectronicPaper(textBox1.Text, School.DefaultSchoolYear, School.DefaultSemester, SmartSchool.ePaper.ViewerType.Student);

                    //學生個人的文件
                    Document each_page = new Document(template, "", LoadFormat.Doc, "");
                    MemoryStream stream = new MemoryStream();
                    each_page.Save(stream, SaveFormat.Doc);
                    doc.Sections.Add(doc.ImportNode(each_page.Sections[0], true)); //合併至doc

                    List<string> ClassID = K12.Presentation.NLDPanels.Class.SelectedSource; //取得畫面上所選班級的ID清單
                    List<StudentRecord> srList = Student.SelectByClassIDs(ClassID); //依據班級ID,取得學生物件
                    foreach (StudentRecord sr in srList)
                    {
                        //傳參數給PaperItem
                        //格式 / 內容 / 對象的系統編號
                        paperForStudent.Append(new PaperItem(PaperFormat.Office2003Doc, stream, sr.ID));
                    }

                    //開始上傳
                    SmartSchool.ePaper.DispatcherProvider.Dispatch(paperForStudent);
                    #endregion
                }
            }
            else
            {
                MessageBox.Show("請輸入電子報表名稱!!");
            }
        }
        void _bgWork_DoWork(object sender, DoWorkEventArgs e)
        {
            #region 讀取資料並整理
            // 取得所選課程資料
            _CourseAllDict.Clear();
            _StudentDict.Clear();
            _AddressDict.Clear();
            _ParentDict.Clear();

            // 取得學生扣考
            Global._StudentNotExamDict = QueryData.GetStudentNotExamCoID(_StudentIDList);

            // 取得學生資料
            foreach (StudentRecord rec in Student.SelectByIDs(_StudentIDList))
                _StudentDict.Add(rec.ID, rec);

            // 地址資料
            foreach (AddressRecord rec in Address.SelectByStudentIDs(_StudentIDList))
            {
                if (!_AddressDict.ContainsKey(rec.RefStudentID))
                    _AddressDict.Add(rec.RefStudentID, rec);
            }

            // 家長資料
            foreach (ParentRecord rec in K12.Data.Parent.SelectByStudentIDs(_StudentIDList))
            {
                if (!_ParentDict.ContainsKey(rec.RefStudentID))
                    _ParentDict.Add(rec.RefStudentID, rec);
            }

            Dictionary<string, UDTCourseDef> SelCourseDict = UDTTransfer.UDTCourseSelectBySchoolYearSMDict(_SelSchoolYear, _SelSemester, _SelMonth);
            
            _CourseAllDict.Clear();
            foreach (KeyValuePair<string, UDTCourseDef> data in SelCourseDict)
            {
                int cid = int.Parse(data.Key);
                _CourseAllDict.Add(cid, data.Value);
            }
            
            // 取得所選課程上課時間表            
            _TimeSectionList = UDTTransfer.UDTTimeSectionSelectByCourseIDList(SelCourseDict.Keys.ToList());

            _classNameDict.Clear();
            foreach (ClassRecord cr in Class.SelectAll())
                _classNameDict.Add(cr.ID, cr.Name);

            // 取得學生重補修課程缺曠
            _AttendanceList.Clear();
            List<UDTAttendanceDef> StudAddtendList= UDTTransfer.UDTAttendanceSelectByStudentIDList(_StudentIDList);
            foreach (UDTAttendanceDef data in StudAddtendList)
            {
                // 屬於該梯次才加入
                if (_CourseAllDict.ContainsKey(data.CourseID))
                    _AttendanceList.Add(data);
            }

            // 整理學生缺課資料
            Dictionary<string, List<UDTAttendanceDef>> StudAttendanceDict = new Dictionary<string, List<UDTAttendanceDef>>();
            foreach (UDTAttendanceDef data in _AttendanceList)
            { 
                string sid=data.StudentID.ToString();
                if (!StudAttendanceDict.ContainsKey(sid))
                    StudAttendanceDict.Add(sid, new List<UDTAttendanceDef>());

                StudAttendanceDict[sid].Add(data);
            }


            _bgWork.ReportProgress(30);
         
            #endregion

            #region 填值並合併樣板處理

            Document docTemplate=null;
            if(_SelectChkNotExam)
                docTemplate = new Document(new MemoryStream(Properties.Resources.學生重補修缺曠通知單扣考範本));
            else
                docTemplate = new Document(new MemoryStream(Properties.Resources.學生重補修缺曠通知單範本));

            // 最終樣板
            Document doc = new Document();
            // 處理缺曠用
            DataTable dtAtt = new DataTable();
            List<Document> docList = new List<Document>();

            DataTable dt = new DataTable();
            
            List<int> courseIDList = new List<int>();

            string SchoolName = School.ChineseName;
            string SchoolAddress = School.Address;
            string SchoolTel = School.Telephone;

            // 以學生為主產生資料
            foreach(string studID in _StudentIDList)
            {
                // 沒有缺課學生跳過
                if (!StudAttendanceDict.ContainsKey(studID))
                    continue;

                // 檢查當勾選只產生扣考,只顯示有扣考,完全沒扣考跳過
                if (_SelectChkNotExam)
                {
                    if (!Global._StudentNotExamDict.ContainsKey(studID))
                        continue;
                }

                courseIDList.Clear();
                // 學生修課課程
                List<UDTAttendanceDef> sadList = StudAttendanceDict[studID];
                foreach (UDTAttendanceDef data in sadList)
                {
                    if (!courseIDList.Contains(data.CourseID))
                        courseIDList.Add(data.CourseID);
                }


                dt.Clear();
                dt.Columns.Clear();
                // 放入欄位
                dt.Columns.Add("學校名稱");
                dt.Columns.Add("學校地址");
                dt.Columns.Add("學校電話");
                dt.Columns.Add("收件人姓名");
                dt.Columns.Add("收件人地址");
                dt.Columns.Add("學年度");
                dt.Columns.Add("學期");
                dt.Columns.Add("梯次");
                dt.Columns.Add("班級");
                dt.Columns.Add("座號");
                dt.Columns.Add("學號");
                dt.Columns.Add("學生姓名");                

                // 課程名稱
                for (int i = 1; i <= 6; i++)
                {
                    dt.Columns.Add("課程名稱" + i);
                    dt.Columns.Add("缺曠紀錄" + i);
                    dt.Columns.Add("小計" + i);
                    dt.Columns.Add("扣考" + i);
                }

                DataRow dr = dt.NewRow();
                // 學校名稱
                dr["學校名稱"] = SchoolName;
                // 學校地址
                dr["學校地址"] = SchoolAddress;
                // 學校電話
                dr["學校電話"] = SchoolTel;

                // 收件人姓名
                dr["收件人姓名"] = _StudentDict[studID].Name;
                    
                if (_ParentDict.ContainsKey(studID))
                {
                    string name = _StudentDict[studID].Name;
                    if (_SelectMailName == "監護人姓名")
                        name = _ParentDict[studID].CustodianName;

                    if (_SelectMailName == "父親姓名")
                        name = _ParentDict[studID].FatherName;

                    if (_SelectMailName == "母親姓名")
                        name = _ParentDict[studID].MotherName;

                    dr["收件人姓名"] = name;
                        
                }

                // 收件人地址
                dr["收件人地址"] = "";
                if (_AddressDict.ContainsKey(studID))
                {
                    string address = "";
                    if (_SelectMailAddress == "戶籍地址")
                        address = _AddressDict[studID].PermanentAddress;

                    if (_SelectMailAddress == "聯絡地址")
                        address = _AddressDict[studID].MailingAddress;

                    if (_SelectMailAddress == "其他地址")
                        address = _AddressDict[studID].Address1Address;

                    dr["收件人地址"] = address;
                }

                // 班級
                if (_classNameDict.ContainsKey(_StudentDict[studID].RefClassID))
                {
                    dr["班級"] = _classNameDict[_StudentDict[studID].RefClassID];                    
                }

                dr["座號"] = "";
                // 座號
                if (_StudentDict[studID].SeatNo.HasValue)
                    dr["座號"] = _StudentDict[studID].SeatNo.Value;                

                // 學號
                dr["學號"] = _StudentDict[studID].StudentNumber;                

                // 學生姓名
                dr["學生姓名"] = _StudentDict[studID].Name;

                // 清空與重設相關需要資料
                Global._CourseTimeSectionList.Clear();
                Global._CousreAttendList.Clear();
                Global._CourseStudentAttendanceIdxDict.Clear();

                dtAtt.Clear();
                dtAtt.Columns.Clear();
                dtAtt.Columns.Add("缺曠日期");
                // 缺曠資料
                for (int i = 1; i <= 100; i++)
                    dtAtt.Columns.Add("缺曠紀錄" + i);

                DataRow drTT = dtAtt.NewRow();
                // 填入課程名稱
                int coIdx = 1;
                // 收集學年度學期
                List<int> syL = new List<int>();
                List<int> ssL = new List<int>();
                List<int> smL = new List<int>();


                foreach (int cid in courseIDList)
                {
                    if (_CourseAllDict.ContainsKey(cid))
                    {
                        // 勾選只產生扣考,沒有扣考不顯示出來
                        if (_SelectChkNotExam)
                        {
                            if (!Global._StudentNotExamDict.ContainsKey(studID))
                                continue;
                            else
                            {
                                if (!Global._StudentNotExamDict[studID].Contains(cid))
                                    continue;
                            }
                        }
                        dr["課程名稱" + coIdx] = _CourseAllDict[cid].CourseName;

                        if (!syL.Contains(_CourseAllDict[cid].SchoolYear))
                            syL.Add(_CourseAllDict[cid].SchoolYear);

                        if (!ssL.Contains(_CourseAllDict[cid].Semester))
                            ssL.Add(_CourseAllDict[cid].Semester);

                        if (!smL.Contains(_CourseAllDict[cid].Month))
                            smL.Add(_CourseAllDict[cid].Month);


                        int SumCount = 0;

                        // 整理課程上課時間表
                        foreach (UDTTimeSectionDef data in _TimeSectionList)
                        {
                            if (data.CourseID == cid)
                                Global._CourseTimeSectionList.Add(data);
                        }

                        // 整理課程修課缺曠記錄
                        foreach (UDTAttendanceDef data in StudAttendanceDict[studID])
                        {
                            if (data.CourseID == cid)
                            {
                                Global._CousreAttendList.Add(data);
                                SumCount++;
                            }
                        }

                        // 計算學生缺曠統計
                        dr["小計" + coIdx] = SumCount;

                        // 扣考
                        if (Global._StudentNotExamDict.ContainsKey(studID))
                        {
                            if (Global._StudentNotExamDict[studID].Contains(cid))
                                dr["扣考" + coIdx] = "扣考";
                        }

                        string ssid = cid.ToString();
                        if (!Global._CourseStudentAttendanceIdxDict.ContainsKey(ssid))
                            Global._CourseStudentAttendanceIdxDict.Add(ssid, coIdx);
                        drTT["缺曠紀錄" + coIdx] = ssid;   
                        coIdx++;
                    }
                }

                dr["學年度"] = string.Join(",", syL.ToArray());
                dr["學期"] = string.Join(",", ssL.ToArray());
                dr["梯次"] = string.Join(",", smL.ToArray());

                    dt.Rows.Add(dr);
                    dtAtt.Rows.Add(drTT);
                    // 處理動態處理(缺曠)
                    Document docAtt = new Document();
                    docAtt.Sections.Clear();
                    docAtt.Sections.Add(docAtt.ImportNode(docTemplate.Sections[0], true));
                    _builder = new DocumentBuilder(docAtt);
                    docAtt.MailMerge.MergeField += new Aspose.Words.Reporting.MergeFieldEventHandler(MailMerge_MergeField);
                    docAtt.MailMerge.Execute(dtAtt);
                    int cot = 1;
                    Document doc1 = new Document();
                    doc1.Sections.Clear();
                    doc1.Sections.Add(doc1.ImportNode(docAtt.Sections[0], true));
                    doc1.MailMerge.Execute(dt);
                    doc1.MailMerge.RemoveEmptyParagraphs = true;
                    doc1.MailMerge.DeleteFields();
                    //// 清除多餘欄位
                    //int TabRowCount = doc1.Sections[0].Body.Tables[0].Rows.Count - 1;
                    //for (int idx = TabRowCount; idx >= cot; idx--)
                    //{
                    //    doc1.Sections[0].Body.Tables[0].Rows.RemoveAt(idx);
                    //}
                    docList.Add(doc1);
            }

            doc.Sections.Clear();
            foreach (Document doc2 in docList)
                doc.Sections.Add(doc.ImportNode(doc2.Sections[0], true));

            string reportNameW = "重補修缺課通知單";

            if(_SelectChkNotExam)
                reportNameW = "重補修缺課扣考通知單";
            else
                reportNameW = "重補修缺課通知單";

            pathW = Path.Combine(System.Windows.Forms.Application.StartupPath + "\\Reports", "");
            if (!Directory.Exists(pathW))
                Directory.CreateDirectory(pathW);
            pathW = Path.Combine(pathW, reportNameW + ".doc");

            if (File.Exists(pathW))
            {
                int i = 1;
                while (true)
                {
                    string newPathW = Path.GetDirectoryName(pathW) + "\\" + Path.GetFileNameWithoutExtension(pathW) + (i++) + Path.GetExtension(pathW);
                    if (!File.Exists(newPathW))
                    {
                        pathW = newPathW;
                        break;
                    }
                }
            }

            try
            {
                doc.Save(pathW, Aspose.Words.SaveFormat.Doc);

            }
            catch (Exception exow)
            {

            }

            doc = null;
            docList.Clear();

            GC.Collect();
            _bgWork.ReportProgress(100);
            #endregion
        }
        private void btnPrint_Click(object sender, EventArgs e)
        {
            string survey_year = this.nudSchoolYear.Value + "";
            this.btnPrint.Enabled = false;
            this.circularProgress.Visible = true;
            this.circularProgress.IsRunning = true;

            Task<Document> task = Task<Document>.Factory.StartNew(() =>
            {
                MemoryStream template = new MemoryStream(Properties.Resources.高雄市國中畢業生進路統計報表樣版);
                Document doc = new Document();
                Document dataDoc = new Document(template, "", LoadFormat.Doc, "");
                dataDoc.MailMerge.MergeField += new Aspose.Words.Reporting.MergeFieldEventHandler(MailMerge_MergeField);
                dataDoc.MailMerge.RemoveEmptyParagraphs = true;
                doc.Sections.Clear();
                List<string> keys = new List<string>();
                List<object> values = new List<object>();
                Dictionary<string, object> mergeKeyValue = new Dictionary<string, object>();
                List<UDT.Approach> Records = this.Access.Select<UDT.Approach>("survey_year=" + survey_year);
                if (Records.Count == 0)
                    throw new Exception("本年度無填報資料。");

                decimal A1_sum = Records.Count; decimal A2_sum = 0; decimal A3_sum = 0; decimal A4_sum = 0;
                decimal B1_sum = 0; decimal B2_sum = 0; decimal B3_sum = 0; decimal B4_sum = 0;
                decimal C1_sum = 0; decimal C2_sum = 0; decimal C3_sum = 0; decimal C4_sum = 0;
                decimal D1_sum = 0; decimal D2_sum = 0; decimal D3_sum = 0; decimal D4_sum = 0;

                decimal E2_sum = 0; decimal F2_sum = 0; decimal G2_sum = 0; decimal H2_sum = 0; decimal I2_sum = 0;
                decimal E3_sum = 0; decimal F3_sum = 0; decimal G3_sum = 0; decimal H3_sum = 0; decimal I3_sum = 0; decimal J3_sum = 0;

                decimal K4_sum = 0; decimal L4_sum = 0; decimal M4_sum = 0; decimal N4_sum = 0; decimal O4_sum = 0; decimal P4_sum = 0;
                decimal Q4_sum = 0; decimal R4_sum = 0; decimal S4_sum = 0;

                decimal E4_sum = 0; decimal F4_sum = 0; decimal G4_sum = 0; decimal H4_sum = 0; decimal I4_sum = 0; decimal J4_sum = 0;
                foreach (UDT.Approach record in Records)
                {
                    //  升學或就業情形
                    if (record.Q1 == 1)
                        B1_sum += 1;
                    if (record.Q1 == 2)
                        C1_sum += 1;
                    if (record.Q1 == 3)
                        D1_sum += 1;

                    //  就讀學校
                    if (record.Q2 == 1)
                        B2_sum += 1;
                    if (record.Q2 == 2)
                        C2_sum += 1;
                    if (record.Q2 == 3)
                        D2_sum += 1;
                    if (record.Q2 == 4)
                        E2_sum += 1;
                    if (record.Q2 == 5)
                        F2_sum += 1;
                    if (record.Q2 == 6)
                        G2_sum += 1;
                    if (record.Q2 == 7)
                        H2_sum += 1;
                    if (record.Q2 == 8)
                        I2_sum += 1;
                    //  學制別
                    if (record.Q3 == 1)
                        B3_sum += 1;
                    if (record.Q3 == 2)
                        C3_sum += 1;
                    if (record.Q3 == 3)
                        D3_sum += 1;
                    if (record.Q3 == 4)
                        E3_sum += 1;
                    if (record.Q3 == 5)
                        F3_sum += 1;
                    if (record.Q3 == 6)
                        G3_sum += 1;
                    if (record.Q3 == 7)
                        H3_sum += 1;
                    if (record.Q3 == 8)
                        I3_sum += 1;
                    if (record.Q3 == 9)
                        J3_sum += 1;

                    //  入學方式
                    if (record.Q4 == 1)
                        B4_sum += 1;
                    if (record.Q4 == 2)
                        C4_sum += 1;
                    if (record.Q4 == 3)
                        D4_sum += 1;
                    if (record.Q4 == 4)
                        E4_sum += 1;
                    if (record.Q4 == 5)
                        F4_sum += 1;
                    if (record.Q4 == 6)
                        G4_sum += 1;
                    if (record.Q4 == 7)
                        H4_sum += 1;
                    if (record.Q4 == 8)
                        I4_sum += 1;
                    if (record.Q4 == 9)
                        J4_sum += 1;
                    if (record.Q4 == 10)
                        K4_sum += 1;
                    if (record.Q4 == 11)
                        L4_sum += 1;
                    if (record.Q4 == 12)
                        M4_sum += 1;
                    if (record.Q4 == 13)
                        N4_sum += 1;
                    if (record.Q4 == 14)
                        O4_sum += 1;
                    if (record.Q4 == 15)
                        P4_sum += 1;
                    if (record.Q4 == 16)
                        Q4_sum += 1;
                    if (record.Q4 == 17)
                        R4_sum += 1;
                    if (record.Q4 == 18)
                        S4_sum += 1;

                }

                #region 全校畢業學生升學就業情形
                mergeKeyValue.Add("A1", A1_sum);
                mergeKeyValue.Add("B1", B1_sum);
                mergeKeyValue.Add("C1", C1_sum);
                mergeKeyValue.Add("D1", D1_sum);
                mergeKeyValue.Add("B1/A1", Math.Round(B1_sum * 100 / A1_sum, 2, MidpointRounding.AwayFromZero));
                mergeKeyValue.Add("C1/A1", Math.Round(C1_sum * 100 / A1_sum, 2, MidpointRounding.AwayFromZero));
                mergeKeyValue.Add("D1/A1", Math.Round(D1_sum * 100 / A1_sum, 2, MidpointRounding.AwayFromZero));
                #endregion

                #region 全校畢業學生升學之就讀學校情形
                A2_sum = B2_sum + C2_sum + D2_sum + E2_sum + F2_sum + G2_sum + H2_sum + I2_sum;
                mergeKeyValue.Add("A2", A2_sum);
                mergeKeyValue.Add("B2", B2_sum);
                mergeKeyValue.Add("C2", C2_sum);
                mergeKeyValue.Add("D2", D2_sum);
                mergeKeyValue.Add("E2", E2_sum);
                mergeKeyValue.Add("F2", F2_sum);
                mergeKeyValue.Add("G2", G2_sum);
                mergeKeyValue.Add("H2", H2_sum);
                mergeKeyValue.Add("I2", I2_sum);
                mergeKeyValue.Add("B2/A2", A2_sum > 0 ? Math.Round(B2_sum * 100 / A2_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("C2/A2", A2_sum > 0 ? Math.Round(C2_sum * 100 / A2_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("D2/A2", A2_sum > 0 ? Math.Round(D2_sum * 100 / A2_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("E2/A2", A2_sum > 0 ? Math.Round(E2_sum * 100 / A2_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("F2/A2", A2_sum > 0 ? Math.Round(F2_sum * 100 / A2_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("G2/A2", A2_sum > 0 ? Math.Round(G2_sum * 100 / A2_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("H2/A2", A2_sum > 0 ? Math.Round(H2_sum * 100 / A2_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("I2/A2", A2_sum > 0 ? Math.Round(I2_sum * 100 / A2_sum, 2, MidpointRounding.AwayFromZero) : 0);
                #endregion

                #region 學制別
                A3_sum = B3_sum + C3_sum + D3_sum + E3_sum + F3_sum + G3_sum + H3_sum + I3_sum + J3_sum;
                mergeKeyValue.Add("A3", A3_sum);
                mergeKeyValue.Add("B3", B3_sum);
                mergeKeyValue.Add("C3", C3_sum);
                mergeKeyValue.Add("D3", D3_sum);
                mergeKeyValue.Add("E3", E3_sum);
                mergeKeyValue.Add("F3", F3_sum);
                mergeKeyValue.Add("G3", G3_sum);
                mergeKeyValue.Add("H3", H3_sum);
                mergeKeyValue.Add("I3", I3_sum);
                mergeKeyValue.Add("J3", J3_sum);
                mergeKeyValue.Add("B3/A3", A3_sum > 0 ? Math.Round(B4_sum * 100 / A3_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("C3/A3", A3_sum > 0 ? Math.Round(C4_sum * 100 / A3_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("D3/A3", A3_sum > 0 ? Math.Round(D4_sum * 100 / A3_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("E3/A3", A3_sum > 0 ? Math.Round(E4_sum * 100 / A3_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("F3/A3", A3_sum > 0 ? Math.Round(F4_sum * 100 / A3_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("G3/A3", A3_sum > 0 ? Math.Round(G4_sum * 100 / A3_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("H3/A3", A3_sum > 0 ? Math.Round(H4_sum * 100 / A3_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("I3/A3", A3_sum > 0 ? Math.Round(I4_sum * 100 / A3_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("J3/A3", A3_sum > 0 ? Math.Round(J4_sum * 100 / A3_sum, 2, MidpointRounding.AwayFromZero) : 0);
                #endregion

                #region 入學方式
                A4_sum = B4_sum + C4_sum + D4_sum + E4_sum + F4_sum + G4_sum + H4_sum + I4_sum + J4_sum +
                         K4_sum + L4_sum + M4_sum + N4_sum + O4_sum + P4_sum + Q4_sum + R4_sum + S4_sum;

                mergeKeyValue.Add("A4", A4_sum);

                mergeKeyValue.Add("B4", B4_sum);
                mergeKeyValue.Add("C4", C4_sum);
                mergeKeyValue.Add("D4", D4_sum);
                mergeKeyValue.Add("E4", E4_sum);
                mergeKeyValue.Add("F4", F4_sum);
                mergeKeyValue.Add("G4", G4_sum);
                mergeKeyValue.Add("H4", H4_sum);
                mergeKeyValue.Add("I4", I4_sum);
                mergeKeyValue.Add("J4", J4_sum);
                mergeKeyValue.Add("K4", K4_sum);
                mergeKeyValue.Add("L4", L4_sum);
                mergeKeyValue.Add("M4", M4_sum);
                mergeKeyValue.Add("N4", N4_sum);
                mergeKeyValue.Add("O4", O4_sum);
                mergeKeyValue.Add("P4", P4_sum);
                mergeKeyValue.Add("Q4", Q4_sum);
                mergeKeyValue.Add("R4", R4_sum);
                mergeKeyValue.Add("S4", S4_sum);

                mergeKeyValue.Add("B4/A4", A4_sum > 0 ? Math.Round(B4_sum * 100 / A4_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("C4/A4", A4_sum > 0 ? Math.Round(C4_sum * 100 / A4_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("D4/A4", A4_sum > 0 ? Math.Round(D4_sum * 100 / A4_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("E4/A4", A4_sum > 0 ? Math.Round(E4_sum * 100 / A4_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("F4/A4", A4_sum > 0 ? Math.Round(F4_sum * 100 / A4_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("G4/A4", A4_sum > 0 ? Math.Round(G4_sum * 100 / A4_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("H4/A4", A4_sum > 0 ? Math.Round(H4_sum * 100 / A4_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("I4/A4", A4_sum > 0 ? Math.Round(I4_sum * 100 / A4_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("J4/A4", A4_sum > 0 ? Math.Round(J4_sum * 100 / A4_sum, 2, MidpointRounding.AwayFromZero) : 0);

                mergeKeyValue.Add("K4/A4", A4_sum > 0 ? Math.Round(K4_sum * 100 / A4_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("L4/A4", A4_sum > 0 ? Math.Round(L4_sum * 100 / A4_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("M4/A4", A4_sum > 0 ? Math.Round(M4_sum * 100 / A4_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("N4/A4", A4_sum > 0 ? Math.Round(N4_sum * 100 / A4_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("O4/A4", A4_sum > 0 ? Math.Round(O4_sum * 100 / A4_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("P4/A4", A4_sum > 0 ? Math.Round(P4_sum * 100 / A4_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("Q4/A4", A4_sum > 0 ? Math.Round(Q4_sum * 100 / A4_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("R4/A4", A4_sum > 0 ? Math.Round(R4_sum * 100 / A4_sum, 2, MidpointRounding.AwayFromZero) : 0);
                mergeKeyValue.Add("S4/A4", A4_sum > 0 ? Math.Round(S4_sum * 100 / A4_sum, 2, MidpointRounding.AwayFromZero) : 0);
                #endregion

                //  學校代碼及名稱
                mergeKeyValue.Add("學校代碼", K12.Data.School.Code);
                mergeKeyValue.Add("填報學校", K12.Data.School.ChineseName);

                foreach (string key in mergeKeyValue.Keys)
                {
                    keys.Add(key);
                    values.Add(mergeKeyValue[key]);
                }

                dataDoc.MailMerge.Execute(keys.ToArray(), values.ToArray());
                doc.Sections.Add(doc.ImportNode(dataDoc.Sections[0], true));
                return doc;
            });
            task.ContinueWith((x) =>
            {
                this.btnPrint.Enabled = true;
                this.circularProgress.Visible = false;
                this.circularProgress.IsRunning = false;

                if (x.Exception != null)
                    MessageBox.Show(x.Exception.InnerException.Message);
                else
                    Completed("國中畢業學生進路調查填報表格", x.Result);
            }, System.Threading.CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());
        }
        void _bgPrintData_DoWork(object sender, DoWorkEventArgs e)
        {
            _bgPrintData.ReportProgress(1);
            AddTableColumn();
            Document doc = new Document();
            doc.Sections.Clear();
            
            // 取得缺曠資料
            _SelectAttendanceList = UDTTransfer.UDTAttendanceSelectByCourseIDList(_SelectCourseIDList);
            // 取得課程修課
            _SelectSCList = UDTTransfer.UDTSCSelectByCourseIDList(_SelectCourseIDList);
            Dictionary<string, List<string>> _SCStudernDict = new Dictionary<string, List<string>>();
            foreach (UDTScselectDef data in _SelectSCList)
            { 
                string cid=data.CourseID.ToString();

                if (!_SCStudernDict.ContainsKey(cid))
                    _SCStudernDict.Add(cid, new List<string>());
                _SCStudernDict[cid].Add(data.StudentID.ToString());
            }

            _StudentIDList.Clear();
            _StudentDict.Clear();
            _AddressDict.Clear();
            _ParentDict.Clear();
            
            // 取得有缺曠學生id
            foreach (UDTAttendanceDef data in _SelectAttendanceList)
            {
                string sid = data.StudentID.ToString();
                if (!_StudentIDList.Contains(sid))
                    _StudentIDList.Add(sid);
            }

            // 取得學生資料
            foreach (StudentRecord rec in Student.SelectByIDs(_StudentIDList))
                _StudentDict.Add(rec.ID, rec);

            // 地址資料
            foreach (AddressRecord rec in Address.SelectByStudentIDs(_StudentIDList))
            {
                if (!_AddressDict.ContainsKey(rec.RefStudentID))
                    _AddressDict.Add(rec.RefStudentID, rec);
            }
            
            // 家長資料
            foreach (ParentRecord rec in K12.Data.Parent.SelectByStudentIDs(_StudentIDList))
            {
                if (!_ParentDict.ContainsKey(rec.RefStudentID))
                    _ParentDict.Add(rec.RefStudentID, rec);
            }

            // 教師姓名
            _TeacherNameDict.Clear();
            foreach (TeacherRecord rec in Teacher.SelectAll())
            {
                if (rec.Status == TeacherRecord.TeacherStatus.刪除)
                    continue;

                string name = rec.Name;
                if(!string.IsNullOrWhiteSpace(rec.Nickname))
                    name="("+rec.Nickname+")";
                
                _TeacherNameDict.Add(rec.ID, name);
            }

            // 班級名稱
            _ClassNameDict.Clear();
            foreach (ClassRecord cr in Class.SelectAll())
                _ClassNameDict.Add(cr.ID, cr.Name);

            string SchoolName = School.ChineseName;
            string SchoolAddress = School.Address;
            string SchoolTel = School.Telephone;

            _bgPrintData.ReportProgress(20);
            // 整理資料並過濾畫面上已修課學生
            // 學校名稱、學校地址、學校電話、收件人、收件地址、學年度、學期、梯次、班級、座號、學號、
            // 學生姓名、教師、課程名稱、缺曠統計、缺曠資料。
            int idx = 1;
            foreach (string StudID in _StudentIDList)
            {
                _dtTable.Clear();
                DataRow row = _dtTable.NewRow();
                
           // 處理 Word 資料合併
            Document document = new Document();
            document.Sections[0].PageSetup.PaperSize = PaperSize.A4;
            NodeCollection doctables = _WordTemplate.GetChildNodes(NodeType.Table, true);
            Node docdstNode = document.ImportNode(doctables[0], true, ImportFormatMode.KeepSourceFormatting);
            document.LastSection.Body.AppendChild(docdstNode);

            
                // 學校名稱
                row["學校名稱"] = SchoolName;
                // 學校地址
                row["學校地址"] = SchoolAddress;
                // 學校電話
                row["學校電話"] = SchoolTel;
                if (_StudentDict.ContainsKey(StudID))
                {
                    rpt_StudentInfo StudentInfoData = new rpt_StudentInfo();

                    // 收件人姓名
                    row["收件人姓名"] = _StudentDict[StudID].Name;
                    StudentInfoData.MailName = _StudentDict[StudID].Name;
                    if (_ParentDict.ContainsKey(StudID))
                    {
                        string name = _StudentDict[StudID].Name;
                        if (_SelectMailName == "監護人姓名")
                            name = _ParentDict[StudID].CustodianName;

                        if (_SelectMailName == "父親姓名")
                            name = _ParentDict[StudID].FatherName;

                        if (_SelectMailName == "母親姓名")
                            name = _ParentDict[StudID].MotherName;

                        row["收件人姓名"] = name;
                        StudentInfoData.MailName = name;
                    }

                    // 收件人地址
                    row["收件人地址"] = "";
                    if (_AddressDict.ContainsKey(StudID))
                    {
                        string address = "";
                        if (_SelectMailAddress == "戶籍地址")
                            address = _AddressDict[StudID].PermanentAddress;

                        if (_SelectMailAddress == "聯絡地址")
                            address = _AddressDict[StudID].MailingAddress;

                        if (_SelectMailAddress == "其他地址")
                            address = _AddressDict[StudID].Address1Address;

                        row["收件人地址"] = address;
                        StudentInfoData.MailAddress = address;
                    }

                    // 班級
                    if (_ClassNameDict.ContainsKey(_StudentDict[StudID].RefClassID))
                    {
                        row["班級"] = _ClassNameDict[_StudentDict[StudID].RefClassID];
                        StudentInfoData.ClassName = _ClassNameDict[_StudentDict[StudID].RefClassID];
                    }

                    row["座號"] = "";
                    // 座號
                    if (_StudentDict[StudID].SeatNo.HasValue)
                        row["座號"] = _StudentDict[StudID].SeatNo.Value;

                    StudentInfoData.SeatNo = _StudentDict[StudID].SeatNo.Value;

                    // 學號
                    row["學號"] = _StudentDict[StudID].StudentNumber;
                    StudentInfoData.StudentNumber = _StudentDict[StudID].StudentNumber;

                    // 學生姓名
                    row["學生姓名"] = _StudentDict[StudID].Name;
                    StudentInfoData.Name = _StudentDict[StudID].Name;

                    int sid = int.Parse(StudID);
                    // 分課程
                    Dictionary<int, List<UDTAttendanceDef>> coAttendDict = new Dictionary<int, List<UDTAttendanceDef>>();
                    foreach (UDTAttendanceDef atData in _SelectAttendanceList.Where(x => x.StudentID == sid))
                    {
                        if (!coAttendDict.ContainsKey(atData.CourseID))
                            coAttendDict.Add(atData.CourseID, new List<UDTAttendanceDef>());

                        coAttendDict[atData.CourseID].Add(atData);
                    }

                    // 處理課程細項
                    foreach (KeyValuePair<int, List<UDTAttendanceDef>> atData in coAttendDict)
                    {
                        DataTable dt = new DataTable();
                        dt.Columns.Add("學年度");
                        dt.Columns.Add("學期");
                        dt.Columns.Add("梯次");
                        dt.Columns.Add("班級");
                        dt.Columns.Add("座號");
                        dt.Columns.Add("學號");
                        dt.Columns.Add("學生姓名");
                        dt.Columns.Add("教師");
                        dt.Columns.Add("課程名稱");
                        dt.Columns.Add("缺曠統計");
                        dt.Columns.Add("缺曠明細");
                        
                        string coid = atData.Key.ToString();

                        foreach (UDTCourseDef coData in _SelectCourseList.Where(x => x.UID == coid))
                        {
                            // 檢查有修課學生
                            if(_SCStudernDict.ContainsKey(coid))
                                if (_SCStudernDict[coid].Contains(StudID))
                                {


                                    DataRow dt_row = dt.NewRow();

                                    dt_row["學年度"] = coData.SchoolYear;
                                    dt_row["學期"] = coData.Semester;
                                    dt_row["梯次"] = coData.Month;
                                    // 班級
                                    if (_ClassNameDict.ContainsKey(_StudentDict[StudID].RefClassID))
                                        dt_row["班級"] = _ClassNameDict[_StudentDict[StudID].RefClassID];

                                    dt_row["座號"] = "";
                                    // 座號
                                    if (_StudentDict[StudID].SeatNo.HasValue)
                                        dt_row["座號"] = _StudentDict[StudID].SeatNo.Value;

                                    // 學號
                                    dt_row["學號"] = _StudentDict[StudID].StudentNumber;

                                    // 學生姓名
                                    dt_row["學生姓名"] = _StudentDict[StudID].Name;

                                    string tid = coData.RefTeacherID.ToString();
                                    // 教師
                                    if (_TeacherNameDict.ContainsKey(tid))
                                        dt_row["教師"] = _TeacherNameDict[tid];

                                    // 課程名稱
                                    dt_row["課程名稱"] = coData.CourseName;




                                    dt_row["缺曠統計"] = atData.Value.Count;

                                    // 存放上課時間與缺曠比對後
                                    Dictionary<DateTime, List<int>> atDict = new Dictionary<DateTime, List<int>>();

                                    foreach (UDTAttendanceDef dd in atData.Value)
                                    {
                                        foreach (UDTTimeSectionDef tt in _SelectTimeSectionList.Where(x => x.UID == dd.TimeSectionID.ToString()))
                                        {
                                            if (!atDict.ContainsKey(tt.Date))
                                                atDict.Add(tt.Date, new List<int>());

                                            atDict[tt.Date].Add(tt.Period);
                                        }
                                    }

                                    if (Global._TempStudentTimeSectionDict.ContainsKey(StudID))
                                        Global._TempStudentTimeSectionDict[StudID] = atDict;
                                    else
                                        Global._TempStudentTimeSectionDict.Add(StudID, atDict);

                                    dt_row["缺曠明細"] = StudID;
                                    // 缺曠統計
                                    dt.Rows.Add(dt_row);

                                    NodeCollection tables = _WordTemplate.GetChildNodes(NodeType.Table, true);
                                    Document subDoc = new Document();
                                    subDoc.Sections[0].PageSetup.PaperSize = PaperSize.A4;

                                    subDoc.MailMerge.MergeField += new Aspose.Words.Reporting.MergeFieldEventHandler(MailMerge_MergeField);
                                    Node dstNode = subDoc.ImportNode(tables[1], true, ImportFormatMode.KeepSourceFormatting);
                                    _builder = new DocumentBuilder(subDoc);
                                    subDoc.LastSection.Body.AppendChild(dstNode);
                                    subDoc.MailMerge.Execute(dt);
                                    subDoc.MailMerge.RemoveEmptyParagraphs = true;
                                    subDoc.MailMerge.DeleteFields();
                                    document.Sections.Add(document.ImportNode(subDoc.Sections[0], true));
                                }
                        }
                    }

                    _StudentInfoList.Add(StudentInfoData);
                    // 加入 DatatTablle
                    _dtTable.Rows.Add(row);
                }


                document.MailMerge.Execute(_dtTable);
                document.MailMerge.RemoveEmptyParagraphs = true;
                document.MailMerge.DeleteFields();

                // 處理 section break
                for (int i = document.Sections.Count - 2; i >= 0; i--)
                {
                    document.LastSection.PrependContent(document.Sections[i]);
                    document.Sections[i].Remove();
                }


                for (int i = 0; i < document.Sections.Count; i++)                                    
                    doc.Sections.Add(doc.ImportNode(document.Sections[i], true));
                
            }            

            //doc.MailMerge.MergeField += new Aspose.Words.Reporting.MergeFieldEventHandler(MailMerge_MergeField);
            //doc.MailMerge.Execute(_dtTable);
            //doc.MailMerge.RemoveEmptyParagraphs = true;
            //doc.MailMerge.DeleteFields();
            _bgPrintData.ReportProgress(95);
            e.Result = doc;            
        }
        void _bgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            _studDataDict.Clear();
            _dataDictList.Clear();
            string SchoolName = School.ChineseName;

            Dictionary<int, string> intTeacherNameDict = new Dictionary<int, string>();
            foreach (TeacherRecord tr in Teacher.SelectAll())
            {
                if (tr.Status == TeacherRecord.TeacherStatus.刪除)
                    continue;

                int tid = int.Parse(tr.ID);
                string TName=tr.Name;
                if (!string.IsNullOrWhiteSpace(tr.Nickname))
                    TName = tr.Name + "(" + tr.Nickname + ")";

                intTeacherNameDict.Add(tid, TName);
            }

            if (_UserSelectType == SelectType.學生)
            {

                // 取得學生資料
                foreach (StudentRecord stud in Student.SelectByIDs(_studIDList))
                    _studDataDict.Add(stud.ID, stud);

                // 取得晤談紀錄
                List<UDT_CounselStudentInterviewRecordDef> dataList = _UDTTransfer.GetCounselStudentInterviewRecordByStudentIDList(_studIDList);

                // 透過 query 依照班級序號、班級名稱、學號座號排序
                _studIDList = Utility.SortStudentID1(_studIDList);

                foreach (string studID in _studIDList)
                {
                    int sid = int.Parse(studID);
                    string studName = "";
                    string StudNumber = "";
                    string ClassName = "";
                    string StudSeatNo = "";
                    if (_studDataDict.ContainsKey(studID))
                    {
                        studName = _studDataDict[studID].Name;
                        StudNumber = _studDataDict[studID].StudentNumber;
                        if (_studDataDict[studID].Class != null)
                            ClassName = _studDataDict[studID].Class.Name;

                        if (_studDataDict[studID].SeatNo.HasValue)
                            StudSeatNo = _studDataDict[studID].SeatNo.Value.ToString();
                    }

                    List<UDT_CounselStudentInterviewRecordDef> studInterviewList = (from da in dataList where da.StudentID == sid orderby da.InterviewDate select da).ToList();

                    //// 當沒有資料顯示一張有名稱空的
                    //if (studInterviewList.Count == 0)
                    //{
                    //    Dictionary<string, string> mapDict1 = new Dictionary<string, string>();
                    //    mapDict1.Add("校名", SchoolName);
                    //    mapDict1.Add("學生姓名", studName);
                    //    mapDict1.Add("學號", StudNumber);
                    //    mapDict1.Add("班級", ClassName);
                    //    mapDict1.Add("座號", StudSeatNo);
                    //    _dataDictList.Add(mapDict1);
                    //}

                    foreach (UDT_CounselStudentInterviewRecordDef data in studInterviewList)
                    {
                        Dictionary<string, string> mapDict = new Dictionary<string, string>();
                        mapDict.Add("校名", SchoolName);
                        mapDict.Add("學生姓名", studName);
                        mapDict.Add("學號", StudNumber);
                        mapDict.Add("班級", ClassName);
                        if (intTeacherNameDict.ContainsKey(data.TeacherID))
                            mapDict.Add("晤談老師", intTeacherNameDict[data.TeacherID]);

                        mapDict.Add("晤談編號", data.InterviewNo);
                        mapDict.Add("座號", StudSeatNo);
                        mapDict.Add("晤談對象", data.IntervieweeType);
                        mapDict.Add("晤談方式", data.InterviewType);
                        if (data.InterviewDate.HasValue)
                            mapDict.Add("晤談日期", data.InterviewDate.Value.ToShortDateString());
                        mapDict.Add("時間", data.InterviewTime);
                        mapDict.Add("地點", data.Place);
                        mapDict.Add("參與人員", ParseUDTXML1(data.Attendees));
                        mapDict.Add("晤談事由", data.Cause);
                        mapDict.Add("輔導方式", ParseUDTXML1(data.CounselType));
                        mapDict.Add("輔導歸類", ParseUDTXML1(data.CounselTypeKind));
                        mapDict.Add("內容要點", data.ContentDigest);
                        mapDict.Add("記錄者姓名", data.AuthorName);
                        _dataDictList.Add(mapDict);
                    }

                }
            }

            if (_UserSelectType == SelectType.教師)
            {
                List<int> sortStudIDList = new List<int>();
                // 透過教師取得所屬晤談紀錄
                List<UDT_CounselStudentInterviewRecordDef> InterviewRecorT = _UDTTransfer.GetCounselStudentInterviewRecordByTeacherIDList(_TeacherIDList);
                // 取得晤談紀錄內學生id
                List<string> InterviewRecorStudIDList = new List<string>();
                foreach (UDT_CounselStudentInterviewRecordDef data in InterviewRecorT)
                {
                    if (!sortStudIDList.Contains(data.StudentID))
                        sortStudIDList.Add(data.StudentID);

                    string key = data.StudentID.ToString();
                    if (!InterviewRecorStudIDList.Contains(key))
                        InterviewRecorStudIDList.Add(key);
                }
                // 取得學生資訊
                Dictionary<int, StudentRecord> InterviewRecorStudDict = new Dictionary<int, StudentRecord>();
                foreach (StudentRecord rec in Student.SelectByIDs(InterviewRecorStudIDList))
                {
                    int sid = int.Parse(rec.ID);
                    if (!InterviewRecorStudDict.ContainsKey(sid))
                        InterviewRecorStudDict.Add(sid, rec);
                }

                // 轉換教師ID int
                List<int> intTeacherIDList = new List<int>();
                foreach (string tid in _TeacherIDList)
                    intTeacherIDList.Add(int.Parse(tid));

                sortStudIDList = Utility.SortStudentID2(sortStudIDList);
                // 組資料
                foreach (int id in intTeacherIDList)
                {

                    List<UDT_CounselStudentInterviewRecordDef> dataTT = (from data in InterviewRecorT where data.TeacherID == id orderby data.StudentID,data.InterviewDate  select data).ToList();
                    // 依班級順序、班級名稱、學生座號排序後加入
                    List<UDT_CounselStudentInterviewRecordDef> dataT = new List<UDT_CounselStudentInterviewRecordDef>();
                    foreach (int ssid in sortStudIDList)
                    {
                        foreach (UDT_CounselStudentInterviewRecordDef data in dataTT.Where(x => x.StudentID == ssid))
                            dataT.Add(data);
                    }

                    foreach (UDT_CounselStudentInterviewRecordDef data in dataT)
                    {
                        string studName = "";
                        string StudNumber = "";
                        string ClassName = "";
                        string StudSeatNo = "";
                        if (InterviewRecorStudDict.ContainsKey(data.StudentID))
                        {
                            studName = InterviewRecorStudDict[data.StudentID].Name;
                            StudNumber = InterviewRecorStudDict[data.StudentID].StudentNumber;
                            if (InterviewRecorStudDict[data.StudentID].Class != null)
                                ClassName = InterviewRecorStudDict[data.StudentID].Class.Name;

                            if (InterviewRecorStudDict[data.StudentID].SeatNo.HasValue)
                                StudSeatNo = InterviewRecorStudDict[data.StudentID].SeatNo.Value.ToString();
                        }

                        Dictionary<string, string> mapDict = new Dictionary<string, string>();
                        mapDict.Add("校名", SchoolName);
                        mapDict.Add("學生姓名", studName);
                        mapDict.Add("學號", StudNumber);
                        mapDict.Add("班級", ClassName);
                        if (intTeacherNameDict.ContainsKey(data.TeacherID))
                            mapDict.Add("晤談老師", intTeacherNameDict[data.TeacherID]);

                        mapDict.Add("晤談編號", data.InterviewNo);
                        mapDict.Add("座號", StudSeatNo);
                        mapDict.Add("晤談對象", data.IntervieweeType);
                        mapDict.Add("晤談方式", data.InterviewType);
                        if (data.InterviewDate.HasValue)
                            mapDict.Add("晤談日期", data.InterviewDate.Value.ToShortDateString());
                        mapDict.Add("時間", data.InterviewTime);
                        mapDict.Add("地點", data.Place);
                        mapDict.Add("參與人員", ParseUDTXML1(data.Attendees));
                        mapDict.Add("晤談事由", data.Cause);
                        mapDict.Add("輔導方式", ParseUDTXML1(data.CounselType));
                        mapDict.Add("輔導歸類", ParseUDTXML1(data.CounselTypeKind));
                        mapDict.Add("內容要點", data.ContentDigest);
                        mapDict.Add("記錄者姓名", data.AuthorName);
                        _dataDictList.Add(mapDict);
                    }
                }

            }

            // word 資料合併
            Document doc = new Document();
            doc.Sections.Clear();

            // 比對欄位名稱放值
            List<string> mapFieldName = new List<string>();
            mapFieldName.Add("校名");
            mapFieldName.Add("學生姓名");
            mapFieldName.Add("學號");
            mapFieldName.Add("班級");
            mapFieldName.Add("晤談老師");
            mapFieldName.Add("晤談編號");
            mapFieldName.Add("座號");
            mapFieldName.Add("晤談對象");
            mapFieldName.Add("晤談方式");
            mapFieldName.Add("晤談日期");
            mapFieldName.Add("時間");
            mapFieldName.Add("地點");
            mapFieldName.Add("參與人員");
            mapFieldName.Add("晤談事由");
            mapFieldName.Add("輔導方式");
            mapFieldName.Add("輔導歸類");
            mapFieldName.Add("內容要點");
            mapFieldName.Add("記錄者姓名");

            foreach (Dictionary<string, string> data in _dataDictList)
            {
                DataTable dt = new DataTable();
                // 建立欄位名稱
                foreach (string name in mapFieldName)
                    dt.Columns.Add(name, typeof(string));

                DataRow dr = dt.NewRow();
                foreach (string name in mapFieldName)
                {
                    if (data.ContainsKey(name))
                        dr[name] = data[name];
                }
                dt.Rows.Add(dr);
               Document docTemplate = new Document(new MemoryStream(_DocTemplate));
               DocumentBuilder _builder = new DocumentBuilder(docTemplate);
               docTemplate.MailMerge.MergeField += new Aspose.Words.Reporting.MergeFieldEventHandler(MailMerge_MergeField);
                docTemplate.MailMerge.RemoveEmptyParagraphs = true;
                docTemplate.MailMerge.Execute(dt);
                docTemplate.MailMerge.DeleteFields();
                doc.Sections.Add(doc.ImportNode(docTemplate.Sections[0], true));
            }
            e.Result = doc;
        }
Example #11
0
        void _bgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            _DataTable = new DataTable();
            // 新增 DataTable Columns
            AddTableColumns();

            _bgWorker.ReportProgress(1);
            // word 資料合併
            Document doc = new Document();
            doc.Sections.Clear();

            // 取得資料
            _StudentRecDict.Clear();
            foreach (SHStudentRecord rec in SHStudent.SelectByIDs(_StudentIDList))
            {
                if (!_StudentRecDict.ContainsKey(rec.ID))  //假如沒有這個ID才加入
                {
                    _StudentRecDict.Add(rec.ID, rec);
                }
            }
            //新加
            _ClassStuRecDict.Clear();
            foreach (SHStudentRecord rec in _StudentRecDict.Values)
            {
                if (rec.RefClassID != "")
                {
                    SHClassRecord _class = SHClass.SelectByID(rec.RefClassID);
                    if (!_ClassStuRecDict.ContainsKey(_class.ID))
                    {
                        _ClassStuRecDict.Add(rec.ID, _class);
                    }
                }

                //foreach (SHClassRecord recCla in SHClass.SelectByIDs(_ClassIDList))
                //{
                //    if (rec.RefClassID == recCla.ID)
                //    {
                //        _ClassStuRecDict.Add(rec.ID, recCla);
                //    }
                //}
            }

            _PhoneRecDict.Clear();
            foreach (SHPhoneRecord rec in SHPhone.SelectByStudentIDs(_StudentIDList))
                _PhoneRecDict.Add(rec.RefStudentID, rec);

            // 入學照片
            _PhotoPDict.Clear();
            _PhotoPDict = K12.Data.Photo.SelectFreshmanPhoto(_StudentIDList);

            // 畢業照片
            _PhotoGDict.Clear();
            _PhotoGDict = K12.Data.Photo.SelectGraduatePhoto(_StudentIDList);

            //監護人(父母親)
            _ParentRecDict.Clear();
            foreach (SHParentRecord rec in SHParent.SelectByStudentIDs(_StudentIDList))
                _ParentRecDict.Add(rec.RefStudentID, rec);

            //地址
            _AddressRecDict.Clear();
            foreach (SHAddressRecord rec in SHAddress.SelectByStudentIDs(_StudentIDList))
                _AddressRecDict.Add(rec.RefStudentID, rec);

            // 學校名稱
            string SchoolName = K12.Data.School.ChineseName;

            _bgWorker.ReportProgress(30);

            // 開始填入資料
            foreach (string StudID in _StudentIDList)
            {

                DataRow row = _DataTable.NewRow();

                row["學校名稱"] = SchoolName;
                if (_StudentRecDict.ContainsKey(StudID))
                {
                    if (_StudentRecDict[StudID].Department != null)
                        row["科別"] = _StudentRecDict[StudID].Department.FullName;
                    else
                        row["科別"] = "";

                    row["班級"] = _ClassStuRecDict[StudID].Name;//新加
                    row["學號"] = _StudentRecDict[StudID].StudentNumber;
                    row["座號"] = _StudentRecDict[StudID].SeatNo;
                    row["條碼"] = _StudentRecDict[StudID].StudentNumber;
                    row["姓名"] = _StudentRecDict[StudID].Name;
                    row["英文姓名"] = _StudentRecDict[StudID].EnglishName;
                    row["性別"] = _StudentRecDict[StudID].Gender;
                    row["身分證字號"] = _StudentRecDict[StudID].IDNumber;
                    if (_StudentRecDict[StudID].Birthday.HasValue)
                    {
                        DateTime dtb = _StudentRecDict[StudID].Birthday.Value;
                        row["生日"] = dtb.Year + "/" + dtb.Month + "/" + dtb.Day;
                        row["生日2"] = (dtb.Year - 1911) + "/" + dtb.Month + "/" + dtb.Day;
                    }
                    else
                    {
                        row["生日"] = "";
                        row["生日2"] = "";
                    }
                }

                if (_PhotoPDict.ContainsKey(StudID))
                {
                    row["照片"] = _PhotoPDict[StudID];
                    row["照片2"] = _PhotoPDict[StudID];
                }

                if (_PhotoGDict.ContainsKey(StudID))
                {
                    row["畢業照片"] = _PhotoGDict[StudID];
                    row["畢業照片2"] = _PhotoGDict[StudID];
                }

                if (_PhoneRecDict.ContainsKey(StudID))
                {
                    row["戶籍電話"] = _PhoneRecDict[StudID].Permanent;
                    row["聯絡電話"] = _PhoneRecDict[StudID].Contact;
                }

                if (_ParentRecDict.ContainsKey(StudID))
                {
                    row["監護人電話"] = _ParentRecDict[StudID].CustodianPhone;
                    row["父親電話"] = _ParentRecDict[StudID].FatherPhone;
                    row["母親電話"] = _ParentRecDict[StudID].MotherPhone;
                    //新加
                    if (radiobtnCustodianName.Checked)
                    {
                        row["監護人姓名"] = _ParentRecDict[StudID].CustodianName;
                    }
                    else if (radiobtnFatherName.Checked)
                    {
                        row["父親姓名"] = _ParentRecDict[StudID].FatherName;
                    }
                    else
                    {
                        row["母親姓名"] = _ParentRecDict[StudID].MotherName;
                    }
                }

                if (_AddressRecDict.ContainsKey(StudID))
                {
                    //新加
                    if (radiobtnPermanentAddress.Checked)
                    {
                        row["戶籍地址"] = _AddressRecDict[StudID].PermanentAddress;
                    }
                    else if (radiobtnMailingAddress.Checked)
                    {
                        row["聯絡地址"] = _AddressRecDict[StudID].MailingAddress;
                    }
                    else
                    {
                        row["其它地址"] = _AddressRecDict[StudID].Address1;//新加
                    }
                }

                _DataTable.Rows.Add(row);

            }

            _bgWorker.ReportProgress(70);
            int page = 1;

            count = 0;
            List<string> mapNameList = _Config.Template.ToDocument().MailMerge.GetFieldNames().ToList();
            foreach (string str in mapNameList)
                if (str == "姓名")
                    count++;

            for (int i = 1; i <= _StudentIDList.Count; i++)
                if (i % count == 0 && i >= count)
                    page++;

            // 當人數與一頁個數相同,只有一頁
            if (count == _StudentIDList.Count)
                page = 1;

            for (int i = 1; i <= page; i++)
            {
                Document document = new Document();
                document = _Config.Template.ToDocument();
                doc.Sections.Add(doc.ImportNode(document.Sections[0], true));
            }
            doc.MailMerge.MergeField += new Aspose.Words.Reporting.MergeFieldEventHandler(MailMerge_MergeField);
            doc.MailMerge.Execute(_DataTable);
            doc.MailMerge.RemoveEmptyParagraphs = true;
            doc.MailMerge.DeleteFields();
            //doc.Sections.Add(doc.ImportNode(document.Sections[0], true));
            _bgWorker.ReportProgress(95);
            e.Result = doc;
        }
        void _bgWork_DoWork(object sender, DoWorkEventArgs e)
        {
            Document doc = new Document();
            doc.Sections.Clear();

            // 比對欄位名稱放值
            foreach (Dictionary<string, string> data in _DocDataList)
            {
                DataTable dt = new DataTable();
                // 建立欄位名稱
                foreach (string name in _MergeNameList)
                    dt.Columns.Add(name, typeof(string));

                DataRow dr = dt.NewRow();
                foreach (string name in _MergeNameList)
                {
                    if (data.ContainsKey(name))
                        dr[name] = data[name];
                }
                dt.Rows.Add(dr);
                docTemplate = new Document(new MemoryStream(_DocTemplate));
                _builder = new DocumentBuilder(docTemplate);
                docTemplate.MailMerge.MergeField += new Aspose.Words.Reporting.MergeFieldEventHandler(MailMerge_MergeField);
                docTemplate.MailMerge.RemoveEmptyParagraphs = true;
                docTemplate.MailMerge.Execute(dt);
                docTemplate.MailMerge.DeleteFields();
                doc.Sections.Add(doc.ImportNode(docTemplate.Sections[0], true));
            }
            e.Result = doc;
        }