日韩欧美国产精品免费一二-日韩欧美国产精品亚洲二区-日韩欧美国产精品专区-日韩欧美国产另-日韩欧美国产免费看-日韩欧美国产免费看清风阁

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

C#操作實現微軟Office的Word全域查找且替換指定文本內容

admin
2025年1月14日 15:39 本文熱度 609

關于全域查找且替換

C#全域操作 Word 查找且替換主要包括如下四個對象:

序號對象說明
1Word.Appication.Selection窗格對象
2Word.Section.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range頁眉對象
3Word.Section.Footers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range頁腳對象
4Word.Shape.TextFrame.TextRange形狀對象

我們需要創建 Word.Find 對象,對上述相關區域分別進行查找替換操作。

Word應用樣本

我們假設設計簡歷模板的輸出,并查找且替換對應的關鍵字,如下圖:

其中對應項目的關鍵字如 {xm}、{xb} 等則為查找且替換的對象,{grzp} 關鍵字處我們要處理圖片的插入。

SqlServer數據表部分設計樣本

設計 PersonInfo 數據表如下:

CREATE TABLE [dbo].[PersonInfo](

    [id] [uniqueidentifier] ROWGUIDCOL  NOT NULL,

    [sfzh] [varchar](18) NOT NULL,

    [xm] [nvarchar](50) NOT NULL,

    [xb] [nvarchar](1) NULL,

    [grzp] [image] NULL,

 CONSTRAINT [PK_PersonInfo] PRIMARY KEY CLUSTERED 

(

    [id] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],

 CONSTRAINT [IX_PersonInfo] UNIQUE NONCLUSTERED 

(

    [sfzh] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

  

ALTER TABLE [dbo].[PersonInfo] ADD  CONSTRAINT [DF_PersonInfo_id]  DEFAULT (newid()) FOR [id]

GO

通過查詢 select sfzh,xm,xb,grzp from PersonInfo where id=xxx 得到DataSet,再取 Tables[0]中的數據。 

范例運行環境

操作系統: Windows Server 2019 DataCenter

操作系統上安裝 Office Excel 2016

數據庫:Microsoft SQL Server 2016

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

開發工具:VS2019  C#

配置Office DCOM

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

設計實現

組件庫引入

實現原理

我們假設查詢出表數據,存入對應的變量,其中將二進制字段grzp數據寫入到d:\test.jpg生成圖片,示例代碼如下:

DataTable dt=DataSet.Tables[0];

  

string sfzh = dt.Rows[0]["sfzh"].ToString();

object bt = dt.Rows[0]["grzp"];

byte[] bFile2 = (byte[])bt;

System.IO.File.WriteAllBytes("@d:\test.jpg", bFile2);

  

string xm = dt.Rows[0]["xm"].ToString();

string xb = dt.Rows[0]["xb"].ToString();

然后我們將其存到二維字符串數組 _repls 里,如下代碼:

string[,] _repls = new string[4, 2];

_repls[0, 0] = "{sfzh}";

_repls[0, 1] = sfzh;

_repls[1, 0] = "{xm}";

_repls[1, 1] = xm;

_repls[2, 0] = "{xb}";

_repls[2, 1] = xb;

_repls[3, 0] = "RepalceFromImageFilename_{grzp}";

_repls[3, 1] = "@d:\test.jpg";

其中第一元素存儲要查找的關鍵字,第二元素存儲要替換的值。注意:替換圖片使用了自定義的RepalceFromImageFilename_ 前綴關鍵字,則表示值為對應的文件路徑。數據準備完畢后,我們將通過遍歷數組對 Word 進行查找且替換操作。

查找且替換的核心代碼

窗格內容

示例代碼如下:

WordApp.Options.ReplaceSelection = true;

Word.Find fnd = WordApp.Selection.Find;

for(int i=0;i<_repls.GetLength(0);i++)

{

    if (_repls[i, 0] == "" || _repls[i, 0] == null)

    {

        continue;

    }

    fnd.ClearFormatting();

 

    string ft = _repls[i, 0];

    string replaceType = "";

    if (ft.IndexOf("RepalceFromImageFilename_") == 0)

    {

        ft = ft.Replace("RepalceFromImageFilename_", "");

        replaceType = "RepalceFromImageFilename";

    }else if (ft.IndexOf("RepalceFromImageFilenameNoDelete_") == 0)

    {

        ft = ft.Replace("RepalceFromImageFilenameNoDelete_", "");

        replaceType = "RepalceFromImageFilenameNoDelete";

    }

    Object findText = ft;

    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 ="";

    Object replace =Type.Missing;;

    Object matchKashida = Type.Missing;

    Object matchDiacritics = Type.Missing;

    Object matchAlefHamza = Type.Missing;

    Object matchControl = Type.Missing;

    while(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))

    {

        string r_f=WordApp.Selection.Font.Name.ToString();

        if (replaceType == "RepalceFromImageFilename" || replaceType == "RepalceFromImageFilenameNoDelete")

        {

            if (File.Exists(_repls[i, 1].ToString()))

            {

                WordApp.Selection.Range.Select();

                Word.InlineShape pic = WordApp.Selection.InlineShapes.AddPicture(_repls[i, 1].ToString(), false, true, WordApp.Selection.Range);

                if (replConfigs != null)

                {

                    string[] cv = replConfigs[ft].Split('|');

                    pic.Width = int.Parse(cv[0]);

                    pic.Height = int.Parse(cv[1]);

 

                }

                if (replaceType == "RepalceFromImageFilename")

                {

                    File.Delete(_repls[i, 1].ToString());

                }

            }

        }

        else

        {

            WordApp.Selection.Range.Text = _repls[i, 1].ToString();

        }

    }

}

頁眉內容

示例代碼如下:

foreach (Word.Section header in WordDoc.Sections)

{

    Word.Range headerRange = header.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;

 

    Word.Find fnd = headerRange.Find;

    for (int i = 0; i < _repls.GetLength(0); i++)

    {

        if (_repls[i, 0] == "" || _repls[i, 0] == null)

        {

            continue;

        }

        fnd.ClearFormatting();

 

        string ft = _repls[i, 0];

        string replaceType = "";

        if (ft.IndexOf("RepalceFromImageFilename_") == 0)

        {

            ft = ft.Replace("RepalceFromImageFilename_", "");

            replaceType = "RepalceFromImageFilename";

        }

        else if (ft.IndexOf("RepalceFromImageFilenameNoDelete_") == 0)

        {

            ft = ft.Replace("RepalceFromImageFilenameNoDelete_", "");

            replaceType = "RepalceFromImageFilenameNoDelete";

        }

        Object findText = ft;

        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 = "";

        Object replace = Type.Missing; ;

        Object matchKashida = Type.Missing;

        Object matchDiacritics = Type.Missing;

        Object matchAlefHamza = Type.Missing;

        Object matchControl = Type.Missing;

        while (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))

        {

            string r_f = WordApp.Selection.Font.Name.ToString();

            if (replaceType == "RepalceFromImageFilename" || replaceType == "RepalceFromImageFilenameNoDelete")

            {

                if (File.Exists(_repls[i, 1].ToString()))

                {

                    WordApp.Selection.Range.Select();

                    Word.InlineShape pic = WordApp.Selection.InlineShapes.AddPicture(_repls[i, 1].ToString(), false, true, headerRange);

                    if (replaceType == "RepalceFromImageFilename")

                    {

                        File.Delete(_repls[i, 1].ToString());

                    }

                }

            }

            else

            {

                headerRange.Text = _repls[i, 1].ToString();

            }

        }

    }

}

