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书签内容内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论