C#操作Word模擬解析HTML標(biāo)記輸出帶格式的文本
需求與困惑
應(yīng)需求通過算法輸出純文本內(nèi)容到 MS Word 對(duì)應(yīng)的替換字段中,原有的設(shè)計(jì)僅能保持模板設(shè)定的格式,如下是一個(gè)WORD表格,下方單元格中輸出題目?jī)?nèi)容,固定格式為宋體:

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

初期的設(shè)想是通過 Word.Find 對(duì)象配合擴(kuò)展的格式參數(shù),進(jìn)行查找結(jié)果關(guān)鍵字進(jìn)行替換及格式重置操作,發(fā)現(xiàn)無法定位精準(zhǔn)或有效的 Range ,尤其是 Word.Shape.TextFrame.TextRange ,參考、搜索了一些資料,問題仍無法解決。
解決方案
目前主要針對(duì)如下兩個(gè) Range 對(duì)象進(jìn)行操作:
| 序號(hào) | 對(duì)象 | 說明 |
| 1 | Word.Appication.Selection.Range | 頁面選擇區(qū)域范圍對(duì)象(如查找到的段落高亮文字顯示結(jié)果) |
| 2 | Word.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)頁版輸出。
二、對(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ù)庫:Microsoft SQL Server 2016
.net版本: .netFramework4.7.1 或以上
開發(fā)工具:VS2019 C#
配置Office DCOM
配置方法可參照我的文章《C# 讀取Word表格到DataSet》進(jìn)行處理和配置。
設(shè)計(jì)實(shí)現(xiàn)
組件庫引入

方法實(shí)現(xiàn)
processWordChars 方法基本說明如下表:
| 序號(hào) | 參數(shù)名稱 | 參數(shù)類型 | 說明 |
|---|---|---|---|
| 1 | chars | Word.Characters | Word.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)單的處理了字體顏色、加粗和字體名稱三項(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)文章
Unity相機(jī)移動(dòng)之屏幕邊緣檢測(cè)
這篇文章主要為大家詳細(xì)介紹了Unity相機(jī)移動(dòng)之屏幕邊緣檢測(cè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02
C#簡(jiǎn)單實(shí)現(xiàn)防止多個(gè)程序運(yùn)行的方法
這篇文章主要介紹了C#簡(jiǎn)單實(shí)現(xiàn)防止多個(gè)程序運(yùn)行的方法,涉及C#進(jìn)程操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-02-02
C#利用OLEDB實(shí)現(xiàn)將DataTable寫入Excel文件中
這篇文章主要為大家詳細(xì)介紹了C#如何利用OLEDB實(shí)現(xiàn)將DataTable寫入Excel文件中,文中的示例代碼簡(jiǎn)潔易懂,具有一定的借鑒價(jià)值,需要的可以參考一下2023-02-02
C#實(shí)現(xiàn)強(qiáng)制關(guān)閉當(dāng)前程序進(jìn)程
這篇文章主要介紹了C#實(shí)現(xiàn)強(qiáng)制關(guān)閉當(dāng)前程序進(jìn)程,本文直接給出實(shí)現(xiàn)代碼,可以實(shí)現(xiàn)完全Kill掉不留痕跡,需要的朋友可以參考下2015-06-06
C#中TextBox實(shí)現(xiàn)輸入提示功能的方法
這篇文章主要介紹了C#中TextBox實(shí)現(xiàn)輸入提示功能的方法,涉及C#中TextBox的相關(guān)操作技巧,需要的朋友可以參考下2015-06-06
C#更新SQLServer中TimeStamp字段(時(shí)間戳)的方法
這篇文章主要介紹了C#更新SQLServer中TimeStamp字段(時(shí)間戳)的方法,涉及C#操作數(shù)據(jù)庫字段的相關(guān)技巧,需要的朋友可以參考下2015-05-05
C# 空值處理運(yùn)算符??、?. 及其它常用符號(hào)
本文主要介紹了C# 空值處理運(yùn)算符??、?. 及其它常用符號(hào),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-11-11

