public class WordDocHelper : IDisposable { private Microsoft.Office.Interop.Word.Application app; private Microsoft.Office.Interop.Word.Document doc; public WordDocHelper() { app = new Microsoft.Office.Interop.Word.Application(); app.DisplayAlerts = Microsoft.Office.Interop.Word.WdAlertLevel.wdAlertsNone; } public void Open(string strFileName) { object fileName = strFileName; object; object isVisible = true; object missing = System.Reflection.Missing.Value; doc = app.Documents.Open(ref fileName, ref missing, ref readOnly, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref isVisible, ref missing, ref missing, ref missing, ref missing); doc.Activate(); } public void Open() { object missing = System.Reflection.Missing.Value; doc = app.Documents.Add(ref missing, ref missing, ref missing, ref missing); //doc.Activate(); } public void Quit() { object missing = System.Reflection.Missing.Value; object saveChange = Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges; //app.Documents.Close(ref saveChange,ref missing,ref missing); if (doc != null) { doc.Close(ref saveChange, ref missing, ref missing); Marshal.ReleaseComObject(doc); } if (app != null) { app.Quit(ref saveChange, ref missing, ref missing); Marshal.ReleaseComObject(app); } } public void Save() { doc.Save(); } public void SaveAs(string strFileName) { object missing = System.Reflection.Missing.Value; object fileName = strFileName; doc.SaveAs(ref fileName, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); //Quit(); } public void Delete(string fileName) { File.Delete(fileName); } // Save the document in HTML format public void SaveAsHtml(string strFileName) { object missing = System.Reflection.Missing.Value; object fileName = strFileName; object Format = (int)Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatHTML; doc.SaveAs(ref fileName, ref Format, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); } public void SaveAsPdf(string strFileName) { object missing = System.Reflection.Missing.Value; object fileName = strFileName; object Format = (int)Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatPDF; doc.SaveAs(ref fileName, ref Format, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); } public void SaveWithFormat(string fileName, ReportOutType outputTtype) { object format = (int)Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatDocument; switch (outputTtype) { case ReportOutType.doc: format = (int)Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatDocument; break; case ReportOutType.pdf: //format = (int)Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatPDF; break; case ReportOutType.xps: //format = (int)Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatXPS; break; case ReportOutType.html: //format = (int)Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatXPS; break; default: format = (int)Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatDocument; break; } object missing = System.Reflection.Missing.Value; object name = fileName; doc.SaveAs(ref name, ref format, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); } public void InsertText(string strText) { app.Selection.TypeText(strText); } public void InsertLineBreak() { app.Selection.TypeParagraph(); } public void InsertLineBreak(int nline) { for (int i = 0; i < nline; i++) app.Selection.TypeParagraph(); } // Change the paragraph alignement public void SetAlignment(string strType) { switch (strType) { case "Center": app.Selection.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter; break; case "Left": app.Selection.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphLeft; break; case "Right": app.Selection.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphRight; break; case "Justify": app.Selection.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphJustify; break; } } // if you use thif function to change the font you should call it again with // no parameter in order to set the font without a particular format public void SetFont(string strType) { switch (strType) { case "Bold": app.Selection.Font.Bold = 1; break; case "Italic": app.Selection.Font.Italic = 1; break; case "Underlined": app.Selection.Font.Subscript = 0; break; } } // disable all the style public void SetFont() { app.Selection.Font.Bold = 0; app.Selection.Font.Italic = 0; app.Selection.Font.Subscript = 0; } public void SetFontName(string strType) { app.Selection.Font.Name = strType; } public void SetFontSize(int nSize) { app.Selection.Font.Size = nSize; } public void InsertPagebreak() { // VB : Selection.InsertBreak Type:=wdPageBreak object pBreak = (int)Microsoft.Office.Interop.Word.WdBreakType.wdPageBreak; app.Selection.InsertBreak(ref pBreak); } // Go to a predefined bookmark, if the bookmark doesn't exists the application will raise an error public void GotoBookMark(string strBookMarkName) { // VB : Selection.GoTo What:=wdGoToBookmark, Name:="nome" object missing = System.Reflection.Missing.Value; object Bookmark = (int)Microsoft.Office.Interop.Word.WdGoToItem.wdGoToBookmark; object NameBookMark = strBookMarkName; app.Selection.GoTo(ref Bookmark, ref missing, ref missing, ref NameBookMark); } public void InsertTable(DataTable table, string mark, string[] headerCaption, string[] colNames , string expression, string filter, string summaryText) { object objMark = mark; Microsoft.Office.Interop.Word.Bookmark bookMark = doc.Bookmarks.get_Item(ref objMark); object tableBehavior = Microsoft.Office.Interop.Word.WdDefaultTableBehavior.wdWord9TableBehavior; object autoFitBehavior = Microsoft.Office.Interop.Word.WdAutoFitBehavior.wdAutoFitContent; if (table != null) { GotoBookMark(mark); Microsoft.Office.Interop.Word.Table t = doc.Tables.Add(bookMark.Range, table.Rows.Count + 1, colNames.Length, ref tableBehavior, ref autoFitBehavior); //add table header for (int colIndex = 1; colIndex <= headerCaption.Length; colIndex++) { t.Cell(1, colIndex).Range.Select(); t.Cell(1, colIndex).Range.Font.Size = 10; t.Cell(1, colIndex).Range.Text = headerCaption[colIndex - 1]; t.Cell(1, colIndex).Range.Bold = 1; } t.Rows[1].Shading.BackgroundPatternColor = Microsoft.Office.Interop.Word.WdColor.wdColorBlueGray; //t.Shading.BackgroundPatternColor = Microsoft.Office.Interop.Word.WdColor.wdColorBlueGray; //add table content if (table.Rows.Count >=1) { for (int rowIndex = 2; rowIndex < table.Rows.Count + 2; rowIndex++) { for (int colIndex = 1; colIndex < colNames.Length + 1; colIndex++) { app.Selection.Font.Bold = 0; t.Cell(rowIndex, colIndex).Range.Select(); SetAlignment("Right"); t.Cell(rowIndex, colIndex).Range.Font.Size = 10; t.Cell(rowIndex, colIndex).Range.Text = Convert.ToString(table.Rows[rowIndex - 2][colNames[colIndex - 1]]); t.Cell(rowIndex, colIndex).Range.Bold = 0; } } } //add summary row if (!string.IsNullOrEmpty(expression) && !string.IsNullOrEmpty(filter) && !string.IsNullOrEmpty(summaryText)) { addWdTableSummaryRow(t, table, expression, filter, "总计"); } } } public void InsertNestedTable(DataTable mainTable, DataTable secondaryTable, string keyCol, string mark, string[] mainCaption, string[] mainCols, string[] secondaryCaption, string[] secondaryCols , string expression, string filter, string summaryText) { object missing = System.Reflection.Missing.Value; object objMark = mark; Microsoft.Office.Interop.Word.Bookmark bookMark = doc.Bookmarks.get_Item(ref objMark); object tableBehavior = Microsoft.Office.Interop.Word.WdDefaultTableBehavior.wdWord9TableBehavior; object autoFitBehavior = Microsoft.Office.Interop.Word.WdAutoFitBehavior.wdAutoFitContent; if (mainTable != null) { GotoBookMark(mark); int mainRowCount = mainTable.Rows.Count; Microsoft.Office.Interop.Word.Table t = doc.Tables.Add(bookMark.Range, 1, mainCaption.Length, ref tableBehavior, ref autoFitBehavior); //set caption addWdTableCaptionRow(t, mainCaption, 10); foreach (DataRow mainRow in mainTable.Rows) { string keyVal = Convert.ToString(mainRow[keyCol]); Microsoft.Office.Interop.Word.Row r = addWdTableDataRow(t, mainRow, mainCols, 10);//t.Rows.Add(ref missing); if (secondaryTable != null) { DataRow[] secondaryRows = secondaryTable.Select(string.Format("{0}='{1}'", keyCol, keyVal)); if (secondaryRows.Length > 0) { Microsoft.Office.Interop.Word.Row adtionalRow = t.Rows.Add(ref missing); Microsoft.Office.Interop.Word.Cell lastLeft = adtionalRow.Cells[1]; Microsoft.Office.Interop.Word.Cell lastRight = adtionalRow.Cells[t.Columns.Count]; lastLeft.Range.Select(); lastLeft.Range.Font.Size = 10f; //lastLeft.Range.Text = "Test nested table"; lastRight.Merge(lastLeft); object tmpBehavior = Microsoft.Office.Interop.Word.WdDefaultTableBehavior.wdWord9TableBehavior; object tmpFitBehavior = Microsoft.Office.Interop.Word.WdAutoFitBehavior.wdAutoFitContent; Microsoft.Office.Interop.Word.Table nestedTable = lastLeft.Tables.Add(lastLeft.Range, 1, 2, ref tmpBehavior, ref tmpFitBehavior); //set nested table caption addWdTableCaptionRow(nestedTable, secondaryCaption, 10); for (int i = 0; i < secondaryRows.Length; i++) { addWdTableDataRow(nestedTable, secondaryRows[i], secondaryCols, 10); } } } } //add summary row addWdTableSummaryRow(t, secondaryTable, expression, filter, summaryText); } } private void addWdTableCaptionRow(Microsoft.Office.Interop.Word.Table table, string[] captions, float fontSize) { object missing = System.Reflection.Missing.Value; if (table.Rows.Count == 0) { table.Rows.Add(ref missing); } for (int index = 0; index < table.Columns.Count; index++) { table.Rows[1].Cells[index + 1].Range.Bold = 1; table.Rows[1].Cells[index + 1].Range.Font.Size = fontSize; table.Rows[1].Cells[index + 1].Range.Text = captions[index]; table.Rows[1].Cells[index + 1].Range.Select(); if (captions[index].Contains("金额") || captions[index].Contains("数量")) { SetAlignment("Right"); } else { SetAlignment("Center"); } } } private Microsoft.Office.Interop.Word.Row addWdTableDataRow(Microsoft.Office.Interop.Word.Table table, DataRow dr, string[] cols, float fontSize) { Microsoft.Office.Interop.Word.Row r = null; object missing = System.Reflection.Missing.Value; if (table != null) { r = table.Rows.Add(ref missing); if (r.Cells.Count != cols.Length) { object splitRs = 1; object splitCs = cols.Length; r.Cells[1].Split(ref splitRs, ref splitCs); int cnt = r.Cells.Count; r.Cells[cnt].Select(); SetAlignment("Right"); } for (int index = 0; index < table.Columns.Count; index++) { if (cols[index].ToLower().Contains("price") || cols[index].ToLower().Contains("money")) { table.Rows[1].Cells[index + 1].Range.Select(); SetAlignment("Right"); } r.Cells[index + 1].Range.Bold = 0; r.Cells[index + 1].Range.Font.Size = fontSize; r.Cells[index + 1].Range.Text = Convert.ToString(dr[cols[index]]); } } return r; } private void addWdTableSummaryRow(Microsoft.Office.Interop.Word.Table table, DataTable data, string expression, string filter, string summaryText) { string sumVal = Convert.ToString(data.Compute(expression, filter)); Microsoft.Office.Interop.Word.Row r = null; object missing = System.Reflection.Missing.Value; if (table != null && data != null) { r = table.Rows.Add(ref missing); r.Shading.BackgroundPatternColor = Microsoft.Office.Interop.Word.WdColor.wdColorBlueGray; //merge as two total cols int totalCols = r.Cells.Count;//table.Columns.Count; if (totalCols > 1) { r.Cells[totalCols - 1].Merge(r.Cells[1]); } else { object rcnt=1; object ccnt=table.Columns.Count; r.Cells[1].Split(ref rcnt, ref ccnt); r.Cells[table.Columns.Count - 1].Merge(r.Cells[1]); } //set text r.Cells[1].Range.Select(); SetAlignment("Left"); r.Cells[1].Range.Font.Bold = 1; r.Cells[1].Range.Font.Italic = 1; InsertText(summaryText); totalCols = r.Cells.Count; r.Cells[totalCols].Range.Select(); SetAlignment("Right"); InsertText(sumVal); } } private void addWdTableSummaryRow(Microsoft.Office.Interop.Word.Table table, string summaryText, string summaryValue) { string sumVal = summaryValue; Microsoft.Office.Interop.Word.Row r = null; object missing = System.Reflection.Missing.Value; if (table != null) { r = table.Rows.Add(ref missing); r.Shading.BackgroundPatternColor = Microsoft.Office.Interop.Word.WdColor.wdColorBlueGray; //merge as two total cols int totalCols = table.Columns.Count; r.Cells[totalCols - 1].Merge(r.Cells[1]); //set text r.Cells[1].Range.Select(); SetAlignment("Left"); r.Cells[1].Range.Font.Bold = 1; r.Cells[1].Range.Font.Italic = 1; InsertText(summaryText); } } public void AddTableContent(DataTable data, int tableId, string[] cols, string expression, string filter) { object missing = System.Reflection.Missing.Value; Microsoft.Office.Interop.Word.Table table = doc.Tables[tableId]; string sumStr = string.Empty; if (data != null) { for (int rowIndex = 0; rowIndex < data.Rows.Count; rowIndex++) { DataRow dr = data.Rows[rowIndex]; //add new row at the end of table table.Rows.Add(ref missing); for (int colIndex = 0; colIndex < table.Columns.Count; colIndex++) { table.Cell(rowIndex + 2, colIndex + 1).Range.Text = Convert.ToString(dr[cols[colIndex]]); table.Cell(rowIndex + 2, colIndex + 1).Range.Font.Bold = 0; } } sumStr = Convert.ToString(data.Compute(expression, filter)); } //add summary row table.Rows.Add(ref missing); int totalColCount = table.Columns.Count; table.Cell(table.Rows.Count, table.Columns.Count).Range.Text = sumStr; Microsoft.Office.Interop.Word.Cell cell1 = table.Rows[table.Rows.Count].Cells[1]; Microsoft.Office.Interop.Word.Cell cell2 = table.Rows[table.Rows.Count].Cells[totalColCount - 1]; cell2.Merge(cell1); cell1.Range.Text = "总计"; cell1.Range.Select(); app.Selection.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphLeft; } public void GoToTheEnd() { // VB : Selection.EndKey Unit:=wdStory object missing = System.Reflection.Missing.Value; object unit; unit = Microsoft.Office.Interop.Word.WdUnits.wdStory; app.Selection.EndKey(ref unit, ref missing); } public void GoToTheBeginning() { // VB : Selection.HomeKey Unit:=wdStory object missing = System.Reflection.Missing.Value; object unit; unit = Microsoft.Office.Interop.Word.WdUnits.wdStory; app.Selection.HomeKey(ref unit, ref missing); } public void GoToTheTable(int ntable) { object missing = System.Reflection.Missing.Value; object what; what = Microsoft.Office.Interop.Word.WdUnits.wdTable; object which; which = Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst; object count; count = 1; app.Selection.GoTo(ref what, ref which, ref count, ref missing); app.Selection.Find.ClearFormatting(); app.Selection.Text = ""; } public void GoToRightCell() { // Selection.MoveRight Unit:=wdCell object missing = System.Reflection.Missing.Value; object direction; direction = Microsoft.Office.Interop.Word.WdUnits.wdCell; app.Selection.MoveRight(ref direction, ref missing, ref missing); } public void GoToLeftCell() { // Selection.MoveRight Unit:=wdCell object missing = System.Reflection.Missing.Value; object direction; direction = Microsoft.Office.Interop.Word.WdUnits.wdCell; app.Selection.MoveLeft(ref direction, ref missing, ref missing); } public void GoToDownCell() { // Selection.MoveRight Unit:=wdCell object missing = System.Reflection.Missing.Value; object direction; direction = Microsoft.Office.Interop.Word.WdUnits.wdLine; app.Selection.MoveDown(ref direction, ref missing, ref missing); } public void GoToUpCell() { // Selection.MoveRight Unit:=wdCell object missing = System.Reflection.Missing.Value; object direction; direction = Microsoft.Office.Interop.Word.WdUnits.wdLine; app.Selection.MoveUp(ref direction, ref missing, ref missing); } #region IDisposable 成员 public void Dispose() { object missing = System.Reflection.Missing.Value; if (doc != null) doc.Close(ref missing, ref missing, ref missing); if (app != null) { app.Quit(ref missing, ref missing, ref missing); } // throw new NotImplementedException(); } #endregion }