Beispiel #1
0
 private void MailMerge_MergeField(object sender, MergeFieldEventArgs args)
 {
     // Conditionally format data during Merge.
     if (args.RowIndex % 2 == 0)
     {
         args.CharacterFormat.TextColor = Color.DarkBlue;
     }
 }
 private void AlternateRows_MergeField(object sender, MergeFieldEventArgs args)
 {
     // Conditionally format data during Merge.
     if (args.RowIndex % 2 == 0)
     {
         args.CharacterFormat.TextColor = Syncfusion.Drawing.Color.FromArgb(255, 102, 0);
     }
 }
Beispiel #3
0
 void MailMerge_MergeField(object sender, MergeFieldEventArgs args)
 {
     //Next row
     if (args.RowIndex > lastIndex)
     {
         lastIndex = args.RowIndex;
         AddPageBreakForMergeField(args.CurrentMergeField);
     }
 }
 /// <summary>
 /// Method to handle MergeField event.
 /// </summary>
 private static void AlternateRows_MergeField(object sender, MergeFieldEventArgs args)
 {
     // Conditionally format data during mail merge
     if (args.RowIndex % 2 != 0)
     {
         //Formats the merged text of alternate row with different text color.
         args.CharacterFormat.TextColor = Color.FromArgb(196, 89, 17);
     }
 }
Beispiel #5
0
 protected void HandleMergeField(object sender, MergeFieldEventArgs e)
 {
     // All merge fields that expect HTML data should be marked with some prefix, e.g. 'html'.
     if (e.DocumentFieldName == "Description")
     {
         // Insert the text for this merge field as HTML data, using DocumentBuilder.
         DocumentBuilder builder = new DocumentBuilder(e.Document);
         builder.MoveToMergeField(e.DocumentFieldName);
         builder.InsertHtml((string)e.FieldValue);
         // The HTML text itself should not be inserted.
         // We have already inserted it as an HTML.
         e.Text = "";
     }
 }
 /// <summary>
 /// Replaces merge field with HTML string by using MergeFieldEventHandler.
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="args"></param>
 public static void MergeFieldEvent(object sender, MergeFieldEventArgs args)
 {
     if (args.TableName.Equals("HTML"))
     {
         if (args.FieldName.Equals("ProductList"))
         {
             string     text       = args.FieldValue as string;
             WParagraph paragraph  = args.CurrentMergeField.OwnerParagraph;
             int        paraIndex  = paragraph.OwnerTextBody.ChildEntities.IndexOf(paragraph);
             int        fieldIndex = paragraph.ChildEntities.IndexOf(args.CurrentMergeField);
             //Appends HTML string at the specified position of the document body contents
             paragraph.OwnerTextBody.InsertXHTML(args.FieldValue.ToString(), paraIndex, fieldIndex);
             //Resets the field value
             args.Text = string.Empty;
         }
     }
 }
Beispiel #7
0
        void MailMerge_MergeField(object sender, MergeFieldEventArgs args)
        {
            if (args.FieldValue == "Yes")
            {
                //Create a checkbox name
                string    checkBoxName = args.FieldName;
                Paragraph para         = args.CurrentMergeField.OwnerParagraph;
                int       index        = para.ChildObjects.IndexOf(args.CurrentMergeField);
                // Insert a check box.
                CheckBoxFormField field = para.AppendField(checkBoxName, FieldType.FieldFormCheckBox) as CheckBoxFormField;
                para.ChildObjects.Insert(index, field);
                para.ChildObjects.Remove(args.CurrentMergeField);
                field.Checked = true;
            }
            if (args.FieldValue == "No")
            {
                //Create a checkbox name
                string    checkBoxName = args.FieldName;
                Paragraph para         = args.CurrentMergeField.OwnerParagraph;
                int       index        = para.ChildObjects.IndexOf(args.CurrentMergeField);
                // Insert a check box.
                CheckBoxFormField field = para.AppendField(checkBoxName, FieldType.FieldFormCheckBox) as CheckBoxFormField;
                para.ChildObjects.Insert(index, field);
                para.ChildObjects.Remove(args.CurrentMergeField);
                field.Checked = false;
            }
            // Insert html during mail merge.
            if (args.FieldName == "Body")
            {
                Paragraph para = args.CurrentMergeField.OwnerParagraph;
                para.AppendHTML(args.FieldValue.ToString());
                para.ChildObjects.Remove(args.CurrentMergeField);
            }

            // Insert text input form field.
            if (args.FieldName == "Date")
            {
                string        textInputName = args.FieldName;
                Paragraph     para          = args.CurrentMergeField.OwnerParagraph;
                TextFormField field         = para.AppendField(textInputName, FieldType.FieldFormTextInput) as TextFormField;
                para.ChildObjects.Remove(args.CurrentMergeField);
                field.Text = args.FieldValue.ToString();
            }
        }
 /// <summary>
 /// Replaces merge field with HTML string by using MergeFieldEventHandler.
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="args"></param>
 public static void MergeFieldEvent(object sender, MergeFieldEventArgs args)
 {
     if (args.TableName.Equals("HTML"))
     {
         if (args.FieldName.Equals("ProductList"))
         {
             //Gets the current merge field owner paragraph.
             WParagraph paragraph = args.CurrentMergeField.OwnerParagraph;
             //Gets the current merge field index in the current paragraph.
             int mergeFieldIndex = paragraph.ChildEntities.IndexOf(args.CurrentMergeField);
             //Maintain HTML in collection.
             Dictionary <int, string> fieldValues = new Dictionary <int, string>();
             fieldValues.Add(mergeFieldIndex, args.FieldValue.ToString());
             //Maintain paragraph in collection.
             paraToInsertHTML.Add(paragraph, fieldValues);
             //Set field value as empty.
             args.Text = string.Empty;
         }
     }
 }
        void MailMerge_MergeField(object sender, MergeFieldEventArgs args)
        {
            // Catch the beginning of a new row.
            if (args.CurrentMergeField.FieldName.Equals("Name"))
            {
                // Set the color depending on whether the row number is even or odd.
                Color rowColor;
                if (rowIndex % 2 == 0)
                {
                    rowColor = Color.FromArgb(215, 227, 235);
                }
                else
                {
                    rowColor = Color.FromArgb(240, 242, 242);
                }

                TableCell cell = args.CurrentMergeField.OwnerParagraph.Owner as TableCell;
                TableRow  row  = cell.OwnerRow;

                row.RowFormat.BackColor = rowColor;
                rowIndex++;
            }
        }
        //最好這程式有人能維護的了.......
        private void MailMerge_MergeField(object sender, MergeFieldEventArgs e)
        {
            //不是 Fix 開頭的合併欄位不處理。
            if (!e.FieldName.ToUpper().StartsWith("Fix".ToUpper())) return;

            DocumentBuilder builder = new DocumentBuilder(e.Document);

            ReportStudent student = e.FieldValue as ReportStudent;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                    photo.Width = photo.Width * rate;
                    photo.Height = photo.Height * rate;
                }
            }
        }
