C#与Word文档的交互

C#访问word应用软件需要先安装word,word会向系统注册COM组件,COM组件提供了外部应用程序的一个访问接口,通过这些接口,可以很方便地程序性地操作word软件中的各种COM对象的属性和方法。比如文字,图片,形状,段落,光标位置,字体,表格,边框,背景,公式,格式,书签,页面属性,页眉页脚,选择范围,查找/替换,剪贴板操作,响应事件等等,基本上能够在前台操作的功能,都能在类库中找到对应的接口。

Word软件COM接口定义了一套不变的标准,外部程序可以对这些标准的接口进行二次封装,从而构建更加稳定便捷的文档操作特性。

我们所看到的word软件界面在系统中被视为一个COM对象,对象类型为
Microsoft.Office.Interop.Word.Document 继承自_Document接口
这个接口提供了操作Word文档的所有方法/属性/事件。
一个Word应用程序可以包含多个word文档,一个Word应用程序在一个进程中运行

 Word应用程序也是一个COM对象,类型为Microsoft.Office.Interop.Word.Application,

 对于其中每一个方法如何使用可以访问微软官方文档MSDN

Microsoft.Office.Interop.Word Namespace | Microsoft DocsExplore all classes and interfaces of the Microsoft.Office.Interop.Word namespace.https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.interop.word?view=word-pia

新建一个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)
COM接口中包含一部分事件,监听这些事件,可以与Word进行一些动态的内容交互
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文件。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值