C#操作Word模拟解析HTML标记输出带格式的文本

 更新时间:2026年01月31日 10:06:15   作者:初九之潜龙勿用  
这篇文章介绍了一种解决Word文档格式设置问题的方案,通过HTML标记化文本内容,利用正则表达式提取关键字,并对Word字符集对象逐字操作来重置格式,感兴趣的小伙伴可以了解下

需求与困惑

应需求通过算法输出纯文本内容到 MS Word 对应的替换字段中,原有的设计仅能保持模板设定的格式,如下是一个WORD表格,下方单元格中输出题目内容,固定格式为宋体:

但客户的需求是希望题目为黑体加粗,考察关键点为正常宋体,颜色置灰,如下图:

初期的设想是通过 Word.Find 对象配合扩展的格式参数,进行查找结果关键字进行替换及格式重置操作,发现无法定位精准或有效的 Range ,尤其是 Word.Shape.TextFrame.TextRange ,参考、搜索了一些资料,问题仍无法解决。

解决方案

目前主要针对如下两个 Range 对象进行操作:

序号对象说明
1Word.Appication.Selection.Range页面选择区域范围对象(如查找到的段落高亮文字显示结果)
2Word.Shape.TextFrame.TextRange形状对象,对象内包含文字,且查找到的文字结果范围Range

基本的实现的思路如下:

一、将原始输出文本按照指定的定义进行 HTML 标记化,如将 “这是一段文本” 文本更改为  “<span style='font-family:黑体;font-weight:bold'>这是一段文本</span>” (html 部分使用标准的 span + style ),这样可以同时兼容标准的网页版输出。

二、对 Range 的文本(Text)使用正则表达式提取 HTML 标记间的所有查找关键字。

三、对 Range 的字符集对象(Word.Characters)进行逐字操作,提取 HTML 标记的 style 属性部分,分隔各种 style 进行解析,重刷每一个字符的格式。

四、处理完格式设置,调用 Range.Find 对象替换掉 “多余” 的 HTML 标记文本,完成最终输出效果。

范例运行环境

操作系统: Windows Server 2019 DataCenter

操作系统上安装 Office Word 2016

数据库:Microsoft SQL Server 2016

.net版本: .netFramework4.7.1 或以上

开发工具:VS2019  C#

配置Office DCOM

配置方法可参照我的文章《C# 读取Word表格到DataSet》进行处理和配置。

设计实现

组件库引入

方法实现

processWordChars 方法基本说明如下表:

序号参数名称参数类型说明
1charsWord.CharactersWord.Range的字符集对象

方法示例代码如下:

void processWordChars(Word.Characters chars)
{

  string content = chars.Parent.Text;
  if (content == null || content == "") { return; }
  Word.Find fnd = chars.Parent.Find;

  ArrayList paras2 = new ArrayList();
  paras2.Add(new string[] { "<span style=", "</span>" });
  foreach (string[] p in paras2)
  {
      string pattern = string.Format(@"{0}(.*?){1}", p[0], p[1]);
      System.Text.RegularExpressions.MatchCollection matches = System.Text.RegularExpressions.Regex.Matches(content, pattern);
      foreach (System.Text.RegularExpressions.Match match in matches)
      {
         string key = match.Groups[1].Value;  //提取的内容
         string vkey = key.Substring(key.IndexOf('>') + 1); //最终有效内容
                    
         string vstyle = key.Substring(1, key.Length - vkey.Length - 3); //截取 style 值
         string findkey = p[0] + key + "</span>";  //最终替换部分
         int fk = content.IndexOf(findkey);
         if (fk != -1)
         {
             for (int i = 1; i <= findkey.Length; i++)
             {
                 foreach (string kv in vstyle.Split(';'))
                 {
                     string[] style = kv.Split(':');
                     if (style[0] == "color")
                     {
                         chars[fk + i].Font.Color =(Word.WdColor)ColorTranslator.ToOle(ColorTranslator.FromHtml(style[1]));
                                        // 获取ARGB值
                     }
                     else if(style[0]== "font-weight")
                     {
                         if (style[1] == "bold") {
                             chars[fk + i].Font.Bold=1;
                         }
                     }
                     else if (style[0] == "font-family")
                     {
                         chars[fk + i].Font.Name=style[1];
                     }
                 }
              }
          fnd.ClearFormatting();
          Object findText = findkey;
          Object matchCase = false; Object matchWholeWord = Type.Missing; Object matchWildcards = false; Object matchSoundsLike = false; Object matchAllWordForms = false;
          Object forward = true; Object wrap = Word.WdFindWrap.wdFindContinue; Object format = false;
          Object replaceWith = vkey;
          Object replace = Word.WdReplace.wdReplaceAll; Object matchKashida = Type.Missing; Object matchDiacritics = Type.Missing; Object matchAlefHamza = Type.Missing; Object matchControl = Type.Missing;
          fnd.Execute(ref findText, ref matchCase, ref matchWholeWord, ref matchWildcards, ref matchSoundsLike, ref matchAllWordForms,ref forward, ref wrap, ref format, ref replaceWith, ref replace, ref matchKashida, ref matchDiacritics, ref matchAlefHamza, ref matchControl);
          content = chars.Parent.Text;
         }
      }
   }
}

