某项目需要自动生成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,问题解决。