1. 程式人生 > >C#替換Word中的文字內容

C#替換Word中的文字內容

        Word文件文字替換時長度不能超過255個字元,不能一次性替換,本方法通過迴圈替換,達到替換超過255字元的目的。

/// <summary>

        /// 替換word中的文字
        /// </summary>
        /// <param name="filePath">檔案的路徑</param>
        /// <param name="datas">包含待替換字串和替換字串的集合</param>
        /// <returns>true 替換成功;false 替換失敗</returns>
        public static bool WordReplace(string filePath, Dictionary<string, string> datas)
        {
            bool result = false;
            Microsoft.Office.Interop.Word._Application app = null;
            Microsoft.Office.Interop.Word._Document doc = null;


            object nullobj = Type.Missing;
            object file = filePath;


            try
            {
                app = new Microsoft.Office.Interop.Word.Application();//new Microsoft.Office.Interop.Word.ApplicationClass();


                doc = app.Documents.Open(
                ref file, ref nullobj, ref nullobj,
                ref nullobj, ref nullobj, ref nullobj,
                ref nullobj, ref nullobj, ref nullobj,
                ref nullobj, ref nullobj, ref nullobj,
                ref nullobj, ref nullobj, ref nullobj, ref nullobj) as Microsoft.Office.Interop.Word._Document;


                //app.Selection.ParagraphFormat.CharacterUnitFirstLineIndent = 2;//首行縮排的長度


                object objReplace = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll;


                foreach (var item in datas)
                {
                    app.Selection.Find.ClearFormatting();
                    app.Selection.Find.Replacement.ClearFormatting();
                    string oldStr = item.Key;//需要被替換的文字
                    string newStr = item.Value; //替換文字 


                    if (newStr == null)
                    {
                        newStr = "";
                    }
                    int newStrLength = newStr.Length;
                    if (newStrLength <= 255) // 長度未超過255時,直接替換
                    {
                        app.Selection.Find.Text = oldStr;
                        app.Selection.Find.Replacement.Text = newStr;


                        app.Selection.Find.Execute(ref nullobj, ref nullobj, ref nullobj,
                                                   ref nullobj, ref nullobj, ref nullobj,
                                                   ref nullobj, ref nullobj, ref nullobj,
                                                   ref nullobj, ref objReplace, ref nullobj,
                                                   ref nullobj, ref nullobj, ref nullobj);
                        continue;
                    }


                    //word文字替換長度不能超過255
                    int hasSubLength = 0;
                    int itemLength = 255 - oldStr.Length;
                    while (true)
                    {
                        string itemStr = "";
                        int subLength = 0;
                        if (newStrLength - hasSubLength <=255)  // 剩餘的內容不超過255,直接替換
                        {
                            app.Selection.Find.ClearFormatting();
                            app.Selection.Find.Replacement.ClearFormatting();


                            app.Selection.Find.Text = oldStr;
                            app.Selection.Find.Replacement.Text = newStr.Substring(hasSubLength, newStrLength - hasSubLength);


                            app.Selection.Find.Execute(ref nullobj, ref nullobj, ref nullobj,
                                                        ref nullobj, ref nullobj, ref nullobj,
                                                        ref nullobj, ref nullobj, ref nullobj,
                                                        ref nullobj, ref objReplace, ref nullobj,
                                                        ref nullobj, ref nullobj, ref nullobj);


                            break; // 結束迴圈
                        }


                        // 由於Word中換行為“^p”兩個字元不能分割
                        // 如果分割位置將換行符分開了,則本次少替換一個字元
                        if (newStr.Substring(hasSubLength, itemLength).EndsWith("^") &&
                            newStr.Substring(hasSubLength, itemLength + 1).EndsWith("p"))
                        {
                            subLength = itemLength - 1;
                        }
                        else
                        {
                            subLength = itemLength;
                        }


                        itemStr = newStr.Substring(hasSubLength, subLength) + oldStr;


                        app.Selection.Find.ClearFormatting();
                        app.Selection.Find.Replacement.ClearFormatting();


                        app.Selection.Find.Text = oldStr;
                        app.Selection.Find.Replacement.Text = itemStr;


                        app.Selection.Find.Execute(ref nullobj, ref nullobj, ref nullobj,
                                                    ref nullobj, ref nullobj, ref nullobj,
                                                    ref nullobj, ref nullobj, ref nullobj,
                                                    ref nullobj, ref objReplace, ref nullobj,
                                                    ref nullobj, ref nullobj, ref nullobj);


                        hasSubLength += subLength;
                    }
                }


                //儲存
                doc.Save();


                result = true;
            }
            catch
            {
                result = false;
            }
            finally
            {
                if (doc != null)
                {
                    doc.Close(ref nullobj, ref nullobj, ref nullobj);
                    doc = null;
                }
                if (app != null)
                {
                    app.Quit(ref nullobj, ref nullobj, ref nullobj);
                    app = null;
                }
                GC.Collect();
                GC.WaitForPendingFinalizers();
            }
            return result;

        }

每次替換的長度為255減去待替換文字長度;

另外,Word中的換行符是“^p”,如果替換文字中有換行符,需要在迴圈替換時檢查是否將該字元切割了,如果切割了,則少擷取一個字元;