详情

首页手游攻略 使用C#代码修改Word文档中的内容控件实用指南

使用C#代码修改Word文档中的内容控件实用指南

佚名 2026-09-08 15:40:01

平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“采用C#代码修改Word文档中的内容控件”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。

目录
  • 安装 Spire.Doc for .NET
  • 采用 C# 修改正下文的内容控件
  • 采用 C# 修改段落中的内容控件
  • 采用 C# 修改包裹表格行的内容控件
  • 采用 C# 修改包裹表格单元格的内容控件
  • 采用 C# 修改表格单元格内的内容控件

在这个场景下,在 Word 文档里,内容控件能够完成内容的动态更新与修改,为用户提供更加灵活的编辑和管理方式。借助内容控件,用户能够在指定区域中轻松插入、删除或修改内容,而不会影响文档的整体结构。

结合项目来看,下面会介绍如何在 C# 项目中采用 Spire.Doc for .NET,对 Word 文档中的内容控件进行修改。

安装 Spire.Doc for .NET

落到代码里,首先,需将 Spire.Doc for .NET 安装包中的 DLL 文件添加为 .NET 项目的引用。你能够借助下载官方安装包拿到这些 DLL 文件,或者直接借助 NuGet 进行安装。

PM> Install-Package Spire.Doc

采用 C# 修改正下文的内容控件

在 Spire.Doc 里,正文区域的内容控件对应的对象类型为 StructureDocumentTag实际处理时,。你能够借助遍历 Section.Body 中的子对象集合,查找该类型的对象,并对其进行修改。具体步骤如下所示:

  1. 新建一个 Document 对象。
  2. 采用 Document.LoadFromFile() 方法加载文档。
  3. 借助 Section.Body 访问文档中某一节的正文内容。
  4. 结合项目来看,遍历正下文的子对象集合 Body.ChildObjects,查找类型为 StructureDocumentTag 的对象。
  5. 在这个场景下,访问 StructureDocumentTag.ChildObjects 集合,根据子对象的类型执行相应的修改操作。
  6. 采用 Document.SaveToFile() 方法保存文档。

示例如下所示:

using Spire.Doc;
using Spire.Doc.Documents;
using System.Collections.Generic;

namespace SpireDocDemo
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 创建一个新的文档对象
            Document doc = new Document();

            // 从文件加载文档内容
            doc.LoadFromFile("Sample1.docx");

            // 获取文档的正文内容
            Body body = doc.Sections[0].Body;

            // 创建段落和表格的列表
            List<Paragraph> paragraphs = new List<Paragraph>();
            List<Table> tables = new List<Table>();
            for (int i = 0; i < body.ChildObjects.Count; i++)
            {
                // 获取文档对象
                DocumentObject documentObject = body.ChildObjects[i];

                // 如果是 StructureDocumentTag(内容控件)对象
                if (documentObject.DocumentObjectType == DocumentObjectType.StructureDocumentTag)
                {
                    StructureDocumentTag structureDocumentTag = (StructureDocumentTag)documentObject;

                    // 如果标签为 "c1" 或别名为 "c1"
                    if (structureDocumentTag.SDTProperties.Tag == "c1" || structureDocumentTag.SDTProperties.Alias == "c1")
                    {
                        for (int j = 0; j < structureDocumentTag.ChildObjects.Count; j++)
                        {
                            // 如果是段落对象
                            if (structureDocumentTag.ChildObjects[j].DocumentObjectType == DocumentObjectType.Paragraph)
                            {
                                Paragraph paragraph = (Paragraph)structureDocumentTag.ChildObjects[j];
                                paragraphs.Add(paragraph);
                            }

                            // 如果是表格对象
                            if (structureDocumentTag.ChildObjects[j].DocumentObjectType == DocumentObjectType.Table)
                            {
                                Table table = (Table)structureDocumentTag.ChildObjects[j];
                                tables.Add(table);
                            }
                        }
                    }
                }
            }

            // 修改第一个段落的文本内容
            paragraphs[0].Text = "Spire.Doc for .NET 是一个完全独立的 .NET Word 类库,无需在系统中安装 Microsoft Office。";

            // 重置第一个表格的单元格(5 行 4 列)
            tables[0].ResetCells(5, 4);

            // 将修改后的文档保存到文件
            doc.SaveToFile("ModifyBodyContentControls.docx", FileFormat.Docx2016);

            // 释放文档资源
            doc.Dispose();
        }
    }
}

采用 C# 修改段落中的内容控件

