C#访问word应用软件需要先安装word,word会向系统注册COM组件,COM组件提供了外部应用程序的一个访问接口,通过这些接口,可以很方便地程序性地操作word软件中的各种COM对象的属性和方法。比如文字,图片,形状,段落,光标位置,字体,表格,边框,背景,公式,格式,书签,页面属性,页眉页脚,选择范围,查找/替换,剪贴板操作,响应事件等等,基本上能够在前台操作的功能,都能在类库中找到对应的接口。
Word软件COM接口定义了一套不变的标准,外部程序可以对这些标准的接口进行二次封装,从而构建更加稳定便捷的文档操作特性。
Microsoft.Office.Interop.Word.Document 继承自_Document接口
Word应用程序也是一个COM对象,类型为Microsoft.Office.Interop.Word.Application,
对于其中每一个方法如何使用可以访问微软官方文档MSDN
新建一个Word应用程序实例
Microsoft.Office.Interop.Word.Application application = new Microsoft.Office.Interop.Word.Application();
如果应用程序已经被创建,也可以直接获取已经创建的Word实例
application = (Application)Marshal.GetActiveObject("Word.Application");
新建一个Word文档实例,有两种方式:将已经存在的Word文件作为一个副本打开,相当于创建了一个Word文档对象,内容模板从另外一个文件中获取并重新构建
application.Documents.Add("路径")
另一种方式为打开文件的时候将文件锁住,不让其他应用程序修改文件内容,直到Document实例被关闭,保存或取消保存,才会更新文件,释放文件锁定。
application.Documents.Open(path)
application.WindowSelectionChange += Application_WindowSelectionChange;
application.DocumentBeforeClose += Application_DocumentBeforeClose;
需要注意的是事件委托的方法必须使用多线程执行,防止外部应用程序阻塞了Word主线程
private static void Application_WindowSelectionChange(Selection Sel)
{
App.Current.Dispatcher.Invoke((Action)(() =>
{
RocResultProcess.RocKeepon();
RocResultProcess.HoldOn();
RocResultProcess.AppendTitle($"Word选中事件回调");
RocResultProcess.AppendLine($"选中的文本:{Sel.Text}" +
$"\r\n字体:{Sel.Font.Name}" +
$"\r\n字体颜色:{Sel.Font.Color.ToString()}" +
$"\r\n字体大小:{Sel.Font.Size}" +
$"\r\n字体加粗:{Sel.Font.Bold}" +
$"\r\n选中部分所在文档的起始位置:{Sel.Start}" +
$"\r\n选中部分所在文档的结束位置:{Sel.End}" +
""
);
if (!string.IsNullOrWhiteSpace(Sel.Range.Text))
{
if (Sel.Range.Text=="/")
{
Sel.Copy();
}
else
{
Sel.Range.Copy();
}
Code.Library.Text.ShowRichTextInRoc();
}
RocResultProcess.HoldOff();
RocResultProcess.RocKeepoff();
}));
}
成品展示
读取多个word文件的内容,进行加工处理,得到一个综合的数据模型,这个数据模型表示了Word内容的结构化信息,然后将数据模型格式化的输出到成RTF字节流,批量的写入一个新的word文件。