c# word 文件替换

c#操作WORD打开一个文档,代码的内容是先将这个文档中的表格复制,再运行替换的代码,根据我的固定内容进行替换,再进行粘贴刚才复制的表,继续进行替换固定内容。直到数据集合完成,行成一个最终要的表
以下为固定的表格中的表:

img


最终要的效果为以下

img

现在程序能达到效果,就是内容没有发生变化,只能替换第一个表格中的内容

public class WriteIntoWord
        {
            Microsoft.Office.Interop.Word.ApplicationClass app = null;//定义应用程序对象WORD
            Document doc = null;//定义 WORD文档对象
            Object missing = System.Reflection.Missing.Value;//定义空变量
            Object isReadOnly = false;
            //向WORD文档定稿数据
            public void OpenDocument(string FilePath)
            {
                object filePath = FilePath;
                app = new Microsoft.Office.Interop.Word.ApplicationClass();
                app.Visible = true;
                doc = app.Documents.Open(ref filePath, ref missing, ref missing, ref missing,
                    ref missing, ref missing, ref missing, ref missing);
                doc.Activate();
            }
            
            public void WordReplace(string findText,string replaceText) //效果一样不能替换后面粘贴的表格内容
            {
                object FindText = findText;
                object MatchCase = true;
                object ReplaceWith = replaceText;
                object Replace = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll;
                app.Selection.Find.Execute(ref FindText, ref MatchCase, ref missing, ref missing, ref missing, ref missing, ref missing,
                    ref missing, ref missing, ref ReplaceWith, ref Replace, ref missing, ref missing, ref missing, ref missing);
            }
                
            /// <summary>
            /// 查找规划    效果一样不能替换后面粘贴的内容
            /// </summary>
            /// <param name="oldlr">老字符串</param>
            /// <param name="newlr">新字符串</param>

            public void findlr(string oldlr, string newlr)
            {
                #region 文字区域
                object objReplace = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll;
                app.Selection.Find.ClearFormatting();
                app.Selection.Find.Text = oldlr;
                app.Selection.Find.Replacement.ClearFormatting();
                app.Selection.Find.Replacement.Text = newlr;
                app.Selection.Find.Execute(oldlr, true, ref missing, ref missing
                                          , ref missing, ref missing, ref missing, ref missing
                                          , ref missing, newlr, ref objReplace, ref missing
                                          , ref missing, ref missing, ref missing);
                #endregion
                #region 文本框
                StoryRanges sr = doc.StoryRanges;
                foreach (Microsoft.Office.Interop.Word.Range r in sr)
                {
                    Microsoft.Office.Interop.Word.Range r1 = r;
                    if (WdStoryType.wdTextFrameStory == r.StoryType)
                    {
                        do
                        {
                            r1.Find.ClearFormatting();
                            r1.Find.Text = oldlr;
                            r1.Find.Replacement.ClearFormatting();
                            r1.Find.Replacement.Text = newlr;
                            r1.Find.Execute(ref missing, ref missing, ref missing, ref missing, ref missing,
                                            ref missing, ref missing, ref missing, ref missing, ref missing,
                                            ref objReplace, ref missing, ref missing, ref missing, ref missing);
                            r1 = r1.NextStoryRange;
                        } while (r1 != null);
                    }
                }
                #endregion
            }

            /// <summary>
            /// 写入数据
            /// </summary>
            /// <param name="BookmarkName">域标签</param>
            /// <param name="FillName">写入域中的内容</param>
            public void WriteIntoDocument(string BookmarkName, string FillName)
            {
                object bookmarkName = BookmarkName;
                Bookmark bm = doc.Bookmarks.get_Item(ref bookmarkName);
                bm.Range.Text = FillName;
            }
            /// <summary>
            /// 保存并关闭
            /// </summary>
            /// <param name="SaveDocPath">文档另存为的路径</param>
            public void Save_CloseDocument(string SaveDocPath)
            {
                object savePath = SaveDocPath;
                Object saveChanges = app.Options.BackgroundSave;
                doc.SaveAs2(ref savePath, ref missing, ref missing, ref missing, ref missing,
                    ref missing, ref missing, ref missing);
                doc.Close(ref saveChanges, ref missing, ref missing);
                app.Quit(ref missing, ref missing, ref missing);
            }

            /// <summary>
            /// 复制第一个表格
            /// </summary>
            public void CopyPaste()
            {
                doc.Tables[1].Select();
                app.Selection.Copy();
            }
            /// <summary>
            /// 粘贴表
            /// </summary>
            object unite = Microsoft.Office.Interop.Word.WdUnits.wdStory;

            public void PasteCopy()
            {
                app.Selection.Paste();
                app.Selection.EndKey(ref unite, ref missing);
            }
            /// <summary>
            /// 光标移动量  能达到效果,但是无用
            /// </summary>
            /// <param name="cou"></param>
            public void goTo(int cou)
            {
                object what = Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine;
                object which = Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToNext;
                object count = cou;
                app.Selection.GoTo(ref what, ref which, ref count, ref missing);
            }
            public void hk1(int number)
            {
                app.Selection.Tables[number].Cell(1, 1).Select();
            }
        }
      

主程序部分:

  //数据读取完成
                WriteIntoWord wiw = new WriteIntoWord();
                string FilePath = "D:\\HK.docx";
                wiw.OpenDocument(FilePath);               
                wiw.CopyPaste();
                string cbbh1 = "cbbh"; string zwmc1 = "zwmc";
                string hwmc1 = "hwmc"; string htmj1 = "htmj";
                string scmj1 = "scmj";string ht11 = "ht1";string sc11 = "sc1";
                string ht22 = "ht2";string sc22 = "sc2";
                string ht33 = "ht3";string sc33 = "sc3";
                for (int i =0;i<hklist.Count;i++)
                {
                    string cbbh = hklist[i].cbbh;
                    string zwmc = hklist[i].zwmc;
                    string hwmc = hklist[i].hwmc;
                    string htmj = hklist[i].htmj;
                    string scmj = hklist[i].scmj;
                    string ht1 = hklist[i].ht1; string sc1 = hklist[i].sc1;
                    string ht2 = hklist[i].ht2;string sc2 = hklist[i].sc2;
                    string ht3 = hklist[i].ht3;string sc3 = hklist[i].sc3;
                    wiw.WordReplace(cbbh1, cbbh);
                    wiw.WordReplace(hwmc1, hwmc);
                    wiw.findlr(cbbh1 ,cbbh);
                    wiw.findlr(hwmc1, hwmc);
                    wiw.findlr(zwmc1, zwmc);wiw.findlr(htmj1, htmj);wiw.findlr(scmj1, scmj);
                    wiw.findlr(ht11, ht1);wiw.findlr(sc11, sc1);
                    wiw.findlr(ht22, ht2);wiw.findlr(sc22, sc2);
                    wiw.findlr(ht33, ht3);wiw.findlr(sc33, sc3);
                    wiw.goTo(3);
                    wiw.PasteCopy();                    
                    
                }
                wiw.Save_CloseDocument(savePath);
                MessageBox.Show("升成完成!");

“Devil组”引证GPT后的撰写:

  • 根据描述,可能的原因是在替换文档内容时没有正确地指定需要替换的区域,导致新复制粘贴的表格没有被替换。

在使用 C# 操作 Word 进行文档替换时,可以使用 Range 对象来定位需要替换的区域。具体来说,可以通过以下步骤来替换 Word 文档中的内容:

  • 打开 Word 文档,并获取文档的 Range 对象。

  • 使用 Range.Find.Execute() 方法来查找需要替换的内容,并在找到匹配项后使用 Range.Text 属性来替换内容。

  • 重复步骤 2,直到所有需要替换的内容都被替换为止。