在 Spire.Doc 里,段落内的内容控件对应的对象类型为 StructureDocumentTagInline结合项目来看,。要对其进行修改,需遍历 Paragraph.ChildObjects 集合,查找该类型的对象,同时执行相应的操作。具体步骤如下所示:

  1. 新建一个 Document 对象。
  2. 采用 Document.LoadFromFile() 方法加载文档。
  3. 借助 Section.Body 访问文档中某一节的正文内容。
  4. 采用 Body.Paragraphs[0] 拿到正下文的第一个段落。
  5. 结合项目来看,遍历段落的子对象集合 Paragraph.ChildObjects,查找类型为 StructureDocumentTagInline 的对象。
  6. 实际处理时,访问 StructureDocumentTagInline.ChildObjects 集合,根据子对象类型执行相应的修改操作。
  7. 采用 Document.SaveToFile() 方法保存文档。

示例如下所示:

using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;
using System.Collections.Generic;

namespace SpireDocDemo
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 创建一个新的 Document 对象
            Document doc = new Document();

            // 从文件加载文档内容
            doc.LoadFromFile("Sample2.docx");

            // 获取文档的正文内容
            Body body = doc.Sections[0].Body;

            // 获取正文中的第一个段落
            Paragraph paragraph = body.Paragraphs[0];

            // 遍历段落中的子对象
            for (int i = 0; i < paragraph.ChildObjects.Count; i++)
            {
                // 判断子对象是否为 StructureDocumentTagInline(行内内容控件)
                if (paragraph.ChildObjects[i].DocumentObjectType == DocumentObjectType.StructureDocumentTagInline)
                {
                    // 将子对象转换为 StructureDocumentTagInline 类型
                    StructureDocumentTagInline structureDocumentTagInline = (StructureDocumentTagInline)paragraph.ChildObjects[i];

                    // 判断 Tag 或 Alias 是否为 "text1"
                    if (structureDocumentTagInline.SDTProperties.Tag == "text1" || structureDocumentTagInline.SDTProperties.Alias == "text1")
                    {
                        // 遍历该内容控件中的子对象
                        for (int j = 0; j < structureDocumentTagInline.ChildObjects.Count; j++)
                        {
                            // 判断子对象是否为 TextRange(文本)
                            if (structureDocumentTagInline.ChildObjects[j].DocumentObjectType == DocumentObjectType.TextRange)
                            {
                                // 转换为 TextRange 类型
                                TextRange range = (TextRange)structureDocumentTagInline.ChildObjects[j];

                                // 设置文本内容
                                range.Text = "97-2003/2007/2010/2013/2016/2019";
                            }
                        }
                    }

                    // 判断 Tag 或 Alias 是否为 "logo1"
                    if (structureDocumentTagInline.SDTProperties.Tag == "logo1" || structureDocumentTagInline.SDTProperties.Alias == "logo1")
                    {
                        // 遍历该内容控件中的子对象
                        for (int j = 0; j < structureDocumentTagInline.ChildObjects.Count; j++)
                        {
                            // 判断子对象是否为图片
                            if (structureDocumentTagInline.ChildObjects[j].DocumentObjectType == DocumentObjectType.Picture)
                            {
                                // 转换为 DocPicture 类型
                                DocPicture docPicture = (DocPicture)structureDocumentTagInline.ChildObjects[j];

                                // 加载指定图片
                                docPicture.LoadImage("Doc-NET.png");

                                // 设置图片的宽度和高度
                                docPicture.Width = 100;
                                docPicture.Height = 100;
                            }
                        }
                    }
                }
            }

            // 将修改后的文档保存为新文件
            doc.SaveToFile("ModifiedContentControlsInParagraph.docx", FileFormat.Docx2016);

            // 释放 Document 对象资源
            doc.Dispose();
        }
    }
}

采用 C# 修改包裹表格行的内容控件

在 Spire.Doc 里,表格行级别的内容控件对应的对象类型为 StructureDocumentTagRow从实现思路看,。要对其进行修改,需遍历 Table.ChildObjects 集合,查找该类型的对象,同时执行相应的操作。具体步骤如下所示:

  1. 新建一个 Document 对象。
  2. 采用 Document.LoadFromFile() 方法加载文档。
  3. 借助 Section.Body 访问文档中某一节的正文内容。
  4. 采用 Body.Tables[0] 拿到正下文的第一个表格。
  5. 理解这一步时,遍历表格的子对象集合 Table.ChildObjects,查找类型为 StructureDocumentTagRow 的对象。
  6. 实际处理时,访问 StructureDocumentTagRow.Cells(表格行内容控件中的单元格集合),同时对单元格内容进行相应修改。
  7. 采用 Document.SaveToFile() 方法保存文档。

