C# 操作Word书签(二)——插入图片、表格到书签;读取、替换书签
概要
书签的设置可以帮助我们快速的定位某段文字,使用起来很方便,也很节省时间。在前一篇文章“C# 如何添加/删除Word书签”中介绍了插入、删除书签的方法,本篇文章将对C# 操作Word书签的功能做进一步介绍。示例内容将包含以下要点:
- 在现有书签位置插入图片
- 在现有书签位置插入表格
- 读取书签位置的文档内容
- 替换现有书签位置内容
使用工具
- Spire.Doc for .NET 6.1
- Visual Studio
ps:下载安装该类库后,注意添加引用Spire.Doc.dl到项目程序,dll文件可在安装路径的Bin文件夹中获取。

示例代码(供参考)
测试文档如下:

【示例1】 在现有书签位置插入图片
步骤 1: 添加using指令
using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;
using System.Drawing;
步骤 2 :主要代码段
//创建实例,加载文档
Document document = new Document();
document.LoadFromFile("test.docx"); //实例化BookmarksNavigator类,指定需要添加图片的书签“Bookmark1”
BookmarksNavigator bn = new BookmarksNavigator(document);
bn.MoveToBookmark("Bookmark1", true, true); //添加段落,加载图片并插入到段落
Section section0 = document.AddSection();
Paragraph paragraph = section0.AddParagraph();
Image image = Image.FromFile("img.png");
DocPicture picture = paragraph.AppendPicture(image);
bn.InsertParagraph(paragraph);
document.Sections.Remove(section0); //保存文档并打开
string output = "result.docx";
document.SaveToFile(output, FileFormat.Docx);
System.Diagnostics.Process.Start(output);
图片插入效果:

全部代码:
using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;
using System.Drawing; namespace InsertImgToBookmark_Doc
{
class Program
{
static void Main(string[] args)
{
//创建实例,加载文档
Document document = new Document();
document.LoadFromFile("test.docx"); //实例化BookmarksNavigator类,指定需要添加图片的书签“Bookmark1”
BookmarksNavigator bn = new BookmarksNavigator(document);
bn.MoveToBookmark("Bookmark1", true, true); //添加段落,加载图片并插入到段落
Section section0 = document.AddSection();
Paragraph paragraph = section0.AddParagraph();
Image image = Image.FromFile("img.png");
DocPicture picture = paragraph.AppendPicture(image);
bn.InsertParagraph(paragraph);
document.Sections.Remove(section0); //保存文档并打开
string output = "result.docx";
document.SaveToFile(output, FileFormat.Docx);
System.Diagnostics.Process.Start(output);
}
}
}
【示例 2】在现有书签位置插入表格
步骤 1:添加using指令
using Spire.Doc;
using Spire.Doc.Documents;
using System.Data;
步骤 2 :创建文档,加载文件
Document doc = new Document();
doc.LoadFromFile("test.docx");
步骤 3 :创建表格
//创建Table对象
Table table = new Table(doc, true); //创建模拟数据
DataTable dt = new DataTable();
dt.Columns.Add("PI", typeof(string));
dt.Columns.Add("Type", typeof(string));
dt.Columns.Add("Nov.", typeof(string));
dt.Columns.Add("YTD", typeof(string));
dt.Rows.Add(new string[] { "PI","Type", "Nov.", "YTD" });
dt.Rows.Add(new string[] { "", "BAIC EC-Series", "15.719", "64.910" });
dt.Rows.Add(new string[] { "", "Tesla Model S", "3.889", "46.951" });
dt.Rows.Add(new string[] { "", "Nissan Leaf", "2.817", "46.423" }); //将数据填充至表格
table.ResetCells(dt.Rows.Count, dt.Columns.Count);
for (int i = ; i < dt.Rows.Count; i++)
{
for (int j = ; j < dt.Columns.Count; j++)
{
table.Rows[i].Cells[j].AddParagraph().AppendText(dt.Rows[i][j].ToString());
}
}
步骤 4 :插入表格到书签位置
//获取指定书签位置
BookmarksNavigator navigator = new BookmarksNavigator(doc);
navigator.MoveToBookmark("origin2"); //将表格添加至TextBodyPart
TextBodyPart part = navigator.GetBookmarkContent();
part.BodyItems.Add(table);
//替换原有书签内容
navigator.ReplaceBookmarkContent(part);
步骤 5 :保存文件
//保存并打开文件
doc.SaveToFile("output.docx", FileFormat.Docx2013);
System.Diagnostics.Process.Start("output.docx");
表格插入效果:

