void _bgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            _studDataDict.Clear();
            _dataDictList.Clear();
            string SchoolName = School.ChineseName;

            SaveConfig(是否使用範本);

            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.學生)
            {
                #region 學生
                // 取得學生資料
                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();

                    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);
                    }
                }
                #endregion
            }

            if (_UserSelectType == SelectType.教師)
            {
                #region 教師
                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);
                    }
                }
                #endregion
            }

            // 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("記錄者姓名");

            //取得範本樣式

            MemoryStream _template;
            if (!是否使用範本)
            {
                _template = new MemoryStream(Properties.Resources.學生晤談記錄表_新範本);
            }
            else
            {
                ConfigData cd     = K12.Data.School.Configuration[_ReportName];
                XmlElement config = cd.GetXml("XmlData", null);
                if (config != null)
                {
                    string templateBase64 = config.InnerText;
                    byte[] _buffer        = Convert.FromBase64String(templateBase64);
                    _template = new MemoryStream(_buffer);
                }
                else
                {
                    _template = new MemoryStream(Properties.Resources.學生晤談記錄表_新範本);
                }
            }


            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(_template);

                docTemplate.MailMerge.FieldMergingCallback = new InsertDocumentAtMailMergeHandler();
                //已過時,改用Aspose.Words.Reporting.MailMergeCleanupOptions.RemoveEmptyParagraphs
                //docTemplate.MailMerge.RemoveEmptyParagraphs = true;

                docTemplate.MailMerge.CleanupOptions = Aspose.Words.Reporting.MailMergeCleanupOptions.RemoveEmptyParagraphs;
                docTemplate.MailMerge.Execute(dt);
                docTemplate.MailMerge.DeleteFields();
                doc.Sections.Add(doc.ImportNode(docTemplate.Sections[0], true));
            }
            e.Result = doc;
        }