在执行这些操作时,需要注意以下几点:

  • 确保在查找和替换时使用正确的搜索选项和替换选项,以确保匹配到正确的文本。

  • 在复制表格并粘贴到文档中时,确保选择正确的粘贴选项,以确保表格被粘贴到正确的位置。

  • 确保在替换文档内容时使用正确的 Range 对象,以确保替换发生在正确的区域。

  • 如果遇到问题,可以尝试使用 Range.Select() 方法来手动选择需要替换的区域,以便更好地定位替换区域。另外,也可以使用调试器来检查代码是否正确执行,并查看在执行代码时发生的任何异常。

该回答引用ChatGPT

推测您的代码是这样实现的:首先打开一个Word文档,然后选择其中的一个表格进行复制,接着替换该表格中的固定内容,最后将复制的表格粘贴回到原来的位置。但是您发现,只有文档打开时的内容被替换,后面粘贴的表格并没有被替换。可能的原因有以下几点:

1、选择表格复制之前,您没有把光标放到要替换的表格中。在Word中,如果没有选中某个对象(如表格、段落、文本等),那么任何替换操作都将针对当前光标所在位置的内容进行。因此,如果您没有选中要替换的表格,那么即使复制了相同的表格到文档中,也不会被替换。

2、替换代码中指定的查找内容可能有误。请检查您的代码,确保要查找的内容与实际要替换的内容一致。

3、在进行替换操作之前,您可能没有选中整个文档。如果未选中整个文档,则替换操作将只在当前选中的范围内执行。因此,在进行替换操作之前,请确保选中整个文档,以确保所有内容都能被替换。

如果还不行 ,可以提供一下源代码

参考GPT的回答和自己的思路,可能是因为你没有将复制的表格内容放入剪贴板(Clipboard)中,所以替换的时候只能替换打开的文档中的内容,而不能替换剪贴板中的内容。

在复制表格后,可以将其内容放入剪贴板中,然后在替换时从剪贴板中获取内容进行替换。以下是一个示例代码:

// 打开 Word 文档并选中表格
var app = new Word.Application();
var doc = app.Documents.Open(@"C:\example.docx");
var table = doc.Tables[1];
table.Range.Select();

// 复制表格内容到剪贴板
table.Range.Copy();

// 替换文档中的固定内容
doc.Content.Find.Execute("replace this", ReplaceWith: "with this", Replace: Word.WdReplace.wdReplaceAll);

// 粘贴表格到文档中
doc.Range().Paste();

// 关闭 Word 文档
doc.Close(SaveChanges: true);
app.Quit();

在上述代码中,我们首先选中了要复制的表格,然后将其内容复制到剪贴板中。在替换文档中的内容时,我们可以使用 Find.Execute 方法进行替换。最后,我们将剪贴板中的表格粘贴到文档中。
回答不易,还请采纳!!!

这可能是由于你的代码只替换文档中原有的内容,新添加的内容并不会被替换。要想替换新添加的内容,你需要在替换代码中添加一个循环,以便获取文档中所有的内容,包括新添加的内容,然后再进行替换。

参考gpt和自己的思路,可能是因为你只是复制了表格,而没有将它插入到文档中。当你运行替换代码时,它只会替换已经打开的文档中的内容,而不会替换你后来插入的表格。

要解决这个问题,你可以尝试以下步骤:

1 将复制的表格插入到文档中。你可以使用以下代码将表格插入到文档中:


object missing = System.Reflection.Missing.Value;
var range = document.Content;
range.Collapse(WdCollapseDirection.wdCollapseEnd);
range.InsertParagraphAfter();
range.Collapse(WdCollapseDirection.wdCollapseEnd);
var table = range.Tables.Add(range, numRows, numColumns, ref missing, ref missing);


其中,document 是指向当前打开的文档的对象;numRows 和 numColumns 是表格的行数和列数。

2 运行替换代码。这应该会将文档中所有匹配的文本替换为新的文本,包括在后来插入的表格中的文本。


var find = document.Content.Find;
find.Execute(FindText, ReplaceWithText);


其中,FindText 是要查找的文本,ReplaceWithText 是要替换为的文本。

3 最后,保存并关闭文档。


document.Save();
document.Close();

以前写过一篇文章,你参考看看
https://www.cnblogs.com/kiba/p/15309344.html