最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#操作Word模擬解析HTML標(biāo)記輸出帶格式的文本

 更新時(shí)間:2026年01月31日 10:06:15   作者:初九之潛龍勿用  
這篇文章介紹了一種解決Word文檔格式設(shè)置問(wèn)題的方案,通過(guò)HTML標(biāo)記化文本內(nèi)容,利用正則表達(dá)式提取關(guān)鍵字,并對(duì)Word字符集對(duì)象逐字操作來(lái)重置格式,感興趣的小伙伴可以了解下

需求與困惑

應(yīng)需求通過(guò)算法輸出純文本內(nèi)容到 MS Word 對(duì)應(yīng)的替換字段中,原有的設(shè)計(jì)僅能保持模板設(shè)定的格式,如下是一個(gè)WORD表格,下方單元格中輸出題目?jī)?nèi)容,固定格式為宋體:

但客戶(hù)的需求是希望題目為黑體加粗,考察關(guān)鍵點(diǎn)為正常宋體,顏色置灰,如下圖:

初期的設(shè)想是通過(guò) Word.Find 對(duì)象配合擴(kuò)展的格式參數(shù),進(jìn)行查找結(jié)果關(guān)鍵字進(jìn)行替換及格式重置操作,發(fā)現(xiàn)無(wú)法定位精準(zhǔn)或有效的 Range ,尤其是 Word.Shape.TextFrame.TextRange ,參考、搜索了一些資料,問(wèn)題仍無(wú)法解決。

解決方案

目前主要針對(duì)如下兩個(gè) Range 對(duì)象進(jìn)行操作:

序號(hào)對(duì)象說(shuō)明
1Word.Appication.Selection.Range頁(yè)面選擇區(qū)域范圍對(duì)象(如查找到的段落高亮文字顯示結(jié)果)
2Word.Shape.TextFrame.TextRange形狀對(duì)象,對(duì)象內(nèi)包含文字,且查找到的文字結(jié)果范圍Range

基本的實(shí)現(xiàn)的思路如下:

一、將原始輸出文本按照指定的定義進(jìn)行 HTML 標(biāo)記化,如將 “這是一段文本” 文本更改為  “<span style='font-family:黑體;font-weight:bold'>這是一段文本</span>” (html 部分使用標(biāo)準(zhǔn)的 span + style ),這樣可以同時(shí)兼容標(biāo)準(zhǔn)的網(wǎng)頁(yè)版輸出。

二、對(duì) Range 的文本(Text)使用正則表達(dá)式提取 HTML 標(biāo)記間的所有查找關(guān)鍵字。

三、對(duì) Range 的字符集對(duì)象(Word.Characters)進(jìn)行逐字操作,提取 HTML 標(biāo)記的 style 屬性部分,分隔各種 style 進(jìn)行解析,重刷每一個(gè)字符的格式。

四、處理完格式設(shè)置,調(diào)用 Range.Find 對(duì)象替換掉 “多余” 的 HTML 標(biāo)記文本,完成最終輸出效果。

范例運(yùn)行環(huán)境

操作系統(tǒng): Windows Server 2019 DataCenter

操作系統(tǒng)上安裝 Office Wo(hù)rd 2016

數(shù)據(jù)庫(kù):Microsoft SQL Server 2016

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

開(kāi)發(fā)工具:VS2019  C#

配置Office DCOM

配置方法可參照我的文章《C# 讀取Word表格到DataSet》進(jìn)行處理和配置。

設(shè)計(jì)實(shí)現(xiàn)

組件庫(kù)引入

方法實(shí)現(xiàn)

processWordChars 方法基本說(shuō)明如下表:

序號(hào)參數(shù)名稱(chēng)參數(shù)類(lèi)型說(shuō)明
1charsWord.CharactersWord.Range的字符集對(duì)象

方法示例代碼如下:

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;  //提取的內(nèi)容
         string vkey = key.Substring(key.IndexOf('>') + 1); //最終有效內(nèi)容
                    
         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;
         }
      }
   }
}

小結(jié)

1、示例代碼只是簡(jiǎn)單的處理了字體顏色、加粗和字體名稱(chēng)三項(xiàng),我們可以根據(jù)實(shí)際需要擴(kuò)展處理。

2、字體顏色請(qǐng)參照十六進(jìn)制表示輸入(如 #00ff00)。

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

到此這篇關(guān)于C#操作Word模擬解析HTML標(biāo)記輸出帶格式的文本的文章就介紹到這了,更多相關(guān)C# Word輸出帶格式文本內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

扎兰屯市| 深水埗区| 巴彦县| 乐陵市| 德格县| 平谷区| 金山区| 全州县| 青田县| 卢氏县| 仁寿县| 琼中| 宜城市| 仁怀市| 苏尼特左旗| 凤山县| 玛沁县| 金阳县| 丰都县| 兴安县| 崇仁县| 广昌县| 龙泉市| 鸡泽县| 罗甸县| 金塔县| 贡觉县| 宜良县| 田林县| 瓦房店市| 开原市| 玛纳斯县| 浦江县| 巨鹿县| 怀集县| 临安市| 乐都县| 铜山县| 陇南市| 安达市| 临高县|