頁腳內容

示例代碼如下:

foreach (Word.Section footer in WordDoc.Sections)

{

    Word.Range footerRange = footer.Footers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;

 

    Word.Find fnd = footerRange.Find;

    for (int i = 0; i < _repls.GetLength(0); i++)

    {

        if (_repls[i, 0] == "" || _repls[i, 0] == null)

        {

            continue;

        }

        fnd.ClearFormatting();

 

        string ft = _repls[i, 0];

        string replaceType = "";

        if (ft.IndexOf("RepalceFromImageFilename_") == 0)

        {

            ft = ft.Replace("RepalceFromImageFilename_", "");

            replaceType = "RepalceFromImageFilename";

        }

        else if (ft.IndexOf("RepalceFromImageFilenameNoDelete_") == 0)

        {

            ft = ft.Replace("RepalceFromImageFilenameNoDelete_", "");

            replaceType = "RepalceFromImageFilenameNoDelete";

        }

        Object findText = ft;

        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 = "";

        Object replace = Type.Missing; ;

        Object matchKashida = Type.Missing;

        Object matchDiacritics = Type.Missing;

        Object matchAlefHamza = Type.Missing;

        Object matchControl = Type.Missing;

        while (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))

        {

            string r_f = WordApp.Selection.Font.Name.ToString();

            //                      WordApp.Selection.Font.Name=r_f;

            //                      WordApp.Selection.Range

            //                      WordApp.Selection.TypeText(_repls[i,1].ToString());

            if (replaceType == "RepalceFromImageFilename" || replaceType == "RepalceFromImageFilenameNoDelete")

            {

                if (File.Exists(_repls[i, 1].ToString()))

                {

                    WordApp.Selection.Range.Select();

                    Word.InlineShape pic = WordApp.Selection.InlineShapes.AddPicture(_repls[i, 1].ToString(), false, true, footerRange);

                    if (replaceType == "RepalceFromImageFilename")

                    {

                        File.Delete(_repls[i, 1].ToString());

                    }

                }

            }

            else

            {

                footerRange.Text = _repls[i, 1].ToString();

            }

        }

    }

}

