You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中用Microsoft.Office.Interop.Word实现docx标签替换与表格加载

我之前也折腾过用Microsoft.Office.Interop.Word处理这类文档模板替换的需求,确实官方文档不够直观,下面给你拆解两个核心需求的实现方案:

一、替换文档中的#xxx#格式元标签

核心思路是利用Word的查找功能匹配#*#通配符模式,遍历所有匹配的标签,再替换成数据库对应的值。这里给你一段可直接复用的C#代码:

using Microsoft.Office.Interop.Word;
using System.Runtime.InteropServices;
using System.Collections.Generic;

public void ReplaceMetaTags(string docPath, Dictionary<string, string> tagValues)
{
    Application wordApp = null;
    Document doc = null;

    try
    {
        wordApp = new Application();
        // 可以设置为false,后台运行不显示Word窗口
        wordApp.Visible = false;
        doc = wordApp.Documents.Open(docPath);

        // 配置查找规则:匹配#任意内容#的格式
        Find findObject = doc.Content.Find;
        findObject.ClearFormatting();
        findObject.Text = "#*#";
        findObject.MatchWildcards = true;
        findObject.Forward = true;

        // 遍历所有匹配到的标签
        while (findObject.Execute())
        {
            // 提取标签名(去掉前后的#符号)
            string tagName = findObject.Parent.Text.Trim('#');
            // 从字典(模拟数据库取值)获取对应替换值
            if (tagValues.TryGetValue(tagName, out string replaceValue))
            {
                findObject.Parent.Text = replaceValue;
            }
        }

        doc.Save();
        doc.Close();
    }
    catch (Exception ex)
    {
        Console.WriteLine($"替换标签出错: {ex.Message}");
    }
    finally
    {
        // 必须释放Interop对象,避免Word进程后台残留
        if (doc != null) Marshal.ReleaseComObject(doc);
        if (wordApp != null)
        {
            wordApp.Quit();
            Marshal.ReleaseComObject(wordApp);
        }
    }
}

使用时,你只需要把数据库查询到的标签键值对传入tagValues字典即可。

二、向Word文档加载数据表内容

通常的做法是先在Word模板里标记一个书签(比如命名为DataTablePlaceholder),然后在书签位置插入表格并填充数据。示例代码如下:

using Microsoft.Office.Interop.Word;
using System.Runtime.InteropServices;
using System.Data;

public void LoadDataTableToWord(string docPath, DataTable dataTable)
{
    Application wordApp = null;
    Document doc = null;

    try
    {
        wordApp = new Application();
        wordApp.Visible = false;
        doc = wordApp.Documents.Open(docPath);

        // 定位到模板中的书签位置
        Bookmark tableBookmark = doc.Bookmarks["DataTablePlaceholder"];
        if (tableBookmark == null)
        {
            throw new Exception("未找到表格占位书签,请检查模板");
        }

        // 在书签位置插入表格:行数=数据行+表头,列数=数据列数
        Range bookmarkRange = tableBookmark.Range;
        Table dataTableInWord = doc.Tables.Add(bookmarkRange, dataTable.Rows.Count + 1, dataTable.Columns.Count);

        // 填充表头
        for (int col = 0; col < dataTable.Columns.Count; col++)
        {
            dataTableInWord.Cell(1, col + 1).Range.Text = dataTable.Columns[col].ColumnName;
        }

        // 填充数据行
        for (int row = 0; row < dataTable.Rows.Count; row++)
        {
            for (int col = 0; col < dataTable.Columns.Count; col++)
            {
                dataTableInWord.Cell(row + 2, col + 1).Range.Text = dataTable.Rows[row][col].ToString();
            }
        }

        // 可选:给表格设置默认样式,让排版更美观
        dataTableInWord.Style = "Table Grid";

        doc.Save();
        doc.Close();
    }
    catch (Exception ex)
    {
        Console.WriteLine($"加载表格出错: {ex.Message}");
    }
    finally
    {
        // 释放资源,避免内存泄漏
        if (doc != null) Marshal.ReleaseComObject(doc);
        if (wordApp != null)
        {
            wordApp.Quit();
            Marshal.ReleaseComObject(wordApp);
        }
    }
}

额外提示

  • 如果模板里已经有现成的空表格,也可以直接通过doc.Tables[index]获取表格对象,再逐行添加数据;
  • 查找标签时,如果需要区分大小写,可以设置findObject.MatchCase = true;
  • 测试时可以把wordApp.Visible设为true,方便直观看到替换效果。

内容的提问来源于stack exchange,提问作者Douglas Ferreira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:27:56