小结

1、示例代码只是简单的处理了字体颜色、加粗和字体名称三项,我们可以根据实际需要扩展处理。

2、字体颜色请参照十六进制表示输入(如 #00ff00)。

3、示例代码中 Word 表示 using Word=Microsoft.Office.Interop.Word; 的引用。

到此这篇关于C#操作Word模拟解析HTML标记输出带格式的文本的文章就介绍到这了,更多相关C# Word输出带格式文本内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c#消息提示框messagebox的详解及使用

    c#消息提示框messagebox的详解及使用

    这篇文章主要介绍了c#消息提示框messagebox的详解及使用的相关资料,需要的朋友可以参考下
    2017-03-03
  • HashTable、HashSet和Dictionary的区别点总结

    HashTable、HashSet和Dictionary的区别点总结

    在本篇文章里小编给大家整理的是关于HashTable、HashSet和Dictionary的区别点,需要的朋友们可以学习下。
    2020-03-03
  • c# 实现语音聊天的实战示例

    c# 实现语音聊天的实战示例

    这篇文章主要介绍了c# 实现语音聊天的实战示例,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-02-02
  • 在Form_Load里面调用Focus无效的解决方法

    在Form_Load里面调用Focus无效的解决方法

    在调用Form_Load的时候,Form其实还没有进入展示阶段,自然Focus()调用也就没效果了。
    2013-02-02
  • Unity UGUI的EventSystem事件系统组件介绍使用

    Unity UGUI的EventSystem事件系统组件介绍使用

    这篇文章主要为大家介绍了Unity UGUI的EventSystem事件系统组件介绍使用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • C#通过子窗体刷新父窗体的实现方法

    C#通过子窗体刷新父窗体的实现方法

    在一些软件,比如,进销存管理系统中添加销售单信息时,每个销售单都可能对应多种商品,而且在向销售单中添加商品时,一般都是在新弹出的窗体中选择商品,这时就涉及通过子窗体刷新父窗体的问题,本文给大家介绍了C#通过子窗体刷新父窗体的实现方法,需要的朋友可以参考下
    2024-04-04
  • C#使用winform简单导出Excel的方法

    C#使用winform简单导出Excel的方法

    这篇文章主要介绍了C#使用winform简单导出Excel的方法,结合实例形式分析了WinForm操作Excel文件的写入导出等相关技巧,需要的朋友可以参考下
    2016-06-06
  • C#警惕匿名方法造成的变量共享实例分析

    C#警惕匿名方法造成的变量共享实例分析

    这篇文章主要介绍了C#警惕匿名方法造成的变量共享,以实例形式分析了C#的匿名方法造成变量共享的原因及对应的解决方法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • C#实现Excel合并单元格数据导入数据集详解

    C#实现Excel合并单元格数据导入数据集详解

    这篇文章主要为大家详细介绍了C#如何实现Excel合并单元格数据导入数据集,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • C# 中类型转换方式之显式转换和 as 运算符

    C# 中类型转换方式之显式转换和 as 运算符

    在 C# 中,有两种常见的类型转换方式:显式转换和as 运算符,它们用于在不同类型之间进行转换,以下是对这两种转换方式的详细解释和示例说明,感兴趣的朋友跟随小编一起看看吧
    2024-05-05

最新评论