Beispiel #11
0
        //最好這程式有人能維護的了.......
        private void MailMerge_MergeField(object sender, MergeFieldEventArgs e)
        {
            //不是 Fix 開頭的合併欄位不處理。
            if (!e.FieldName.ToUpper().StartsWith("Fix".ToUpper()))
            {
                return;
            }

            DocumentBuilder builder = new DocumentBuilder(e.Document);

            ReportStudent student = e.FieldValue as ReportStudent;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                    photo.Width  = photo.Width * rate;
                    photo.Height = photo.Height * rate;
                }
            }
        }
    private void MailMerge_MergeField(object sender, MergeFieldEventArgs e)
    {
        DocumentBuilder builder;
        Cell            cell;
        double          width;
        double          height;
        int             totalRow;
        double          microUnit;
        double          rowHeight;
        Table           table;

        if (e.FieldName == "缺曠獎懲")
        {
            Dictionary <string, Dictionary <string, int[]> > absenceRewardInfos = (Dictionary <string, Dictionary <string, int[]> >)e.FieldValue;
            builder = new DocumentBuilder(e.Document);
            builder.MoveToField(e.Field, true);
            e.Field.Remove();
            cell     = builder.CurrentParagraph.ParentNode as Cell;
            width    = cell.CellFormat.Width;
            height   = (cell.ParentNode as Row).RowFormat.Height;
            totalRow = 0;
            foreach (string var in absenceRewardInfos.Keys)
            {
                totalRow += absenceRewardInfos[var].Count;
            }
            microUnit = width / 7.0;
            rowHeight = (height - 60.0) / ((double)totalRow);
            table     = builder.StartTable();
            builder.CellFormat.ClearFormatting();
            builder.CellFormat.Borders.LineWidth    = 0.25;
            builder.RowFormat.HeightRule            = HeightRule.Exactly;
            builder.RowFormat.Alignment             = RowAlignment.Center;
            builder.CellFormat.VerticalAlignment    = CellVerticalAlignment.Center;
            builder.CellFormat.LeftPadding          = 3.0;
            builder.CellFormat.RightPadding         = 3.0;
            builder.ParagraphFormat.Alignment       = ParagraphAlignment.Center;
            builder.ParagraphFormat.LineSpacingRule = LineSpacingRule.AtLeast;
            builder.RowFormat.Height = 11.0;
            builder.InsertCell().CellFormat.Width = microUnit * 7.0;
            builder.Write("缺 曠 獎 懲 統 計");
            builder.EndRow();
            builder.RowFormat.Height = 49.0;
            builder.InsertCell().CellFormat.Width = microUnit * 2.0;
            builder.Write("類\n \n別");
            builder.InsertCell().CellFormat.Width = microUnit * 2.0;
            builder.Write("項\n \n目");
            builder.InsertCell().CellFormat.Width = microUnit;
            builder.Write("第\n一\n學\n期");
            builder.InsertCell().CellFormat.Width = microUnit;
            builder.Write("第\n二\n學\n期");
            builder.InsertCell().CellFormat.Width = microUnit;
            builder.Write("學\n \n年");
            builder.EndRow();
            builder.RowFormat.Height = rowHeight;
            foreach (string cata in absenceRewardInfos.Keys)
            {
                int index = 1;
                int count = absenceRewardInfos[cata].Count;
                foreach (string var in absenceRewardInfos[cata].Keys)
                {
                    builder.InsertCell().CellFormat.Width = microUnit * 2.0;
                    if (index == 1)
                    {
                        builder.Write(cata);
                        builder.CellFormat.VerticalMerge = CellMerge.First;
                    }
                    else
                    {
                        builder.CellFormat.VerticalMerge = CellMerge.Previous;
                    }
                    builder.InsertCell().CellFormat.Width = microUnit * 2.0;
                    builder.Write(var);
                    builder.CellFormat.VerticalMerge = CellMerge.None;
                    int first = absenceRewardInfos[cata][var][0];
                    int second = absenceRewardInfos[cata][var][1];
                    int both = first + second;
                    builder.InsertCell().CellFormat.Width = microUnit;
                    if (first > 0)
                    {
                        builder.Write(first + "");
                    }
                    builder.InsertCell().CellFormat.Width = microUnit;
                    if (second > 0)
                    {
                        builder.Write(second + "");
                    }
                    builder.InsertCell().CellFormat.Width = microUnit;
                    if (both > 0)
                    {
                        builder.Write(both + "");
                    }
                    builder.EndRow();
                    index++;
                }
            }
            foreach (Cell frontCell in table.FirstRow.Cells)
            {
                frontCell.CellFormat.Borders.Top.LineStyle = LineStyle.None;
            }
            foreach (Cell frontCell in table.LastRow.Cells)
            {
                frontCell.CellFormat.Borders.Bottom.LineStyle = LineStyle.None;
            }
            foreach (Row row in table.Rows)
            {
                row.FirstCell.CellFormat.Borders.Left.LineStyle = LineStyle.None;
                row.LastCell.CellFormat.Borders.Right.LineStyle = LineStyle.None;
            }
            absenceRewardInfos.Clear();
        }
        if (e.FieldName == "科目分項成績")
        {
            StudentScore studentScore = (StudentScore)e.FieldValue;
            builder = new DocumentBuilder(e.Document);
            builder.MoveToField(e.Field, true);
            e.Field.Remove();
            cell      = builder.CurrentParagraph.ParentNode as Cell;
            width     = cell.CellFormat.Width;
            height    = (cell.ParentNode as Row).RowFormat.Height + cell.ParentRow.ParentTable.Rows[1].RowFormat.Height;
            totalRow  = 0;
            totalRow += studentScore.Subjects.Count;
            totalRow += studentScore.Entries.Count;
            if (studentScore.Subjects.Count <= 0)
            {
                return;
            }
            microUnit = width / 17.0;
            rowHeight = (height - 64.0) / ((double)totalRow);
            table     = builder.StartTable();
            builder.CellFormat.ClearFormatting();
            builder.CellFormat.Borders.LineWidth    = 0.25;
            builder.CellFormat.FitText              = true;
            builder.RowFormat.HeightRule            = HeightRule.Exactly;
            builder.RowFormat.Alignment             = RowAlignment.Center;
            builder.CellFormat.VerticalAlignment    = CellVerticalAlignment.Center;
            builder.CellFormat.LeftPadding          = 3.0;
            builder.CellFormat.RightPadding         = 3.0;
            builder.ParagraphFormat.Alignment       = ParagraphAlignment.Center;
            builder.ParagraphFormat.LineSpacingRule = LineSpacingRule.AtLeast;
            builder.RowFormat.Height = 12.0;
            builder.InsertCell().CellFormat.Width = microUnit * 17.0;
            builder.Write("學  業  成  績");
            builder.EndRow();
            builder.RowFormat.Height = 12.0;
            builder.InsertCell().CellFormat.Width = microUnit * 7.0;
            builder.CellFormat.VerticalMerge = CellMerge.First;
            builder.Write("科        目");
            builder.InsertCell().CellFormat.Width = microUnit * 4.0;
            builder.CellFormat.VerticalMerge = CellMerge.None;
            builder.Write("第 一 學 期");
            builder.InsertCell().CellFormat.Width = microUnit * 4.0;
            builder.Write("第 二 學 期");
            builder.InsertCell().CellFormat.Width = microUnit * 2.0;
            builder.Write("學 年");
            builder.EndRow();
            builder.RowFormat.Height = 40.0;
            builder.InsertCell().CellFormat.Width = microUnit * 7.0;
            builder.CellFormat.VerticalMerge = CellMerge.Previous;
            builder.InsertCell().CellFormat.Width = microUnit * 1.0;
            builder.CellFormat.VerticalMerge = CellMerge.None;
            builder.Write("必\n選\n修");
            builder.InsertCell().CellFormat.Width = microUnit * 1.0;
            builder.Write("學\n \n分");
            builder.InsertCell().CellFormat.Width = microUnit * 2.0;
            builder.Write("成\n \n績");
            builder.InsertCell().CellFormat.Width = microUnit * 1.0;
            builder.Write("必\n選\n修");
            builder.InsertCell().CellFormat.Width = microUnit * 1.0;
            builder.Write("學\n \n分");
            builder.InsertCell().CellFormat.Width = microUnit * 2.0;
            builder.Write("成\n \n績");
            builder.InsertCell().CellFormat.Width = microUnit * 2.0;
            builder.Write("成\n \n績");
            builder.EndRow();
            builder.RowFormat.Height = rowHeight;
            List <ScoreData> subjectList = new List <ScoreData>(studentScore.Subjects.Values);
            subjectList.Sort(new Common.SubjectComparer());
            foreach (ScoreData data in subjectList)
            {
                builder.InsertCell().CellFormat.Width = microUnit * 7.0;
                builder.ParagraphFormat.Alignment = ParagraphAlignment.Left;
                builder.Write(data.Name + " " + data.Level);
                builder.InsertCell().CellFormat.Width = microUnit;
                builder.ParagraphFormat.Alignment = ParagraphAlignment.Center;
                builder.Write(data.FirstRequire);
                builder.InsertCell().CellFormat.Width = microUnit;
                if (data.FirstCredit > 0)
                {
                    builder.Write(data.FirstCredit + "");
                }
                builder.InsertCell().CellFormat.Width = microUnit * 2.0;
                if (data.FirstScore > 0M)
                {
                    builder.Write(data.FirstSign + data.FirstScore + "");
                }
                builder.InsertCell().CellFormat.Width = microUnit;
                builder.Write(data.SecondRequire);
                builder.InsertCell().CellFormat.Width = microUnit;
                if (data.SecondCredit > 0)
                {
                    builder.Write(data.SecondCredit + "");
                }
                builder.InsertCell().CellFormat.Width = microUnit * 2.0;
                if (data.SecondScore > 0M)
                {
                    builder.Write(data.SecondSign + data.SecondScore + "");
                }
                builder.InsertCell().CellFormat.Width = microUnit * 2.0;
                if (data.SchoolYearScore > 0M)
                {
                    builder.Write(data.YearScoreSign + data.SchoolYearScore + "");
                }
                builder.EndRow();
            }
            List <ScoreData> entryList = new List <ScoreData>(studentScore.Entries.Values);
            entryList.Sort(new Common.EntryCompaper());
            foreach (ScoreData data in entryList)
            {
                builder.InsertCell().CellFormat.Width = microUnit * 7.0;
                builder.ParagraphFormat.Alignment = ParagraphAlignment.Left;
                builder.Write(data.Name);
                if (data.Name == "德行")
                {
                    builder.InsertCell().CellFormat.Width = microUnit * 4.0;
                    builder.ParagraphFormat.Alignment = ParagraphAlignment.Center;
                    if (data.FirstScore > 0M)
                    {
                        builder.Write(data.FirstScore + "");
                        builder.Write(Common.ParseLevel(data.FirstScore));
                    }
                    builder.InsertCell().CellFormat.Width = microUnit * 4.0;
                    if (data.SecondScore > 0M)
                    {
                        builder.Write(data.SecondScore + "");
                        builder.Write(Common.ParseLevel(data.SecondScore));
                    }
                    builder.InsertCell().CellFormat.Width = microUnit * 2.0;
                    if (data.SchoolYearScore > 0M)
                    {
                        builder.Write(data.SchoolYearScore + "");
                        builder.Write(Common.ParseLevel(data.SchoolYearScore));
                    }
                }
                else if (((data.Name == "學業成績名次") || (data.Name == "實得學分")) || (data.Name == "累計學分"))
                {
                    builder.InsertCell().CellFormat.Width = microUnit * 4.0;
                    builder.ParagraphFormat.Alignment = ParagraphAlignment.Center;
                    builder.Write(data.FirstSemesterItem);
                    builder.InsertCell().CellFormat.Width = microUnit * 4.0;
                    builder.Write(data.SecondSemesterItem);
                    builder.InsertCell().CellFormat.Width = microUnit * 2.0;
                    builder.Write(data.SchoolYearItem);
                }
                else
                {
                    builder.InsertCell().CellFormat.Width = microUnit * 4.0;
                    builder.ParagraphFormat.Alignment = ParagraphAlignment.Center;
                    if (data.FirstScore > 0M)
                    {
                        builder.Write(data.FirstScore + "");
                    }
                    builder.InsertCell().CellFormat.Width = microUnit * 4.0;
                    if (data.SecondScore > 0M)
                    {
                        builder.Write(data.SecondScore + "");
                    }
                    builder.InsertCell().CellFormat.Width = microUnit * 2.0;
                    if (data.SchoolYearScore > 0M)
                    {
                        builder.Write(data.SchoolYearScore + "");
                    }
                }
                builder.EndRow();
            }
            foreach (Cell frontCell in table.FirstRow.Cells)
            {
                frontCell.CellFormat.Borders.Top.LineStyle = LineStyle.None;
            }
            foreach (Cell frontCell in table.LastRow.Cells)
            {
                frontCell.CellFormat.Borders.Bottom.LineStyle = LineStyle.None;
            }
            foreach (Row row in table.Rows)
            {
                row.FirstCell.CellFormat.Borders.Left.LineStyle = LineStyle.None;
                row.LastCell.CellFormat.Borders.Right.LineStyle = LineStyle.None;
            }
            studentScore.Clear();
        }
        if (e.FieldName == "綜合表現")
        {
            if (e.FieldValue == null)
            {
                e.Field.Remove();
            }
            else
            {
                Dictionary <int, XmlElement> objectValue = (Dictionary <int, XmlElement>)e.FieldValue;
                if (objectValue != null)
                {
                    builder = new DocumentBuilder(e.Document);
                    builder.MoveToField(e.Field, false);
                    width = (builder.CurrentParagraph.ParentNode as Cell).CellFormat.Width;
                    builder.StartTable();
                    Cell temp = builder.InsertCell();
                    temp.CellFormat.Borders.LineWidth  = 0.25;
                    temp.CellFormat.LeftPadding        = 5.0;
                    temp.CellFormat.Width              = 120.0;
                    temp.ParentRow.RowFormat.Alignment = RowAlignment.Left;
                    temp.CellFormat.VerticalAlignment  = CellVerticalAlignment.Center;
                    builder.Write("項目");
                    temp = builder.InsertCell();
                    temp.CellFormat.LeftPadding        = 5.0;
                    temp.CellFormat.Width              = (width - 120.0) / 2.0;
                    temp.ParentRow.RowFormat.Alignment = RowAlignment.Center;
                    temp.CellFormat.VerticalAlignment  = CellVerticalAlignment.Center;
                    builder.Write("第一學期");
                    temp = builder.InsertCell();
                    temp.CellFormat.LeftPadding        = 5.0;
                    temp.CellFormat.Width              = (width - 120.0) / 2.0;
                    temp.ParentRow.RowFormat.Alignment = RowAlignment.Center;
                    temp.CellFormat.VerticalAlignment  = CellVerticalAlignment.Center;
                    builder.Write("第二學期");
                    builder.EndRow();
                    Dictionary <string, Dictionary <int, string> > detail = new Dictionary <string, Dictionary <int, string> >();
                    foreach (int semester in objectValue.Keys)
                    {
                        XmlElement xml = objectValue[semester];
                        if (xml != null)
                        {
                            foreach (XmlElement each in xml.SelectNodes("TextScore/Morality"))
                            {
                                string face = each.GetAttribute("Face");
                                if ((SmartSchool.Customization.Data.SystemInformation.Fields["文字評量對照表"] as XmlElement).SelectSingleNode("Content/Morality[@Face='" + face + "']") != null)
                                {
                                    string comment = each.InnerText;
                                    if (!detail.ContainsKey(face))
                                    {
                                        detail.Add(face, new Dictionary <int, string>());
                                    }
                                    if (!detail[face].ContainsKey(semester))
                                    {
                                        detail[face].Add(semester, comment);
                                    }
                                }
                            }
                        }
                    }
                    foreach (string face in detail.Keys)
                    {
                        temp = builder.InsertCell();
                        temp.CellFormat.LeftPadding        = 5.0;
                        temp.CellFormat.Width              = 120.0;
                        temp.ParentRow.RowFormat.Alignment = RowAlignment.Left;
                        temp.CellFormat.VerticalAlignment  = CellVerticalAlignment.Center;
                        builder.Write(face);
                        temp = builder.InsertCell();
                        temp.CellFormat.LeftPadding        = 5.0;
                        temp.CellFormat.Width              = (width - 120.0) / 2.0;
                        temp.ParentRow.RowFormat.Alignment = RowAlignment.Center;
                        temp.CellFormat.VerticalAlignment  = CellVerticalAlignment.Center;
                        if (detail[face].ContainsKey(1))
                        {
                            builder.Write(detail[face][1]);
                        }
                        temp = builder.InsertCell();
                        temp.CellFormat.LeftPadding        = 5.0;
                        temp.CellFormat.Width              = (width - 120.0) / 2.0;
                        temp.ParentRow.RowFormat.Alignment = RowAlignment.Center;
                        temp.CellFormat.VerticalAlignment  = CellVerticalAlignment.Center;
                        if (detail[face].ContainsKey(2))
                        {
                            builder.Write(detail[face][2]);
                        }
                        builder.EndRow();
                    }
                    table = builder.EndTable();
                    if (table.Rows.Count > 0)
                    {
                        foreach (Cell each in table.FirstRow.Cells)
                        {
                            each.CellFormat.Borders.Top.LineStyle = LineStyle.None;
                        }
                        foreach (Cell each in table.LastRow.Cells)
                        {
                            each.CellFormat.Borders.Bottom.LineStyle = LineStyle.None;
                        }
                        foreach (Row each in table.Rows)
                        {
                            each.FirstCell.CellFormat.Borders.Left.LineStyle = LineStyle.None;
                            each.LastCell.CellFormat.Borders.Right.LineStyle = LineStyle.None;
                        }
                    }
                    e.Field.Remove();
                }
            }
        }
    }
Beispiel #13
0
 void MailMerge_MergeField(object sender, MergeFieldEventArgs args)
 {
     //Next row
     if (args.RowIndex > lastIndex)
     {
         lastIndex = args.RowIndex;
         AddPageBreakForMergeField(args.CurrentMergeField);
     }
 }
        //最好這程式有人能維護的了.......
        private void MailMerge_MergeField(object sender, MergeFieldEventArgs e)
        {
            //不是 Fix 開頭的合併欄位不處理。
            if (!e.FieldName.ToUpper().StartsWith("Fix".ToUpper())) return;

            DocumentBuilder builder = new DocumentBuilder(e.Document);

            ReportStudent student = e.FieldValue as ReportStudent;

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

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

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

                int count = 0, offset = 1;

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

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

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

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

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

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

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

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

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

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

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

                        SemesterScore semsscore = student.SemestersScore[sysems];

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

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

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

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

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

                            SemesterDomainScore domain = semsscore.Domain[strDomain];

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                                if (!score.HasValue) continue;

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

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

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

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

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

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

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

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

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

                                if (!avgScore.HasValue) continue;

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

                                if (!avgScore.HasValue) continue;

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

                            //if (!avgScore.HasValue) continue;

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

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

                            //}
                        }
                    }

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

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

                    }

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

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

                            if (raw == SemesterData.Empty) continue;

                            string placeKey = SLearningDomainParser.GetSemesterString(raw);

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

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

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

                                        bool clear = true;

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

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

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

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

                                }

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

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

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

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

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

                            if (raw == SemesterData.Empty) continue;

                            string placeKey = SLearningDomainParser.GetSemesterString(raw);

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

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

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

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

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

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

                                    bool clear = true;

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

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

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

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

                                }

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

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

                                }
                            }

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

                        }

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

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

                    }

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

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

                            if (raw == SemesterData.Empty) continue;

                            string placeKey = SLearningDomainParser.GetSemesterString(raw);

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

                            bool UseRatingRank = true;

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

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

                                    bool clear = true;

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

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

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

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

                                }

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

                            if (UseRatingRank)
                            {

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

                                int Level = 1, Percentage = 1;

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

                        }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                        SemesterScore semsscore = student.SemestersScore[sysems];

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

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

                            header.IsDomain = false;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                                if (!score.HasValue) continue;

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

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

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

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

                                if (!avgScore.HasValue) continue;

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

                                if (!avgScore.HasValue) continue;

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

                            if (!avgScore.HasValue) continue;

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

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

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

                            if (raw == SemesterData.Empty) continue;

                            string placeKey = SLearningDomainParser.GetSemesterString(raw);

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

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

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

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

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

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

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

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

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

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

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

                    int ColumnIndex = student.HeaderList[each];

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

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

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

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

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

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

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

                    DisciplineNormal.Cells[Offset + ColumnIndex].Write(builder, normalString.ToString());
                    DisciplineSet.Cells[Offset + ColumnIndex].Write(builder, setString.ToString());
                }
                #endregion
            }
        }
        private void MailMerge_MergeField(object sender, MergeFieldEventArgs e)
        {
            if (e.FieldName == "照片")
            {
                byte[] photo = e.FieldValue as byte[];
                if (photo == null)
                {
                    return;
                }
                DocumentBuilder photoBuilder = new DocumentBuilder(e.Document);
                photoBuilder.MoveToField(e.Field, true);
                e.Field.Remove();

                Shape photoShape = new Shape(e.Document, ShapeType.Image);
                photoShape.ImageData.SetImage(photo);
                photoShape.WrapType = WrapType.Inline;//設定文繞圖

                //resize
                double origSizeRatio = photoShape.ImageData.ImageSize.HeightPoints / photoShape.ImageData.ImageSize.WidthPoints;
                Cell   curCell       = photoBuilder.CurrentParagraph.ParentNode as Cell;
                double shapeHeight   = (curCell.ParentNode as Row).RowFormat.Height * 4;
                double shapeWidth    = curCell.CellFormat.Width;

                if ((shapeHeight / shapeWidth) < origSizeRatio)
                {
                    shapeWidth = shapeHeight / origSizeRatio;
                }
                else
                {
                    shapeHeight = shapeWidth * origSizeRatio;
                }

                photoShape.Height = shapeHeight;
                photoShape.Width  = shapeWidth;

                photoBuilder.InsertNode(photoShape);
            }

            if (e.FieldName == "條碼")
            {
                DocumentBuilder builder = new DocumentBuilder(e.Document);
                builder.MoveToField(e.Field, true); //將游標移到條碼所在欄位
                e.Field.Remove();                   //將原先的合併欄位刪除

                BarCodeBuilder bb = new BarCodeBuilder();
                if (e.FieldValue.ToString() != "")
                {
                    bb.CodeText = e.FieldValue.ToString();


                    bb.SymbologyType = Symbology.Code128;
                }
                else
                {
                    bb.CodeLocation = CodeLocation.None;//不輸出學號
                }

                bb.xDimension = 0.5f;
                bb.BarHeight  = 4.0f;


                MemoryStream stream = new MemoryStream();
                bb.Save(stream, ImageFormat.Jpeg); //將產生出的條碼存成圖檔

                builder.InsertImage(stream);       //
            }
        }