形狀內容

示例代碼如下:

foreach (Word.Shape shape in WordDoc.Shapes)

{

    if (shape.TextFrame.HasText == 0)

    {

        continue; 

    }

 

    Word.Find fnd = shape.TextFrame.TextRange.Find;

    //Word.Find fnd = WordDoc.Content.Find;

    for (int i = 0; i < _repls.GetLength(0); i++)

    {

        if (_repls[i, 0] == "" || _repls[i, 0] == null)

        {

            continue;

        }

        fnd.ClearFormatting();

 

        string ft = _repls[i, 0];

        string replaceType = "";

        if (ft.IndexOf("RepalceFromImageFilename_") == 0)

        {

            ft = ft.Replace("RepalceFromImageFilename_", "");

            replaceType = "RepalceFromImageFilename";

        }

        else if (ft.IndexOf("RepalceFromImageFilenameNoDelete_") == 0)

        {

            ft = ft.Replace("RepalceFromImageFilenameNoDelete_", "");

            replaceType = "RepalceFromImageFilenameNoDelete";

        }

        Object findText = ft;

        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 = "";

        Object replace = Type.Missing; ;

        Object matchKashida = Type.Missing;

        Object matchDiacritics = Type.Missing;

        Object matchAlefHamza = Type.Missing;

        Object matchControl = Type.Missing;

        while (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))

        {

            string r_f = WordApp.Selection.Font.Name.ToString();

            if (replaceType == "RepalceFromImageFilename" || replaceType == "RepalceFromImageFilenameNoDelete")

            {

                if (File.Exists(_repls[i, 1].ToString()))

                {

                    Word.InlineShape pic = WordApp.Selection.InlineShapes.AddPicture(_repls[i, 1].ToString(), false, true, shape.TextFrame.TextRange);

                       

                    if (replaceType == "RepalceFromImageFilename")

                    {

                        File.Delete(_repls[i, 1].ToString());

                    }

                }

            }

            else

            {

                shape.TextFrame.TextRange.Text = _repls[i, 1].ToString();

            }

        }

    }

}

小結

1、示例代碼是冗余的寫法,在實際應用中我們需要進行優化。

2、添加圖片后,代碼默認是使用完畢后,刪除圖片文件以釋放空間,我們自定義了 RepalceFromImageFilenameNoDelete_ 前綴關鍵字,表示使用完畢后不進行文件刪除。

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

4、示例代碼 WordDoc 表示對 Word.Document 的引用。


該文章在 2025/1/14 15:39:43 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 二区视频在线观看 | 老司机深夜影院入口aaaa | 超97在线观看视频 | 日韩亚洲欧美高清在线观看 | 国产一区二区精品在线观看 | 欧美综合精品一区二区二 | 日本高清不卡一道免费观看 | 日韩美女乱淫 | 欧美v亚洲v日韩v最新在线 | 国产h视频在线观看 | 97在线视频免费观看视频免费 | 国产国语| 精品国偷自产在线视频99 | 日韩一级一欧美一级国产 | 国产激情免费视频在 | 日本午夜免费理论片 | 在线国产精品看片 | 午夜免费视频在线观看 | 综合影视亚洲中文 | 国产sm重味一区二区三区 | 女人靠逼视频不卡的 | 日本中文字幕乱码免费 | 日韩中文字幕v亚洲中文字幕 | 日韩中文字幕免费视频 | 国产熟女乱伦一区二区 | 日本中文字幕电影 | 99视频热这里只有精品 | 亚洲欧美人成综合导航 | 最好免费观看高清视频大全 | 忍不住的亲子中文字幕在线 | 不卡视频一区二区三区免费观看 | 亚洲一本中文日韩 | 日本免费 | 欧美一区二区电影免费观看 | 精品综合视频 | 中文字幕一区二区三 | 50岁丰满女| 夜夜未满十八勿进的爽爽影院 | 亚洲综合亚洲综合网成人 | 国产玉足脚交极品在线视频 | 亚洲国产综合一区日韩精品 |