C#操作Word2010实现

来源:互联网 发布:南昌室内设计软件班 编辑:程序博客网 时间:2024/05/21 14:58

概述

某项目需要自动生成Word文档,查找了许多资料,发现还是C#实现起来比较容易,也比较灵活。

环境:
Office 2010
Visual Studio 2010
Win10

网上找了很多教程,首先需要设置引用。
1.右击“解决方案资源管理器”中的项目目录下的“引用”,选择“添加引用”,打开“添加引用”对话框
2.在“添加引用”对话框中,选择“COM”>“Microsoft Word 15.0 Object Library”,点击“确定”按钮(这个版本号和本机安装的Word版本有关,2010是15.0)
3.相同操作打开“添加引用”对话框中,选择“浏览”项,查找到”Microsoft.Office.Interop.Word.dll”文件,选中它,点击“确定”按钮。

整个类的代码如下:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using Microsoft.Office.Interop.Word;namespace DocCreator{    class CreateDoc    {        private Microsoft.Office.Interop.Word.Application wordApp = null;        private Document wordDoc = null;        public Application Application        {            get            {                return wordApp;            }            set            {                wordApp = value;            }        }        public Document Document        {            get            {                return wordDoc;            }            set            {                wordDoc= value;            }        }        //通过模板创建新文档        public void CreateNewDocument(string filePath)        {            killWinWordProcess();            wordApp = new Microsoft.Office.Interop.Word.ApplicationClass();            wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;            wordApp.Visible =false;            object missing = System.Reflection.Missing.Value;            object templateName = filePath;            wordDoc = wordApp.Documents.Open(ref templateName,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 SaveDocument(string filePath)        {            object fileName = filePath;            object format = WdSaveFormat.wdFormatDocument;  //保存格式            object miss = System.Reflection.Missing.Value;            wordDoc.SaveAs2(ref fileName,ref format,ref miss, ref miss,ref miss,ref miss,ref miss,                ref miss,ref miss,ref miss,ref miss,ref miss,ref miss,ref miss,ref miss,ref miss,ref miss);            object SaveChanges = WdSaveOptions.wdSaveChanges;            object OriginalFormat = WdOriginalFormat.wdOriginalDocumentFormat;            object RouteDocument =false;            wordDoc.Close(ref SaveChanges, ref OriginalFormat, ref RouteDocument);            wordApp.Quit(ref SaveChanges,ref OriginalFormat,ref RouteDocument);        }        //在书签处插入值        public bool InsertValue(string bookmark,string value)        {            object bkObj =bookmark;            if(wordApp.ActiveDocument.Bookmarks.Exists(bookmark))            {                wordApp.ActiveDocument.Bookmarks[bkObj].Select();                wordApp.Selection.TypeText(value);                return true;            }            return false;        }        //插入表格,bookmark书签        public Table InsertTable(string bookmark, int rows, int columns,float width)        {            object miss =System.Reflection.Missing.Value;            object toStart =bookmark;            Range range =wordDoc.Bookmarks[toStart].Range;//表格插入位置            Table newTable =wordDoc.Tables.Add(range,rows, columns, ref miss, ref miss);            //设置表的格式            newTable.Borders.Enable =1; //允许有边框,默认没有边框(为0时报错,1为实线边框,2、3为虚线边框,以后的数字没试过)            newTable.Borders.OutsideLineWidth=WdLineWidth.wdLineWidth050pt;//边框宽度            if(width != 0)            {                newTable.PreferredWidth=width;//表格宽度            }            newTable.AllowPageBreaks =false;            return newTable;        }        //合并单元格 表名,开始行号,开始列号,结束行号,结束列号        public void MergeCell(Microsoft.Office.Interop.Word.Table table, int row1, int column1,int row2, int column2)        {            table.Cell(row1,column1).Merge(table.Cell(row2,column2));        }        //设置表格内容对齐方式Align水平方向,Vertical垂直方向(左对齐,居中对齐,右对齐分别对应Align和Vertical的值为-1,0,1)        public void SetParagraph_Table(Microsoft.Office.Interop.Word.Table table, int Align, int Vertical)        {            switch(Align)            {            case -1:table.Range.ParagraphFormat.Alignment=WdParagraphAlignment.wdAlignParagraphLeft;break;//左对齐            case 0: table.Range.ParagraphFormat.Alignment=WdParagraphAlignment.wdAlignParagraphCenter;break;//水平居中            case 1: table.Range.ParagraphFormat.Alignment=WdParagraphAlignment.wdAlignParagraphRight;break;//右对齐            }            switch(Vertical)            {                case -1: table.Range.Cells.VerticalAlignment=WdCellVerticalAlignment.wdCellAlignVerticalTop;break;//顶端对齐                case 0: table.Range.Cells.VerticalAlignment=WdCellVerticalAlignment.wdCellAlignVerticalCenter;break;//垂直居中                case 1: table.Range.Cells.VerticalAlignment=WdCellVerticalAlignment.wdCellAlignVerticalBottom;break;//底端对齐            }        }        //设置表格字体        public void SetFont_Table(Microsoft.Office.Interop.Word.Table table, string fontName, double size)        {            if(size != 0)            {                table.Range.Font.Size =Convert.ToSingle(size);            }            if(fontName !="")            {                table.Range.Font.Name =fontName;            }        }        //是否使用边框,n表格的序号,use是或否        public void UseBorder(int n,bool use)        {            if(use)            {                wordDoc.Content.Tables[n].Borders.Enable =1; //允许有边框,默认没有边框(为0时无边框,1为实线边框,2、3为虚线边框,以后的数字没试过)            }            else            {                wordDoc.Content.Tables[n].Borders.Enable =2; //允许有边框,默认没有边框(为0时无边框,1为实线边框,2、3为虚线边框,以后的数字没试过)            }        }        //给表格插入一行,n表格的序号从1开始记        public void AddRow(int n)        {            object miss =System.Reflection.Missing.Value;            wordDoc.Content.Tables[n].Rows.Add(ref miss);        }        //给表格添加一行        public void AddRow(Microsoft.Office.Interop.Word.Table table)        {            object miss =System.Reflection.Missing.Value;            table.Rows.Add(ref miss);        }        //给表格插入rows行,n为表格的序号        public void AddRow(int n, int rows)        {            object miss =System.Reflection.Missing.Value;            Microsoft.Office.Interop.Word.Table table = wordDoc.Content.Tables[n];            for(int i = 0; i < rows; i++)            {                table.Rows.Add(ref miss);            }        }        //给表格中单元格插入元素,table所在表格,row行号,column列号,value插入的元素        public void InsertCell(Microsoft.Office.Interop.Word.Table table, int row, int column,string value)        {            table.Cell(row,column).Range.Text =value;        }        //给表格中单元格插入元素,n表格的序号从1开始记,row行号,column列号,value插入的元素        public void InsertCell(int n, int row,int column, string value)        {            wordDoc.Content.Tables[n].Cell(row,column).Range.Text =value;        }        //给表格插入一行数据,n为表格的序号,row行号,columns列数,values插入的值        public void InsertCell(int n, int row,int columns, string[] values)        {            Microsoft.Office.Interop.Word.Table table = wordDoc.Content.Tables[n];            for(int i = 0; i < columns; i++)            {                table.Cell(row,i + 1).Range.Text =values[i];            }        }        //插入图片        public void InsertPicture(string bookmark, string picturePath, float width, float hight)        {            object miss = System.Reflection.Missing.Value;            object oStart =bookmark;            Object linkToFile =false;    //图片是否为外部链接            Object saveWithDocument =true; //图片是否随文档一起保存            object range =wordDoc.Bookmarks.get_Item(ref oStart).Range;//图片插入位置            wordDoc.InlineShapes.AddPicture(picturePath,ref linkToFile, ref saveWithDocument, ref range);            wordDoc.Application.ActiveDocument.InlineShapes[1].Width=width; //设置图片宽度            wordDoc.Application.ActiveDocument.InlineShapes[1].Height=hight; //设置图片高度        }        //插入一段文字,text为文字内容        public void InsertText(string bookmark, string text)        {            object oStart =bookmark;            object range =wordDoc.Bookmarks.get_Item(ref oStart).Range;            Paragraph wp =wordDoc.Content.Paragraphs.Add(ref range);            wp.Format.SpaceBefore= 6;            wp.Range.Text =text;            wp.Format.SpaceAfter =24;            wp.Range.InsertParagraphAfter();            wordDoc.Paragraphs.Last.Range.Text ="\n";        }        //杀掉winword.exe进程        public void killWinWordProcess()        {            System.Diagnostics.Process[]processes=System.Diagnostics.Process.GetProcessesByName("WINWORD");            foreach (System.Diagnostics.Process process in processes)            {                bool b = process.MainWindowTitle=="";                if (process.MainWindowTitle =="")                {                    process.Kill();                }            }        }    }}

经调试,编译器提示ApplicationClass()无法匹配接口,上网搜到解答,发现应该是Word兼容性问题。解决办法是点击解决方案中“引用”,选择Microsoft.Office.Interop.Word,选项中选择“嵌入式互操作类型”,将属性设定成FALSE,问题解决。