C#替换Word文档中的书签内容的详细步骤

 更新时间:2025年08月01日 09:47:03   作者:OfficeDocDevTeam  
Word书签不但可以帮助读者快速跳转到想要查看的位置,而且可以用做“占位符”,本文总结了一个将常见的Word文档元素替换进书签的C#解决方案,希望对大家有所帮助

Word书签不但可以帮助读者快速跳转到想要查看的位置,而且可以用做“占位符”,程序员获取“占位符”之后,就可以更新这些“占位符”,即替换书签内容。替换模板文档中的书签内容,可以帮助我们快速生成Word报表或文档。

本文总结了一个将常见的Word文档元素(文字、图片和表格)替换进书签的C#解决方案,具体步骤见下文。

使用工具:

  • Spire.Doc.dll 6.4.5
  •  Visual Studio 2013

步骤一 制作模板

1.  新建Word文档

图1 创建文档

2.  插入书签

图2 插入书签

3.  保存模板,命名为“bookmark_template.docx”

图3 保存模板文档

步骤二 在项目中添加引用

1.  右键点击“解决方案资源管理”中的“引用”,选择“添加引用”

图4 添加引用

2.  选择要引用的Spire.Doc.dll文件,添加至项目中

图5 引用Spire.Doc.dll

步骤三 编码

Spire.Doc提供了BookmarksNavigator类来获取和操作文档中的书签,但方法不是很直观。为了方便,我自己封装了Bookmark类,其中包括RepalceContent及其2个重载方法来分别应对插入文字、图片和表格三种情况。

  • public TextRange ReplaceContent(string bookmarkName, string text, bool saveFormatting)
  • public void ReplaceContent(string bookmarkName, string picPath, float widthScale, float heightScale, TextWrappingStyle wrapStyle, ShapeHorizontalAlignment horizontalAlignment)
  • public void ReplaceContent(string bookmarkName, Table table)

第一部分:Bookmark.cs编码

using Spire.Doc;
using Spire.Doc.Fields;
using System.Drawing;
using Spire.Doc.Interface;
using Spire.Doc.Documents;

namespace ReplaceBookmarkContent
{
    class Bookmark
    {
        private Document doc = null;
        public Bookmark(Document document)
        {
            doc = document;
        }

        /// <summary>
        /// 用文本替换指定书签的内容
        /// </summary>
        /// <param name="bookmarkName">书签名</param>
        /// <param name="text">文本</param>
        /// <param name="saveFormatting">删除原始书签内容时,是否保留格式</param>
        /// <returns>TextRange</returns>
        public TextRange ReplaceContent(string bookmarkName, string text, bool saveFormatting)
        {
            BookmarksNavigator navigator = new BookmarksNavigator(doc);
            navigator.MoveToBookmark(bookmarkName);//指向特定书签
            navigator.DeleteBookmarkContent(saveFormatting);//删除原有书签内容     
            Spire.Doc.Interface.ITextRange textRange = navigator.InsertText(text);//写入文本
            return textRange as TextRange;
        }

        /// <summary>
        /// 用图片替换指定书签的内容
        /// </summary>
        /// <param name="bookmarkName">书签名</param>
        /// <param name="picPath">图片路径</param>
        /// <param name="widthScale">宽度缩放比例,0以上正整数</param>
        /// <param name="heightScale">高度缩放比例,0以上正整数</param>
        /// <param name="wrapStyle">环绕方式</param>
        /// <param name="horizontalAlignment"></param>
        public void ReplaceContent(string bookmarkName, string picPath, float widthScale, float heightScale, TextWrappingStyle wrapStyle, ShapeHorizontalAlignment horizontalAlignment)
        {
            BookmarksNavigator navigator = new BookmarksNavigator(doc);
            navigator.MoveToBookmark(bookmarkName);
            navigator.DeleteBookmarkContent(false);
            IParagraphBase paragraphBase = navigator.InsertParagraphItem(ParagraphItemType.Picture);//插入类型为图片
            Image image = Image.FromFile(picPath);//加载图片
            DocPicture picture = paragraphBase.OwnerParagraph.AppendPicture(image);//插入图片
            picture.WidthScale = widthScale;
            picture.HeightScale = heightScale;
            picture.TextWrappingStyle = wrapStyle;
            picture.HorizontalAlignment = horizontalAlignment;
        }

