比較全的一個C#操作word文檔示例


這篇文章主要介紹了比較全的一個C#操作word文檔示例,本文來自己項目心得總結,本文還給出了一個示例,這個示例里面包括了一些常用的圖、文、表、公式的編輯與排版以及頁面設置、頁眉、頁碼的操作,需要的朋友可以參考下

最近兩天研究了一下如何使用VS2008(C#語言)輸出Word文檔。以下是幾點總結:

1、非常簡單。

2、開發及運行環境要求。操作系統為:WindowsXP(安裝.net framework2.0)/Vista/Win7;在操作系統必須安裝Word2003完全安裝版。這里必須要強調是Word2003完全安裝版,因為軟件開發及運行都需要一個com組件:Microsoft word 11.0 Object Library。如果不是Word2003完全安裝版,可以下載這個com組件,並手動的安裝這個com組件。下載地址為:http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=20923,文件不大,只有4M左右。

3、C#工程設置。這里的工程設置,就是添加com組件。步驟為:在工程資源管理器中"添加引用"->"com"選項卡->在下拉列表中選Microsoft word 11.0 Object Library。ok了,看上去,跟添加一般的dll一樣,但實際上vs2008在這個過程中完成一系列復雜的關於.net調用com組件的操作,不過,幸好我們不用管這個。

4、接下就是寫代碼了。在這里,使用Word的com對像,跟使用一般的非com對像一樣,非常流暢,好像根本就不管它什么com不com的。為了使代碼比較簡潔,可以在源代碼文件頂添加這樣的一條語句:using Word = Microsoft.Office.Interop.Word;

5、最好是對word對像模型有一定的了解,這樣在寫代碼的時候就不會那么“迷茫”了。wore對像模型中有幾個比較重要的對像,它們是Application、Document、Selection、Range、Bookmark,以及其它的一些對像,如:Paragraph、Section、Table等級。剛開始學的時候,感覺Selection、Range、Bookmark這幾個對像有點迷惑人,Selection可能好理解,就是表示當前的選擇區域,如果沒有選擇就表示光標所在位置。Range和Bookmark,其實在很多地方很像,不過也有一些區別,在這里就不多說了,google一下"word.Range"就行了。

6、在寫代碼的過程中,經常會想要實現的一些操作,但是由於對word對像不熟悉而不知怎么用代碼實現。比如設置頁眉、添加頁碼什么的,如果在Word程序里手動的操作當然很簡單,但是要用代碼來實現,對初學者來說就可能不那么容易了。遇到這種情況,一般有兩種方法可以選擇:一種是"百度/google法",別一種,也是我所推薦的一種就是,利用Word的“錄制宏”功能把想要實現的操作錄成宏之后,再看宏里的代碼,宏里的代碼其實幾乎就是你想要的代碼了(只不過語法有一點不一樣而已)。

7、以下給出一個示例,這個示例里面包括了一些常用的圖、文、表、公式的編輯與排版以及頁面設置、頁眉、頁碼的操作,里面都有注釋,寫得很清楚。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using Microsoft.Office.Interop;
using Word = Microsoft.Office.Interop.Word;
using System.Runtime.InteropServices; 

namespace WindowsFormsApplication1
{
  public partial class Form1 :System.Windows.Forms. Form
  {

    [DllImport("shell32.dll ")]
    public static extern int ShellExecute(IntPtr hwnd, String lpszOp, String lpszFile, String lpszParams, String lpszDir, int FsShowCmd); 
    public Form1()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      //新建文檔
      // Word.Application newapp = new Word.Application();//用這句也能初始化
      Word.Application newapp = new Word.ApplicationClass();
      Word.Document newdoc;
      object nothing=System.Reflection.Missing.Value;//用於作為函數的默認參數
      newdoc = newapp.Documents.Add(ref nothing, ref nothing, ref nothing, ref nothing);//生成一個word文檔
      newapp.Visible = true ;//是否顯示word程序界面

      //頁面設置
      //newdoc.PageSetup.Orientation = Word.WdOrientation.wdOrientLandscape ;
      //newdoc.PageSetup.PageWidth = newapp.CentimetersToPoints(21.0f);
      //newdoc.PageSetup.PageHeight = newapp.CentimetersToPoints(29.7f);
      newdoc.PageSetup.PaperSize = Word.WdPaperSize.wdPaperA4;
      newdoc.PageSetup.Orientation = Word.WdOrientation.wdOrientPortrait;
      newdoc.PageSetup.TopMargin = 57.0f;
      newdoc.PageSetup.BottomMargin = 57.0f;
      newdoc.PageSetup.LeftMargin = 57.0f;
      newdoc.PageSetup.RightMargin = 57.0f;
      newdoc.PageSetup.HeaderDistance = 30.0f;//頁眉位置

      //設置頁眉
      newapp.ActiveWindow.View.Type = Word.WdViewType.wdOutlineView;//視圖樣式。
      newapp.ActiveWindow.View.SeekView = Word.WdSeekView.wdSeekPrimaryHeader;//進入頁眉設置,其中頁眉邊距在頁面設置中已完成
      newapp.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;
      //插入頁眉圖片
      string headerfile = "d:\\header.jpg";
      this.outpicture(headerfile, Properties.Resources.header);
      Word.InlineShape shape1= newapp.ActiveWindow.ActivePane.Selection.InlineShapes.AddPicture(headerfile, ref nothing, ref nothing, ref nothing);
      shape1.Height = 30;
      shape1.Width = 80;
      newapp.ActiveWindow.ActivePane.Selection.InsertAfter("中建東北院");
      //去掉頁眉的那條橫線
      newapp.ActiveWindow.ActivePane.Selection.ParagraphFormat.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderBottom].LineStyle = Word.WdLineStyle.wdLineStyleNone;
      newapp.ActiveWindow.ActivePane.Selection.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderBottom].Visible = false;
      newapp.ActiveWindow.ActivePane.View.SeekView = Word.WdSeekView.wdSeekMainDocument;//退出頁眉設置

      //添加頁碼
      Word.PageNumbers pns= newapp.Selection.Sections[1].Headers[Microsoft.Office.Interop.Word.WdHeaderFooterIndex.wdHeaderFooterEvenPages].PageNumbers;
      pns.NumberStyle = Word.WdPageNumberStyle.wdPageNumberStyleNumberInDash;
      pns.HeadingLevelForChapter = 0;
      pns.IncludeChapterNumber = false;
      pns.ChapterPageSeparator = Word.WdSeparatorType.wdSeparatorHyphen;
      pns.RestartNumberingAtSection = false;
      pns.StartingNumber = 0;
      object pagenmbetal=Word.WdPageNumberAlignment.wdAlignPageNumberCenter;
      object first=true; 
      newapp.Selection.Sections[1].Footers[Microsoft.Office.Interop.Word.WdHeaderFooterIndex.wdHeaderFooterEvenPages ].PageNumbers.Add(ref pagenmbetal, ref first);

      //文字設置(Selection表示當前選擇集,如果當前沒有選擇對像,則指對光標所在處進行設置)
      newapp.Selection.Font.Size = 14;
      newapp.Selection.Font.Bold = 0;
      newapp.Selection.Font.Color = Word.WdColor.wdColorBlack;
      newapp.Selection.Font.Name = "宋體";

      //段落設置
      newapp.Selection.ParagraphFormat.LineSpacingRule = Word.WdLineSpacing.wdLineSpaceExactly;
      newapp.Selection.ParagraphFormat.LineSpacing = 20;
      newapp.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft;
      newapp.Selection.ParagraphFormat.FirstLineIndent = 30;
      newdoc.Content.InsertAfter( WindowsFormsApplication1.Properties.Resources.PreViewWords);
      
      

      //插入公式
      object oEndOfDoc="\\endofdoc";
      Word.Range rang1 = newdoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
      object fieldType = Word.WdFieldType.wdFieldEmpty;
      object formula = @"eq \i(a,b,ξxdx)";
      object presrveFormatting = false;
      rang1.Text = formula.ToString();
      rang1.Font.Size = 14;
      rang1.Font.Bold = 0;
      rang1.Font.Subscript = 0;
      rang1.Font.Color = Word.WdColor.wdColorBlue;
      rang1.Font.Name = "宋體";
      rang1.ParagraphFormat.LineSpacingRule = Word.WdLineSpacing.wdLineSpaceSingle;
      rang1.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;
      newdoc.Fields.Add(rang1, ref fieldType, ref formula, ref presrveFormatting);

      //將文檔的前三個字替換成"asdfasdf",並將其顏色設為藍色
      object start=0;
      object end=3;
      Word.Range rang2 = newdoc.Range(ref start, ref end);
      rang2.Font.Color = Word.WdColor.wdColorBlue;
      rang2.Text = "as簽";

      //將文檔開頭的"as"替換成"袁波"
      rang1.Start = 0;
      rang1.End = 2;
      rang1.Text = "這是一個";
      rang1.InsertAfter("書");
      //rang1.Select();
      object codirection = Word.WdCollapseDirection.wdCollapseStart;
      rang1.Collapse(ref codirection);//將rang1的起點和終點都定於起點或終點

      //對前三個字符進行加粗
      newdoc.Range(ref start, ref end).Bold = 1;
      object rang = rang2;
      newdoc.Bookmarks.Add("yb",ref rang);
      
      
      object unite = Word.WdUnits.wdStory;
      newapp.Selection.EndKey(ref unite, ref nothing);//將光標移至文末
      newapp.Selection.Font.Size = 10;
      newapp.Selection.TypeText("...............................(式1)\n");


      //插入圖片
      newapp.Selection.EndKey(ref unite, ref nothing);//將光標移至文末
      //newapp.Selection.HomeKey(ref unite, ref nothing);//將光標移至文開頭
      newapp.Selection.ParagraphFormat.LineSpacingRule = Word.WdLineSpacing.wdLineSpaceSingle;
      newapp.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;
      object LinkToFile = false;
      object SaveWithDocument = true;
      object Anchor = newapp.Selection.Range;
      string picname = "d:\\kk.jpg";
      this.outpicture(picname, Properties.Resources.IMG_2169);
      newdoc.InlineShapes.AddPicture(picname, ref LinkToFile, ref SaveWithDocument, ref Anchor);
      newdoc.InlineShapes[1].Height = 200;
      newdoc.InlineShapes[1].Width = 200;
      newdoc.Content.InsertAfter("\n");
      newapp.Selection.EndKey(ref unite, ref nothing);//將光標移至文末
      newapp.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;
      newapp.Selection.Font.Size = 10;
      newapp.Selection.TypeText("圖1 袁冶\n");
      newapp.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;
      newdoc.Content.InsertAfter("\n"); 
      newdoc.Content.InsertAfter("\n");

      //用這種方式也可以插入公式,並且這種方法更簡單
      newapp.Selection.Font.Size = 14;
      newapp.Selection.InsertFormula(ref formula, ref nothing);
      newapp.Selection.Font.Size = 10;
      newapp.Selection.TypeText("..............................(式2)\n");
      newapp.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;
      newapp.Selection.TypeText("表1 電子產品\n");

      //插入表格
      Word.Table table1 = newdoc.Tables.Add(newapp.Selection.Range, 4, 3, ref nothing, ref nothing);
      newdoc.Tables[1].Cell(1, 1).Range.Text = "產品\n項目";
      newdoc.Tables[1].Cell(1, 2).Range.Text = "電腦";
      newdoc.Tables[1].Cell(1, 3).Range.Text = "手機";
      newdoc.Tables[1].Cell(2, 1).Range.Text = "重量(kg)";
      newdoc.Tables[1].Cell(3, 1).Range.Text = "價格(元)";
      newdoc.Tables[1].Cell(4, 1).Range.Text = "共同信息";
      newdoc.Tables[1].Cell(4, 2).Range.Text = "信息A";
      newdoc.Tables[1].Cell(4,3).Range.Text = "信息B";
      

      table1.Select();
      table1.Rows.Alignment = Word.WdRowAlignment.wdAlignRowCenter;//整個表格居中
      newapp.Selection.Cells.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;
      newapp.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;
      newapp.Selection.Cells.HeightRule = Word.WdRowHeightRule.wdRowHeightExactly;
      newapp.Selection.Cells.Height = 40;
      table1.Rows[2].Height = 20;
      table1.Rows[3].Height = 20;
      table1.Rows[4].Height = 20;
      table1.Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;
      newapp.Selection.Cells.Width=150;
      table1.Columns[1].Width = 75;
      table1.Cell(1, 1).Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;
      table1.Cell(1, 1).Range.Paragraphs[2].Format.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft;

      
      

      //表頭斜線
      table1.Cell(1, 1).Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderDiagonalDown ].Visible = true;
      table1.Cell(1, 1).Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderDiagonalDown].Color = Word.WdColor.wdColorGreen;
      table1.Cell(1, 1).Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderDiagonalDown].LineWidth = Word.WdLineWidth.wdLineWidth050pt;

      //表格邊框
      table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderHorizontal ].Visible = true;
      table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderHorizontal].Color = Word.WdColor.wdColorGreen;
      table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderHorizontal].LineWidth = Word.WdLineWidth.wdLineWidth050pt;

      table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderVertical].Visible = true;
      table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderVertical].Color = Word.WdColor.wdColorGreen;
      table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderVertical].LineWidth = Word.WdLineWidth.wdLineWidth050pt;

      table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderLeft].Visible = true;
      table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderLeft].Color = Word.WdColor.wdColorGreen;
      table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderLeft].LineWidth = Word.WdLineWidth.wdLineWidth050pt;
      table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderLeft].LineStyle = Word.WdLineStyle.wdLineStyleDoubleWavy;

      table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderRight].Visible = true;
      table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderRight].Color = Word.WdColor.wdColorGreen;
      table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderRight].LineWidth = Word.WdLineWidth.wdLineWidth050pt;
      table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderRight].LineStyle = Word.WdLineStyle.wdLineStyleDoubleWavy;

      table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderBottom ].Visible = true;
      table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderBottom].Color = Word.WdColor.wdColorGreen;
      table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderBottom].LineWidth = Word.WdLineWidth.wdLineWidth050pt;
      table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderBottom].LineStyle = Word.WdLineStyle.wdLineStyleDouble;

      table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderTop ].Visible = true;
      table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderTop].Color = Word.WdColor.wdColorGreen;
      table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderTop].LineWidth = Word.WdLineWidth.wdLineWidth050pt;
      table1.Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderTop].LineStyle = Word.WdLineStyle.wdLineStyleDouble;

      //合並單元格
      newdoc.Tables[1].Cell(4, 2).Merge(table1.Cell(4, 3));

      //刪除圖片
      this.delpictfile(headerfile);
      this.delpictfile(picname);


      //保存文檔
      object name = "c:\\yb3.doc";
      newdoc.SaveAs(ref name, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing,
             ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing,
             ref nothing, ref nothing);
      
      //關閉文檔
      object saveOption = Word.WdSaveOptions.wdDoNotSaveChanges;
      newdoc.Close(ref nothing , ref nothing, ref nothing);
      newapp.Application.Quit(ref saveOption, ref nothing, ref nothing);
      newdoc = null;
      newapp = null;
      ShellExecute(IntPtr.Zero, "open", "c:\\yb3.doc", "", "", 3);
    }

    private void outpicture(string filename,System.Drawing.Bitmap bmap)
    {
      bmap.Save(filename);
    }

    private void delpictfile(string filename)
    {
      System.IO.File.Delete(filename);
    }
   
  }

}
引用於https://m.jb51.net/article/67314.htm


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM