private void BgWorkerReport_DoWork(object sender, DoWorkEventArgs e)
        {
            DataTable dtTable = new DataTable();

            bgWorkerReport.ReportProgress(1);

            Document docTemplate = _Configure.Template;

            if (docTemplate == null)
            {
                docTemplate = new Document(new MemoryStream(Properties.Resources.屏東班級服務表現樣板));
            }


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

            // 取得班導師
            Dictionary <string, string> ClassTeacherNameDict = QueryData.GetClassTeacherNameDictByClassID(ClassIDList);

            // 產生合併欄位
            dtTable.Columns.Add("學校名稱");
            dtTable.Columns.Add("班級名稱");
            dtTable.Columns.Add("學年度");

            for (int studIdx = 1; studIdx <= 100; studIdx++)
            {
                dtTable.Columns.Add("座號" + studIdx);
                dtTable.Columns.Add("姓名" + studIdx);
                dtTable.Columns.Add("服務表現項目7上" + studIdx);
                dtTable.Columns.Add("服務表現項目7下" + studIdx);
                dtTable.Columns.Add("服務表現項目8上" + studIdx);
                dtTable.Columns.Add("服務表現項目8下" + studIdx);
                dtTable.Columns.Add("服務表現項目9上" + studIdx);
                dtTable.Columns.Add("服務表現積分" + studIdx);
                dtTable.Columns.Add("服務表現備註" + studIdx);
            }

            // 取得班級學生相關資料
            Dictionary <string, List <StudentInfo> > ClassStudentDict = QueryData.GetClassStudentDict(ClassIDList);
            Dictionary <string, ClassRecord>         classRecDict     = new Dictionary <string, ClassRecord>();
            List <ClassRecord> claRecList = Class.SelectByIDs(ClassIDList);

            foreach (ClassRecord data in claRecList)
            {
                if (!classRecDict.ContainsKey(data.ID))
                {
                    classRecDict.Add(data.ID, data);
                }
            }

            //StreamWriter sw1 = new StreamWriter(Application.StartupPath + "\\合併欄位.txt");
            //StringBuilder sb1 = new StringBuilder();
            //foreach (DataColumn dc in dtTable.Columns)
            //    sb1.AppendLine(dc.Caption);

            //sw1.Write(sb1.ToString());
            //sw1.Close();

            // 排序後班級
            foreach (string class_id in ClassTeacherNameDict.Keys)
            {
                DataRow row = dtTable.NewRow();
                row["學校名稱"] = SchoolName;
                if (classRecDict.ContainsKey(class_id))
                {
                    row["班級名稱"] = classRecDict[class_id].Name;
                }

                int sc;
                if (int.TryParse(K12.Data.School.DefaultSchoolYear, out sc))
                {
                    row["學年度"] = sc + 1;
                }
                if (ClassStudentDict.ContainsKey(class_id))
                {
                    int studIdx = 1;
                    foreach (StudentInfo si in ClassStudentDict[class_id])
                    {
                        row["座號" + studIdx]       = si.SeatNo;
                        row["姓名" + studIdx]       = si.StudentName;
                        row["服務表現項目7上" + studIdx] = string.Join("\n", si.ServiceItem_7a.ToArray());
                        row["服務表現項目7下" + studIdx] = string.Join("\n", si.ServiceItem_7b.ToArray());
                        row["服務表現項目8上" + studIdx] = string.Join("\n", si.ServiceItem_8a.ToArray());
                        row["服務表現項目8下" + studIdx] = string.Join("\n", si.ServiceItem_8b.ToArray());
                        row["服務表現項目9上" + studIdx] = string.Join("\n", si.ServiceItem_9a.ToArray());
                        row["服務表現積分" + studIdx]   = si.ServiceScore;
                        row["服務表現備註" + studIdx]   = string.Join("\n", si.ServiceMemo.ToArray());
                        studIdx++;
                    }
                }

                dtTable.Rows.Add(row);
            }

            //// debug
            //dtTable.TableName = "debug";
            //dtTable.WriteXml(Application.StartupPath + "\\debug.xml");

            Document doc = _Configure.Template;

            doc.MailMerge.Execute(dtTable);
            doc.MailMerge.DeleteFields();
            e.Result = doc;
            bgWorkerReport.ReportProgress(100);
        }