        /// <summary>
        /// 用表格替换指定书签的内容
        /// </summary>
        /// <param name="bookmarkName">书签名</param>
        /// <param name="table">Table实例</param>
        public void ReplaceContent(string bookmarkName, Table table)
        {
            BookmarksNavigator navigator = new BookmarksNavigator(doc);
            navigator.MoveToBookmark(bookmarkName);
            TextBodyPart body = new TextBodyPart(doc);
            body.BodyItems.Add(table);
            navigator.ReplaceBookmarkContent(body);
        }

        /// <summary>
        /// 创建表格并写入数据,返回Table对象
        /// </summary>
        /// <param name="rowsNum">行数</param>
        /// <param name="columnsNum">列数</param>
        /// <param name="columnWidth">列宽</param>
        /// <param name="horizontalAlignment">水平对齐方式</param>
        /// <param name="datatable">DataTable实例</param>
        /// <returns></returns>
        public Table CreateTable(int rowsNum, int columnsNum, float columnWidth, RowAlignment horizontalAlignment, System.Data.DataTable datatable)
        {
            Table table = new Table(doc, true, 1f);//初始化Table对象
            table.ResetCells(rowsNum, columnsNum);//设置行数和列数
            //填充数据
            for (int i = 0; i < datatable.Rows.Count; i++)
            {
                for (int j = 0; j < datatable.Columns.Count; j++)
                {
                    table.Rows[i].Cells[j].AddParagraph().AppendText(datatable.Rows[i][j].ToString());
                }
            }
            //设置列宽
            for (int i = 0; i < rowsNum; i++)
            {
                for (int j = 0; j < columnsNum; j++)
                {
                    table.Rows[i].Cells[j].Width = columnWidth;
                }               
            }
            table.TableFormat.HorizontalAlignment = horizontalAlignment;//表格水平对齐方式
            return table;
        }
    }
}

第二步部分:生成文件的编码

//加载模板文档
Document doc = new Document();
doc.LoadFromFile(@"C:\Users\Administrator\Desktop\bookmark_template.docx");

//初始化Bookmark对象
Bookmark bookmark = new Bookmark(doc);

//用文本替换书签bookmark_text的内容
string text = "XXX科技股份有限公司成立于2010年12月,是一家致力于高新技术产品研发、生产、销售的高科技股份制企业,"
    + "公司坚持以技术创新为核心,以知识产权为基础,以人才战略为支撑,经过多年的砺练与发展,公司已逐步成以创新为引导的,"
    + "产品具有竞争力,人才素质优良的新兴科技企业。";
bookmark.ReplaceContent("bookmark_text", text, true);

//用图片替换书签bookmark_picture的内容
string picPath = @"C:\Users\Administrator\Desktop\company_logo.jpg";
bookmark.ReplaceContent("bookmark_picture", picPath, 80f, 80f, TextWrappingStyle.TopAndBottom, ShapeHorizontalAlignment.Center);

//创建模拟数据
DataTable dt = new DataTable();
dt.Columns.Add("employee_id", typeof(string));
dt.Columns.Add("name", typeof(string));
dt.Columns.Add("age", typeof(string));
dt.Columns.Add("sex", typeof(string));
dt.Columns.Add("title", typeof(string));
dt.Rows.Add(new string[] {"工号", "姓名", "年龄", "性别", "职位" });
dt.Rows.Add(new string[] {"1023","Nancy", "28", "女", "Java程序员" });
dt.Rows.Add(new string[] { "1024","James", "34", "男", ".NET程序员" });
dt.Rows.Add(new string[] { "1025","Kobe", "38", "男", "系统管理员" });

//创建表格,并填充数据
Table table = bookmark.CreateTable(dt.Rows.Count, dt.Columns.Count, 100f, RowAlignment.Left, dt);

//用表格替换书签bookmark_table的内容
bookmark.ReplaceContent("bookmark_table", table);

//生成Word文件
doc.SaveToFile("output.docx", FileFormat.Docx2013);

运行代码,得到下面的结果:

图6 生成的文件

注:

1. Spire.Doc本身也有Bookmark类,但仅用于添加书签到文档中,请注意本文中的Bookmark类是自定义的方便自己使用的方法的集合。

2.  Spire.Doc 6.4.5 为商业版,在不应用许可证的情况下,生成的文档会有水印信息。笔者写文章时已应用临时许可证(官方提供的用于测试软件的License)。

3.  笔者使用免费版的Spire.Doc测试过,以上效果基本都能实现,但图片的环绕方式只能设置为“InLine”,且水平位置为靠右,设置其他环绕方式时,图片位置会出错。这应该是免费版的Bug。

到此这篇关于C#替换Word文档中的书签内容的详细步骤的文章就介绍到这了,更多相关C#替换Word书签内容内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#实体对象序列化成Json并让字段的首字母小写的两种解决方法

    C#实体对象序列化成Json并让字段的首字母小写的两种解决方法

    这篇文章主要介绍了C#实体对象序列化成Json并让字段的首字母小写的两种方法,在这两种方法中小编比较推荐使用第二种方法,需要的朋友可以参考下
    2018-06-06
  • C#实现常见加密算法的示例代码

    C#实现常见加密算法的示例代码

    这篇文章主要为大家详细介绍一下C#中一些常见加密算法(Base64编码、凯撒密码、Vigenere密码、DES、AES)以及它们的实现代码,感兴趣的可以了解一下
    2022-07-07
  • C#检查字符串是否是合法URL地址的方法

    C#检查字符串是否是合法URL地址的方法

    这篇文章主要介绍了C#检查字符串是否是合法URL地址的方法,涉及C#字符串判断的相关技巧,需要的朋友可以参考下
    2015-05-05
  • C#组件系列 你值得拥有的一款Excel处理神器Spire.XLS

    C#组件系列 你值得拥有的一款Excel处理神器Spire.XLS

    又一款Excel处理神器Spire.XLS,这篇文章主要为大家详细介绍了第三方组件Spire.XLS,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • C#实现字符串首字母大写的方法示例

    C#实现字符串首字母大写的方法示例

    这篇文章主要给大家介绍了关于利用C#实现字符串首字母大写的相关资料,这是在最近工作中遇到的一个需求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • C#实现调用本机摄像头实例

    C#实现调用本机摄像头实例

    这篇文章主要介绍了C#实现调用本机摄像头的方法,可以实现调用本机摄像头进行拍照,具有不错的实用价值,需要的朋友可以参考下
    2014-08-08
  • C#实现多文件压缩与解压功能

    C#实现多文件压缩与解压功能

    这篇文章主要为大家详细介绍了如何利用C#语言实现多文件压缩与解压功能,即选择多个文件压缩成ZIP文件和解压ZIP文件,需要的可以参考一下
    2022-08-08
  • C# API中模型与它们的接口设计详解

    C# API中模型与它们的接口设计详解

    这篇文章主要给大家介绍了关于C# API中模型与它们的接口设计的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-06-06
  • 利用C#实现访问远程硬盘的高效方案

    利用C#实现访问远程硬盘的高效方案

    随着数据存储需求的不断增加,越来越多的企业和开发者开始将文件存储从本地硬盘转移到远程存储解决方案中,在本篇文章中,我们将深入探讨如何使用C#访问远程硬盘,需要的朋友可以参考下
    2025-05-05
  • C#实现插入排序算法实例

    C#实现插入排序算法实例

    这篇文章主要介绍了C#实现插入排序算法,实例分析了插入排序算法的原理与实现技巧,需要的朋友可以参考下
    2015-05-05

最新评论