/// <summary> /// 检查单元格是否行合并过且横跨多个页面 /// </summary> internal static bool IsCellMultiPagesMerged(Word.Table table, Word.Cell cell) { // 判断是否合并过? var cellRowSpan = GetCellRowSpan(table, cell); if (cellRowSpan <= 1) { return(false); } var isMultiPagesMerged = false; var cellPageNum = GetCellPageNum(cell); // 拆分,为了解析方便 cell.Split(NumRows: cellRowSpan); // 查找每个基本单元格的页码 for (var curRowIndex = cell.RowIndex + 1; curRowIndex < cell.RowIndex + cellRowSpan; curRowIndex++) { var curCell = table.Cell(curRowIndex, cell.ColumnIndex); var curCellPageNum = GetCellPageNum(curCell); if (curCellPageNum > cellPageNum) // 找到某个基本单元格在另外一页 { isMultiPagesMerged = true; } // 重新合并 cell.Merge(curCell); } return(isMultiPagesMerged); }
/// <summary> /// 分离单元格 /// </summary> public static void SeparateCell() { object oMissing = System.Reflection.Missing.Value; Microsoft.Office.Interop.Word._Application WordApp; Microsoft.Office.Interop.Word._Document WordDoc; WordApp = new Microsoft.Office.Interop.Word.Application(); WordApp.Visible = true; WordDoc = WordApp.Documents.Add(ref oMissing, ref oMissing, ref oMissing, ref oMissing); object start = 0; object end = 0; Microsoft.Office.Interop.Word.Range tableLocation = WordDoc.Range(ref start, ref end); WordDoc.Tables.Add(tableLocation, 3, 4, ref oMissing, ref oMissing); Microsoft.Office.Interop.Word.Table newTable = WordDoc.Tables[1]; object beforeRow = newTable.Rows[1]; newTable.Rows.Add(ref beforeRow); Microsoft.Office.Interop.Word.Cell cell = newTable.Cell(1, 1); cell.Merge(newTable.Cell(1, 2)); object Rownum = 2; object Columnnum = 2; cell.Split(ref Rownum, ref Columnnum); }
public static bool CreateWordDocParagraph(string qname, string[][] qdata, IVsThreadedWaitDialog2 dlg) { //InitializeVariables(); System.Net.WebClient webclient = new System.Net.WebClient(); webclient.Credentials = System.Net.CredentialCache.DefaultCredentials; var application = new MSWord.Application(); var document = new MSWord.Document(); object missing = System.Reflection.Missing.Value; int pagewidth = 800; bool bcanceled; int progress = 1; StringBuilder strbld = new StringBuilder(); MSWord.WdBuiltinStyle[] hstyles = new MSWord.WdBuiltinStyle[8]; hstyles[0] = MSWord.WdBuiltinStyle.wdStyleHeading1; hstyles[1] = MSWord.WdBuiltinStyle.wdStyleHeading2; hstyles[2] = MSWord.WdBuiltinStyle.wdStyleHeading3; hstyles[3] = MSWord.WdBuiltinStyle.wdStyleHeading4; hstyles[4] = MSWord.WdBuiltinStyle.wdStyleHeading5; hstyles[5] = MSWord.WdBuiltinStyle.wdStyleHeading6; hstyles[6] = MSWord.WdBuiltinStyle.wdStyleHeading7; hstyles[7] = MSWord.WdBuiltinStyle.wdStyleHeading8; application.Visible = true; application.WindowState = MSWord.WdWindowState.wdWindowStateMinimize; application.DisplayAlerts = MSWord.WdAlertLevel.wdAlertsNone; document = application.Documents.Add(); //document.PageSetup.Orientation = MSWord.WdOrientation.wdOrientLandscape; document.PageSetup.LeftMargin = 20; document.PageSetup.RightMargin = 20; document.PageSetup.TopMargin = 20; document.PageSetup.BottomMargin = 20; document.PageSetup.PageWidth = pagewidth + 40; MSWord.Paragraph prg = document.Paragraphs.Add(); prg.Range.Text = "Query results for " + qname + " [" + DateTime.Now + "]"; prg.Range.set_Style(MSWord.WdBuiltinStyle.wdStyleTitle); //prg.Range.ParagraphFormat.Alignment = MSWord.WdParagraphAlignment.wdAlignParagraphCenter; prg.SpaceAfter = 100; prg.SpaceBefore = 100; prg.Range.InsertParagraphAfter(); prg = document.Paragraphs.Add(); prg.Range.Text = "Table of Contents"; prg.Range.set_Style(MSWord.WdBuiltinStyle.wdStyleTocHeading); prg.Range.InsertParagraphAfter(); prg = document.Paragraphs.Add(); prg.Range.Text = "TOC"; prg.Range.InsertParagraphAfter(); prg.Range.InsertBreak(MSWord.WdBreakType.wdPageBreak); prg = document.Paragraphs.Add(); MSWord.Table qtable = document.Tables.Add(prg.Range, qdata.Length, 1); prg.Range.InsertParagraphAfter(); prg = document.Paragraphs.Add(); prg.Range.Text = "Appendix"; prg.Range.set_Style(MSWord.WdBuiltinStyle.wdStyleTitle); prg.Range.InsertParagraphAfter(); object styleTypeTable = MSWord.WdStyleType.wdStyleTypeTable; MSWord.Style styl = document.Styles.Add("New Table Style", ref styleTypeTable); styl.ParagraphFormat.LineSpacingRule = MSWord.WdLineSpacing.wdLineSpaceSingle; styl.ParagraphFormat.SpaceAfter = 0; styl.ParagraphFormat.SpaceBefore = 0; styl.Table.TopPadding = 0; styl.Table.BottomPadding = 0; styl.Table.LeftPadding = 0; styl.Table.RightPadding = 0; //styl.Table.Borders.Enable = 1; qtable.Range.set_Style(styl); MSWord.Cell cell = qtable.Cell(1, 1); int headerwidth = 85; int levelwidth = 100; object rows, cols; for (int i = 0; i < qdata.Length; i++) { int level = int.Parse(qdata[i][1]); if (level > 0) { rows = 1; cols = 2; cell.Split(ref rows, ref cols); cell.Range.Cells.SetWidth(level * levelwidth, MSWord.WdRulerStyle.wdAdjustSameWidth); cell = cell.Next; } rows = 1 + (string.IsNullOrWhiteSpace(qdata[i][0]) ? 0 : 1) + (string.IsNullOrWhiteSpace(qdata[i][6]) ? 0 : 1); cols = 2; cell.Split(ref rows, ref cols); cell.Merge(cell.Next); string title = String.Format("{0} {1} ({2})", qdata[i][2], (qdata[i][5].Length > 128 ? qdata[i][5].Remove(128) : qdata[i][5]).Replace("\n", "").Replace("\r", "").Replace("\t", ""), qdata[i][4]); cell.Range.Text = title; cell.Range.Font.Bold = 1; cell.Range.set_Style(hstyles[level < 8 ? level:7]); cell = cell.Next; dlg.UpdateProgress("Exporting Work Item query to Microsoft Word document", "Adding to Word document " + qdata[i][3] + " #" + qdata[i][4], "status", progress++, 100, false, out bcanceled); if (progress == 100) { progress = 0; } if (bcanceled) { application.Visible = true; Marshal.ReleaseComObject(document); Marshal.ReleaseComObject(application); return(true); } /*cell.Range.Text = "Title"; * cell.Range.Cells.SetWidth(headerwidth, MSWord.WdRulerStyle.wdAdjustSameWidth); * cell.Range.Font.Bold = 1; * cell = cell.Next; * * cell.Range.Text = qdata[i][4]; * cell = cell.Next;*/ /*cell.Range.Text = "Description"; * cell.Range.Cells.SetWidth(headerwidth, MSWord.WdRulerStyle.wdAdjustSameWidth); * cell.Range.Font.Bold = 1; * cell = cell.Next;*/ if (!string.IsNullOrWhiteSpace(qdata[i][6])) { cell.Merge(cell.Next); cell.Range.Text = qdata[i][6]; cell = cell.Next; } if (!string.IsNullOrWhiteSpace(qdata[i][0])) { cell.Range.Text = "Attachments"; cell.Range.Cells.SetWidth(headerwidth, MSWord.WdRulerStyle.wdAdjustSameWidth); cell.Range.Font.Bold = 1; cell = cell.Next; var query = qdata[i][0] .Split(';') .Where(x => !string.IsNullOrWhiteSpace(x)) .Select(x => { string[] ch = x.Split('~'); return(new { name = ch[0], value = ch[1] }); }).ToArray(); cell.Split(query.Length, 1); foreach (var kvp in query) { string localpath = Path.GetTempFileName() + "." + kvp.name; //try { File.Delete(localpath); } //catch { } try { webclient.DownloadFile(kvp.value, localpath); } catch (Exception ex) { localpath = ""; Utilities.OutputCommandString(ex.ToString()); } prg = document.Paragraphs.Add(); prg.Range.Text = kvp.name; prg.Range.set_Style(MSWord.WdBuiltinStyle.wdStyleHeading3); cell.Range.Text = kvp.name; document.Hyperlinks.Add(cell.Range, missing, prg.Range); prg.Range.InsertParagraphAfter(); document.InlineShapes.AddHorizontalLineStandard(prg.Range); prg = document.Paragraphs.Add(); if (!string.IsNullOrEmpty(localpath)) { try { Image img = Image.FromFile(localpath); img.Dispose(); document.InlineShapes.AddPicture(localpath, false, true, prg.Range); } catch { if (Path.GetExtension(kvp.name).Equals(".sql", StringComparison.InvariantCultureIgnoreCase) || Path.GetExtension(kvp.name).Equals(".txt", StringComparison.InvariantCultureIgnoreCase)) { prg.Range.InsertFile(localpath);//, prg.Range, false, true, false); } else { MSWord.InlineShape shape = document.InlineShapes.AddOLEObject(missing, localpath, false, false, missing, missing, missing, prg.Range); if (shape.OLEFormat.ClassType.ToString() != "Package") { shape.Width = document.PageSetup.PageWidth - 40; } } } } cell = cell.Next; } if (query.Length == 0) { cell = cell.Next; } } } object styleTypePara = MSWord.WdStyleType.wdStyleTypeParagraph; MSWord.Style styl2 = document.Styles.Add("New Paragraph Style", ref styleTypePara); //styl2.ParagraphFormat.set_Style(MSWord.WdBuiltinStyle.wdStyleNormal); styl2.ParagraphFormat.LeftIndent = 100; styl2.ParagraphFormat.RightIndent = 100; styl2.ParagraphFormat.LineSpacingRule = MSWord.WdLineSpacing.wdLineSpaceSingle; styl2.ParagraphFormat.SpaceAfter = 0; styl2.ParagraphFormat.SpaceBefore = 0; MSWord.Paragraph tocpara = document.Paragraphs[3]; MSWord.TableOfContents tblct = document.TablesOfContents.Add(tocpara.Range, missing, 1, 1); tblct.Update(); //tblct.Range.set_Style(styl2); //application.Visible = true; Marshal.ReleaseComObject(document); Marshal.ReleaseComObject(application); return(false); }