示例如下所示:

using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;

namespace SpireDocDemo
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 创建一个新的文档对象
            Document doc = new Document();

            // 从文件加载文档
            doc.LoadFromFile("Sample3.docx");

            // 获取文档的正文内容
            Body body = doc.Sections[0].Body;

            // 获取第一个表格
            Table table = (Table)body.Tables[0];

            // 遍历表格中的子对象
            for (int i = 0; i < table.ChildObjects.Count; i++)
            {
                // 判断子对象是否为 StructureDocumentTagRow(表格行内容控件)
                if (table.ChildObjects[i].DocumentObjectType == DocumentObjectType.StructureDocumentTagRow)
                {
                    // 转换为 StructureDocumentTagRow 对象
                    StructureDocumentTagRow structureDocumentTagRow = (StructureDocumentTagRow)table.ChildObjects[i];

                    // 判断 Tag 或 Alias 是否为 "row1"
                    if (structureDocumentTagRow.SDTProperties.Tag == "row1" || structureDocumentTagRow.SDTProperties.Alias == "row1")
                    {
                        // 清除该单元格中的段落内容
                        structureDocumentTagRow.Cells[0].Paragraphs.Clear();

                        // 在单元格中添加段落并设置文本
                        TextRange textRange = structureDocumentTagRow.Cells[0].AddParagraph().AppendText("Arts");
                        textRange.CharacterFormat.TextColor = System.Drawing.Color.Blue;
                    }
                }
            }

            // 将修改后的文档保存到文件
            doc.SaveToFile("ModifiedTableRowContentControl.docx", FileFormat.Docx2016);

            // 释放文档资源
            doc.Dispose();
        }
    }
}

采用 C# 修改包裹表格单元格的内容控件

在 Spire.Doc 里,表格单元格中的内容控件对应的对象类型为 StructureDocumentTagCell落到代码里,。要对其进行修改,需遍历 TableRow.ChildObjects 集合,查找该类型的对象,同时对其执行相应操作。具体步骤如下所示:

  1. 新建一个 Document 对象。
  2. 采用 Document.LoadFromFile() 方法加载文档。
  3. 借助 Section.Body 拿到文档中某一节的正文内容。
  4. 采用 Body.Tables[0] 拿到正下文的第一个表格。
  5. 实际处理时,遍历表格行集合 Table.Rows,逐一拿到每个 TableRow 对象。
  6. 在这个场景下,遍历每一行的子对象集合 TableRow.ChildObjects,查找类型为 StructureDocumentTagCell 的对象。
  7. 从实现思路看,访问 StructureDocumentTagCell 中的段落集合,同时对内容进行相应修改。
  8. 采用 Document.SaveToFile() 方法保存文档。

示例如下所示:

using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;

namespace SpireDocDemo
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 创建一个新的文档对象
            Document doc = new Document();

            // 从文件加载文档
            doc.LoadFromFile("Sample4.docx");

            // 获取文档的正文内容
            Body body = doc.Sections[0].Body;

            // 获取文档中的第一个表格
            Table table = (Table)body.Tables[0];

            // 遍历表格的每一行
            for (int i = 0; i < table.Rows.Count; i++)
            {
                // 遍历每一行中的子对象
                for (int j = 0; j < table.Rows[i].ChildObjects.Count; j++)
                {
                    // 判断子对象是否为 StructureDocumentTagCell(单元格内容控件)
                    if (table.Rows[i].ChildObjects[j].DocumentObjectType == DocumentObjectType.StructureDocumentTagCell)
                    {
                        // 转换为 StructureDocumentTagCell 类型
                        StructureDocumentTagCell structureDocumentTagCell = (StructureDocumentTagCell)table.Rows[i].ChildObjects[j];

                        // 判断 Tag 或 Alias 是否为 "cell1"
                        if (structureDocumentTagCell.SDTProperties.Tag == "cell1" || structureDocumentTagCell.SDTProperties.Alias == "cell1")
                        {
                            // 清除单元格中的段落内容
                            structureDocumentTagCell.Paragraphs.Clear();

                            // 添加新的段落并设置文本
                            TextRange textRange = structureDocumentTagCell.AddParagraph().AppendText("92");
                            textRange.CharacterFormat.TextColor = System.Drawing.Color.Blue;
                        }
                    }
                }
            }

            // 将修改后的文档保存为新文件
            doc.SaveToFile("ModifiedTableCellContentControl.docx", FileFormat.Docx2016);

            // 释放文档对象资源
            doc.Dispose();
        }
    }
}

采用 C# 修改表格单元格内的内容控件

在这个场景下,本示例演示如何修改表格单元格中段落内的内容控件。需先拿到单元格中的段落集合 TableCell.Paragraphs,随后遍历每个段落的子对象集合 Paragraph.ChildObjects,查找类型为 StructureDocumentTagInline 的对象,并对其进行相应修改。具体步骤如下所示:

  1. 新建一个 Document 对象。
  2. 采用 Document.LoadFromFile() 方法加载文档。
  3. 借助 Section.Body 拿到文档中某一节的正文内容。
  4. 采用 Body.Tables[0] 拿到正下文的第一个表格。
  5. 实际处理时,遍历表格行集合 Table.Rows,逐一拿到每个 TableRow 对象。
  6. 实际处理时,遍历每一行中的单元格集合 TableRow.Cells,拿到每个 TableCell 对象。
  7. 从实现思路看,遍历单元格中的段落集合 TableCell.Paragraphs,拿到每个 Paragraph 对象。
  8. 结合项目来看,遍历段落的子对象集合 Paragraph.ChildObjects,查找类型为 StructureDocumentTagInline 的对象。
  9. 理解这一步时,访问 StructureDocumentTagInline 的 ChildObjects 集合,根据子对象类型执行相应的修改操作。
  10. 采用 Document.SaveToFile() 方法保存文档。

示例如下所示:

using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;

namespace SpireDocDemo
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 创建一个新的 Document 对象
            Document doc = new Document();

            // 从文件加载文档内容
            doc.LoadFromFile("Sample5.docx");

            // 获取文档的正文内容
            Body body = doc.Sections[0].Body;

            // 获取第一个表格
            Table table = (Table)body.Tables[0];

            // 遍历表格的每一行
            for (int r = 0; r < table.Rows.Count; r++)
            {
                // 遍历每一行中的单元格
                for (int c = 0; c < table.Rows[r].Cells.Count; c++)
                {
                    // 遍历单元格中的段落
                    for (int p = 0; p < table.Rows[r].Cells[c].Paragraphs.Count; p++)
                    {
                        // 获取段落对象
                        Paragraph paragraph = table.Rows[r].Cells[c].Paragraphs[p];

                        // 遍历段落中的子对象
                        for (int i = 0; i < paragraph.ChildObjects.Count; i++)
                        {
                            // 判断子对象是否为 StructureDocumentTagInline(行内内容控件)
                            if (paragraph.ChildObjects[i].DocumentObjectType == DocumentObjectType.StructureDocumentTagInline)
                            {
                                // 转换为 StructureDocumentTagInline 对象
                                StructureDocumentTagInline structureDocumentTagInline = (StructureDocumentTagInline)paragraph.ChildObjects[i];

                                // 判断 Tag 或 Alias 是否为 "test1"
                                if (structureDocumentTagInline.SDTProperties.Tag == "test1" || structureDocumentTagInline.SDTProperties.Alias == "test1")
                                {
                                    // 遍历该内容控件中的子对象
                                    for (int j = 0; j < structureDocumentTagInline.ChildObjects.Count; j++)
                                    {
                                        // 判断子对象是否为 TextRange(文本)
                                        if (structureDocumentTagInline.ChildObjects[j].DocumentObjectType == DocumentObjectType.TextRange)
                                        {
                                            // 转换为 TextRange 对象
                                            TextRange textRange = (TextRange)structureDocumentTagInline.ChildObjects[j];

                                            // 设置文本内容
                                            textRange.Text = "89";

                                            // 设置文本颜色
                                            textRange.CharacterFormat.TextColor = System.Drawing.Color.Blue;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            // 将修改后的文档保存为新文件
            doc.SaveToFile("ModifiedContentControlInParagraphOfTableCell.docx", FileFormat.Docx2016);

            // 释放 Document 对象资源
            doc.Dispose();
        }
    }
}

到此这篇关于采用C#代码修改Word文档中的内容控件的文章就介绍到这了,更多相关C#修改Word内容控件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多兼容脚本之家!

您可能感兴趣的文章:

  • 采用C#新建、修改和删除Word文档中的VBA宏
  • C#向Word文档中添加内容控件的方法示例
  • C#三步实现Word转Excel并保留格式
  • C#实现高效读取Word表格数据并导出为CSV/TXT
  • 采用C#在Word文档中添加文本和图片超链接的实现方法

相关资讯
点击查看更多
游戏推荐
推荐专题
热门阅读
推荐下载