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); } }
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); } }
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; } } }
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; } } }
//最好這程式有人能維護的了....... 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(); } } } }
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); // } }