c#操作WORD打开一个文档,代码的内容是先将这个文档中的表格复制,再运行替换的代码,根据我的固定内容进行替换,再进行粘贴刚才复制的表,继续进行替换固定内容。直到数据集合完成,行成一个最终要的表
以下为固定的表格中的表:
现在程序能达到效果,就是内容没有发生变化,只能替换第一个表格中的内容
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