全部代码:
using Spire.Doc;
using Spire.Doc.Documents;
using System.Data; namespace InsertTableToBookmark_Doc
{
class Program
{
static void Main(string[] args)
{
//创建文档,加载文件
Document doc = new Document();
doc.LoadFromFile("test.docx"); //创建Table对象
Table table = new Table(doc, true); //创建模拟数据
DataTable dt = new DataTable();
dt.Columns.Add("PI", typeof(string));
dt.Columns.Add("Type", typeof(string));
dt.Columns.Add("Nov.", typeof(string));
dt.Columns.Add("YTD", typeof(string));
dt.Rows.Add(new string[] { "PI","Type", "Nov.", "YTD" });
dt.Rows.Add(new string[] { "", "BAIC EC-Series", "15.719", "64.910" });
dt.Rows.Add(new string[] { "", "Tesla Model S", "3.889", "46.951" });
dt.Rows.Add(new string[] { "", "Nissan Leaf", "2.817", "46.423" }); //将数据填充至表格
table.ResetCells(dt.Rows.Count, dt.Columns.Count);
for (int i = ; i < dt.Rows.Count; i++)
{
for (int j = ; j < dt.Columns.Count; j++)
{
table.Rows[i].Cells[j].AddParagraph().AppendText(dt.Rows[i][j].ToString());
}
} //获取指定书签位置
BookmarksNavigator navigator = new BookmarksNavigator(doc);
navigator.MoveToBookmark("origin2"); //将表格添加至TextBodyPart
TextBodyPart part = navigator.GetBookmarkContent();
part.BodyItems.Add(table); //替换书签内容
navigator.ReplaceBookmarkContent(part); //保存并打开文件
doc.SaveToFile("output.docx", FileFormat.Docx2013);
System.Diagnostics.Process.Start("output.docx");
}
}
}
【示例3】读取书签位置的内容
步骤 1 :添加using指令
using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;
using System;
步骤 2 :获取书签位置的内容
//初始化BookmarkNavigator类对象
BookmarksNavigator navigator = new BookmarksNavigator(doc);
//定位到指定书签位置,获取书签位置的文档内容
navigator.MoveToBookmark("bookmark1");
TextBodyPart textBodyPart = navigator.GetBookmarkContent();
步骤 3 :读取书签内容
//遍历书签内容中的子项目,并将文本信息提取至string类型变量中
string text = null;
foreach (var item in textBodyPart.BodyItems)
{
if (item is Paragraph)
{
foreach (var childObject in (item as Paragraph).ChildObjects)
{
if (childObject is TextRange)
{
text += (childObject as TextRange).Text;
}
}
}
}
//控制台输出文本
Console.WriteLine(text);
Console.ReadLine();
读取结果:

全部代码:
using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;
using System; namespace GetTextOfBookmark_Doc
{
class Program
{
static void Main(string[] args)
{
//实例化Document类,加载测试文档
Document doc = new Document();
doc.LoadFromFile("test.docx"); //初始化BookmarkNavigator类对象
BookmarksNavigator navigator = new BookmarksNavigator(doc);
//定位到指定书签位置,获取书签位置的文档内容
navigator.MoveToBookmark("bookmark1");
TextBodyPart textBodyPart = navigator.GetBookmarkContent(); //遍历书签内容中的子项目,并将文本信息提取至string类型变量中
string text = null;
foreach (var item in textBodyPart.BodyItems)
{
if (item is Paragraph)
{
foreach (var childObject in (item as Paragraph).ChildObjects)
{
if (childObject is TextRange)
{
text += (childObject as TextRange).Text;
}
}
}
}
//控制台输出文本
Console.WriteLine(text);
Console.ReadLine();
}
}
}
【示例4】替换现有书签内容
步骤 1 :添加using指令
using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;
步骤 2 :加载文档
Document document = new Document();
document.LoadFromFile("test.docx");
步骤 3 :添加段落及文字
Section sec = document.AddSection();//添加section
sec.AddParagraph().AppendText("Welcome Back, \n My Friend!"); //添加段落到section,并添加字符串内容
步骤 4 :获取段落
//获取段落内容
ParagraphBase firstReplacementParagraph = sec.Paragraphs[].Items.FirstItem as ParagraphBase;
ParagraphBase lastReplacementParagraph = sec.Paragraphs[sec.Paragraphs.Count - ].Items.LastItem as ParagraphBase;
//实例化类TextBodySelection和TextBodyPart
TextBodySelection selection = new TextBodySelection(firstReplacementParagraph, lastReplacementParagraph);
TextBodyPart part = new TextBodyPart(selection);
步骤 5 :替换书签内容
BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document);//实例化BookmarksNavigator类
bookmarkNavigator.MoveToBookmark("bookmark1", true, true);//定位到书签“bookmark1”所在段落的位置
bookmarkNavigator.DeleteBookmarkContent(true);//删除原有书签位置的内容
bookmarkNavigator.ReplaceBookmarkContent(part, true, true);//用新添加段落的内容替换掉原书签的内容并保留格式
document.Sections.Remove(sec); //移除section
步骤 6 :保存文档
//保存文档并打开
document.SaveToFile("替换书签.docx");
System.Diagnostics.Process.Start("替换书签.docx");
替换效果:

