/// <summary> /// 处理循环 /// </summary> /// <param name="element"></param> /// <returns></returns> private bool SetLoop(WordElement element) { DataRow[] dataRows = dataSource.Tables[element.TableIndex].Select(element.GroupByString); int count = dataRows.Count(); element.Range.Select(); //第0行作为模板 先从1开始 循环后处理0行; for (int i = 0; i < count; i++) { element.Range.Copy(); //模板loop复制 wordApp.Selection.InsertParagraphAfter(); //换行 不会清除选中的内容,TypeParagraph 等同于回车,若当前有选中内容会被清除. TypeParagraph 会跳到下一行,InsertParagraphAfter不会, 所以movedown一下. wordApp.Selection.MoveDown(ref line, Missing.Value, Missing.Value); wordApp.Selection.Paste(); //换行后粘贴复制内容 int offset = wordApp.Selection.Range.End - element.Range.End; //计算偏移量 //复制书签,书签名 = 模板书签名 + 复制次数 foreach (Word.Bookmark subBook in element.Range.Bookmarks) { if (subBook.Name.Equals(element.ElementName)) { continue; } wordApp.Selection.Bookmarks.Add(subBook.Name + "_" + i.ToString(), wordDoc.Range(subBook.Start + offset, subBook.End + offset)); } SetContent(new WordElement(wordDoc.Range(wordApp.Selection.Range.End - (element.Range.End - element.Range.Start), wordApp.Selection.Range.End), element.ElementName + "_" + i.ToString(), dataRows[i], element.GroupBy)); } element.Range.Delete(); return(true); }
/// <summary> /// 处理简单Label /// </summary> /// <param name="element"></param> /// <returns></returns> private bool SetLabel(WordElement element) { if (element.Range.Bookmarks != null && element.Range.Bookmarks.Count > 0) { string startWith = "label_" + element.Level.ToString() + "_"; string bookMarkName = string.Empty; foreach (Word.Bookmark item in element.Range.Bookmarks) { bookMarkName = item.Name; if (bookMarkName.StartsWith(startWith)) { bookMarkName = WordElement.GetName(bookMarkName); item.Range.Text = element.DataRow[bookMarkName].ToString(); } } } return(true); }
/// <summary> /// 为指定区域写入数据 /// </summary> /// <param name="element"></param> /// <returns></returns> private bool SetContent(WordElement element) { string currBookMarkName = string.Empty; string startWith = "loop_" + (element.Level + 1).ToString() + "_"; foreach (Word.Bookmark item in element.Range.Bookmarks) { currBookMarkName = item.Name; if (currBookMarkName.StartsWith(startWith) && (!currBookMarkName.Equals(element.ElementName))) { SetLoop(new WordElement(item.Range, currBookMarkName, element.DataRow, element.GroupBy)); } } SetLabel(element); SetTable(element); SetChart(element); return(true); }
/// <summary> /// 处理图表 /// </summary> /// <param name="element"></param> /// <returns></returns> private bool SetChart(WordElement element) { if (element.Range.InlineShapes != null && element.Range.InlineShapes.Count > 0) { List <Word.InlineShape> chartList = element.Range.InlineShapes.Cast <Word.InlineShape>().Where(m => m.Type == Word.WdInlineShapeType.wdInlineShapeChart).ToList(); string startWith = "chart_" + element.Level.ToString() + "_"; foreach (Word.InlineShape item in chartList) { Word.Chart chart = item.Chart; if (!string.IsNullOrEmpty(chart.ChartTitle.Text) && chart.ChartTitle.Text.StartsWith(startWith)) { WordElement chartElement = new WordElement(null, chart.ChartTitle.Text, element.DataRow); DataTable dataTable = dataSource.Tables[chartElement.TableIndex]; DataRow[] dataRows = dataTable.Select(chartElement.GroupByString); int columnCount = dataTable.Columns.Count; List <int> columns = new List <int>(); foreach (var dr in dataRows) { for (int i = chartElement.ColumnStart == -1 ? 0 : chartElement.ColumnStart - 1; i < (chartElement.ColumnEnd == -1 ? columnCount : chartElement.ColumnEnd); i++) { if (columns.Contains(i) || dr[i] == null || string.IsNullOrEmpty(dr[i].ToString())) { } else { columns.Add(i); } } } columns.Sort(); columnCount = columns.Count; int rowsCount = dataRows.Length; Word.ChartData chartData = chart.ChartData; //chartData.Activate(); //此处有个比较疑惑的问题, 不执行此条,生成的报告中的图表无法再次右键编辑数据. 执行后可以, 但有两个问题就是第一会弹出Excel框, 处理完后会自动关闭. 第二部分chart的数据range设置总不对 //不知道是不是版本的问题, 谁解决了分享一下,谢谢 Excel.Workbook dataWorkbook = (Excel.Workbook)chartData.Workbook; dataWorkbook.Application.Visible = false; Excel.Worksheet dataSheet = (Excel.Worksheet)dataWorkbook.Worksheets[1]; //设定范围 string a = (chartElement.ColumnNameForHead ? rowsCount + 1 : rowsCount) + "|" + columnCount; Console.WriteLine(a); Excel.Range tRange = dataSheet.Range["A1", dataSheet.Cells[(chartElement.ColumnNameForHead ? rowsCount + 1 : rowsCount), columnCount]]; Excel.ListObject tbl1 = dataSheet.ListObjects[1]; //dataSheet.ListObjects[1].Delete(); //想过重新删除再添加 这样 原有数据清掉了, 但觉得性能应该会有所下降 //Excel.ListObject tbl1 = dataSheet.ListObjects.AddEx(); tbl1.Resize(tRange); for (int j = 0; j < rowsCount; j++) { DataRow row = dataRows[j]; for (int k = 0; k < columnCount; k++) { dataSheet.Cells[j + 2, k + 1].FormulaR1C1 = row[columns[k]]; } } if (chartElement.ColumnNameForHead) { for (int k = 0; k < columns.Count; k++) { dataSheet.Cells[1, k + 1].FormulaR1C1 = dataTable.Columns[columns[k]].ColumnName; } } chart.ChartTitle.Text = chartElement.Name; //dataSheet.Application.Quit(); } } } return(true); }
/// <summary> /// 填充Table /// </summary> /// <param name="element"></param> /// <returns></returns> private bool SetTable(WordElement element) { if (element.Range.Tables != null && element.Range.Tables.Count > 0) { string startWith = "table_" + element.Level.ToString() + "_"; foreach (Word.Table table in element.Range.Tables) { if (!string.IsNullOrEmpty(table.Title) && table.Title.StartsWith(startWith)) { WordElement tableElement = new WordElement(null, table.Title, element.DataRow); TableConfig config = new TableConfig(table.Descr); object dataRowTemplate = table.Rows[config.DataRow]; Word.Row SummaryRow = null; DataRow SummaryDataRow = null; DataTable dt = dataSource.Tables[tableElement.TableIndex]; DataRow[] dataRows = dataSource.Tables[tableElement.TableIndex].Select(tableElement.GroupByString);; if (config.SummaryRow > 0) { SummaryRow = table.Rows[config.SummaryRow]; SummaryDataRow = dt.Select(string.IsNullOrEmpty(tableElement.GroupByString) ? config.SummaryFilter : tableElement.GroupByString + " and " + config.SummaryFilter).FirstOrDefault(); } foreach (DataRow row in dataRows) { if (row == SummaryDataRow) { continue; } Word.Row newRow = table.Rows.Add(ref dataRowTemplate); for (int j = 0; j < table.Columns.Count; j++) { newRow.Cells[j + 1].Range.Text = row[j].ToString();; } } ((Word.Row)dataRowTemplate).Delete(); if (config.SummaryRow > 0 && SummaryDataRow != null) { for (int j = 0; j < SummaryRow.Cells.Count; j++) { string temp = SummaryRow.Cells[j + 1].Range.Text.Trim().Replace("\r\a", ""); if (!string.IsNullOrEmpty(temp) && temp.Length > 2 && dt.Columns.Contains(temp.Substring(1, temp.Length - 2))) { SummaryRow.Cells[j + 1].Range.Text = SummaryDataRow[temp.Substring(1, temp.Length - 2)].ToString(); } } } table.Title = tableElement.Name; } } } return(true); }