全部代码:
using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields; namespace EditOrReplaceBookmark_Doc
{
class Program
{
static void Main(string[] args)
{
//创建Document类实例,加载文档
Document document = new Document();
document.LoadFromFile("test.docx"); Section sec = document.AddSection();//添加section
sec.AddParagraph().AppendText("Welcome Back, \n My Friend!"); //添加段落到section,并添加字符串内容 //获取段落内容
ParagraphBase firstReplacementParagraph = sec.Paragraphs[].Items.FirstItem as ParagraphBase;
ParagraphBase lastReplacementParagraph = sec.Paragraphs[sec.Paragraphs.Count - ].Items.LastItem as ParagraphBase;
//实例化类TextBodySelection和TextBodyPart
TextBodySelection selection = new TextBodySelection(firstReplacementParagraph, lastReplacementParagraph);
TextBodyPart part = new TextBodyPart(selection); BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document);//实例化BookmarksNavigator类
bookmarkNavigator.MoveToBookmark("bookmark1", true, true);//定位到书签“bookmark1”所在段落的位置
bookmarkNavigator.DeleteBookmarkContent(true);//删除原有书签位置的内容
bookmarkNavigator.ReplaceBookmarkContent(part, true, true);//用新添加段落的内容替换掉原书签的内容并保留格式
document.Sections.Remove(sec); //移除section //保存文档并打开
document.SaveToFile("替换书签.docx");
System.Diagnostics.Process.Start("替换书签.docx");
}
}
}
以上是本次关于C# 操作Word书签功能的补充介绍,如需转载,请注明出处。
(本文完)
C# 操作Word书签(二)——插入图片、表格到书签;读取、替换书签的更多相关文章
- C# 操作Word文本框——插入表格/读取表格/删除表格
在文本框中,我们可以操作很多元素,如文本.图片.表格等,在本篇文章中将着重介绍如何插入表格到文本框,插入的表格我们可以对表格进行格式化操作来丰富表格内容.此外,对于文本框中的表格内容,我们也可以根据需 ...
- .Net Core NOPI操作word(二) 表格操作
一.创建表格操作 private void btnExport_Click(object sender, EventArgs e) { var dbcontext = new BlogModel(); ...
- Npoi XWPF Word 导出时插入图片无法显示 bug 完美解决
一.来自客户的需求 最近客户来个新需求生成一个word 标签纸,并且需要在标签纸上插入一个logo,并且将erp 中的数据取出来自动写在文档上,不由得淡淡一笑,这不难呀! 于是乎我就写下了这样的代码: ...
- 2.4.5 用NPOI操作EXCEL--插入图片
我们知道,在Excel中是可以插入图片的.操作菜单是“插入->图片”,然后选择要插入图片,可以很容易地在Excel插入图片.同样,在NPOI中,利用代码也可以实现同样的效果.在NPOI中插入图片 ...
- MySQL行(记录)的详细操作一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理
MySQL行(记录)的详细操作 阅读目录 一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理 一 介绍 MySQL数据操作: ...
- Word批量调整插入图片大小
做标书,word中需要插入大量图片,实为一些证书.文件的扫描文件.但插入后,大小不是想要的,太小了,打印出来看不清.需要调整,需要批量调整. 这是一个不错的方法: 选中第一张图片,按页面调整大小到适合 ...
- 利用Python操作Word文档【图片】
利用Python操作Word文档
- bootstrap-wysiwyg 结合 base64 解码 .net bbs 图片操作类 (二) 图片裁剪
图片裁剪参见: http://deepliquid.com/projects/Jcrop/demos.php?demo=thumbnail 一个js插件 http://www.mikes ...
- C#中按模板操作Word —— 如何向Word中插入图片
一.Word对象模型的重叠性分析 本文主要介绍通过书签Bookmark向Word文档中插入图片的方法.在此之前我们先简单讨论下Word对象模型的重叠性.如果你对Word对象模型还不熟悉,请参考本专栏第 ...
随机推荐
- pytorch可视化工具visdom
visdom的github repo: https://github.com/facebookresearch/visdom 知乎一个教程:https://zhuanlan.zhihu.com/p/3 ...
- 怎么用JQUERY设置div背景图片?
平常,在css里,我们写成 { background:url(....) ; } 如果需要写脚本, 则 function(){ .....; $(....).css("background- ...
- typescript之初学习
ts的优势: 支持ES6规范 强大的IDE支持(类型检测.语法提示.重构等) Angular的开发语言 ts的新特性: 一.字符串 1.多行字符串,使用反引号`` 2.字符串模板,使用表达式传入变量和 ...
- JS基础整理面试题
1.DOM和BOM的区别 DOM:document object model;文档对象模型,提供操作页面元素的方法和属性BOM:browser object model;浏览器对象模型,提供一些属性和 ...
- JavaScript 异步编程的前世今生(下)
ES6 中的 Generator 在 ES6 出现之前,基本都是各式各样类似Promise的解决方案来处理异步操作的代码逻辑,但是 ES6 的Generator却给异步操作又提供了新的思路,马上就有人 ...
- 【Nim游戏】高僧斗法
先来看看Nim定理: // 若干堆硬币,二人轮流取,从一堆硬币中取几个 直到某个人不能取硬币 那这个人就输了 // 3 4 5 // 3 3 把硬币变成相同的 那么你就赢了 因为你可以跟着另一个人一样 ...
- [Swift]LeetCode898. 子数组按位或操作 | Bitwise ORs of Subarrays
We have an array A of non-negative integers. For every (contiguous) subarray B = [A[i], A[i+1], ..., ...
- Java中的方法(形参及实参)return返回类型
如何定义 Java 中的方法 所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块. 一般情况下,定义一个方法的语法是: 其中: 1. 访问修饰符:方法允许被访问的权限范围, 可以是 pub ...
- Linux 虚拟网络设备详解之 Bridge 网桥
本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 前面几篇文章介 ...
- [Reversing.kr] Easy_KeygenMe Writeup
IDA打开.Main()函数就是关键算法 v6,v7,v8 是连续的 .可看成 L=[16,32,48].输入的name每位分别于L[]异或 得到的值存在v13.然后清空v9的值 ,输入Serial储 ...