C#替換Word文檔中的書簽內(nèi)容的詳細(xì)步驟
Word書簽不但可以幫助讀者快速跳轉(zhuǎn)到想要查看的位置,而且可以用做“占位符”,程序員獲取“占位符”之后,就可以更新這些“占位符”,即替換書簽內(nèi)容。替換模板文檔中的書簽內(nèi)容,可以幫助我們快速生成Word報表或文檔。
本文總結(jié)了一個將常見的Word文檔元素(文字、圖片和表格)替換進書簽的C#解決方案,具體步驟見下文。
使用工具:
- Spire.Doc.dll 6.4.5
- Visual Studio 2013
步驟一 制作模板
1. 新建Word文檔

圖1 創(chuàng)建文檔
2. 插入書簽

圖2 插入書簽
3. 保存模板,命名為“bookmark_template.docx”

圖3 保存模板文檔
步驟二 在項目中添加引用
1. 右鍵點擊“解決方案資源管理”中的“引用”,選擇“添加引用”

圖4 添加引用
2. 選擇要引用的Spire.Doc.dll文件,添加至項目中

圖5 引用Spire.Doc.dll
步驟三 編碼
Spire.Doc提供了BookmarksNavigator類來獲取和操作文檔中的書簽,但方法不是很直觀。為了方便,我自己封裝了Bookmark類,其中包括RepalceContent及其2個重載方法來分別應(yīng)對插入文字、圖片和表格三種情況。
- 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>
/// 用文本替換指定書簽的內(nèi)容
/// </summary>
/// <param name="bookmarkName">書簽名</param>
/// <param name="text">文本</param>
/// <param name="saveFormatting">刪除原始書簽內(nèi)容時,是否保留格式</param>
/// <returns>TextRange</returns>
public TextRange ReplaceContent(string bookmarkName, string text, bool saveFormatting)
{
BookmarksNavigator navigator = new BookmarksNavigator(doc);
navigator.MoveToBookmark(bookmarkName);//指向特定書簽
navigator.DeleteBookmarkContent(saveFormatting);//刪除原有書簽內(nèi)容
Spire.Doc.Interface.ITextRange textRange = navigator.InsertText(text);//寫入文本
return textRange as TextRange;
}
/// <summary>
/// 用圖片替換指定書簽的內(nèi)容
/// </summary>
/// <param name="bookmarkName">書簽名</param>
/// <param name="picPath">圖片路徑</param>
/// <param name="widthScale">寬度縮放比例,0以上正整數(shù)</param>
/// <param name="heightScale">高度縮放比例,0以上正整數(shù)</param>
/// <param name="wrapStyle">環(huán)繞方式</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>
/// 用表格替換指定書簽的內(nèi)容
/// </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>
/// 創(chuàng)建表格并寫入數(shù)據(jù),返回Table對象
/// </summary>
/// <param name="rowsNum">行數(shù)</param>
/// <param name="columnsNum">列數(shù)</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);//設(shè)置行數(shù)和列數(shù)
//填充數(shù)據(jù)
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());
}
}
//設(shè)置列寬
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的內(nèi)容
string text = "XXX科技股份有限公司成立于2010年12月,是一家致力于高新技術(shù)產(chǎn)品研發(fā)、生產(chǎn)、銷售的高科技股份制企業(yè),"
+ "公司堅持以技術(shù)創(chuàng)新為核心,以知識產(chǎn)權(quán)為基礎(chǔ),以人才戰(zhàn)略為支撐,經(jīng)過多年的礪練與發(fā)展,公司已逐步成以創(chuàng)新為引導(dǎo)的,"
+ "產(chǎn)品具有競爭力,人才素質(zhì)優(yōu)良的新興科技企業(yè)。";
bookmark.ReplaceContent("bookmark_text", text, true);
//用圖片替換書簽bookmark_picture的內(nèi)容
string picPath = @"C:\Users\Administrator\Desktop\company_logo.jpg";
bookmark.ReplaceContent("bookmark_picture", picPath, 80f, 80f, TextWrappingStyle.TopAndBottom, ShapeHorizontalAlignment.Center);
//創(chuàng)建模擬數(shù)據(jù)
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", "男", "系統(tǒng)管理員" });
//創(chuàng)建表格,并填充數(shù)據(jù)
Table table = bookmark.CreateTable(dt.Rows.Count, dt.Columns.Count, 100f, RowAlignment.Left, dt);
//用表格替換書簽bookmark_table的內(nèi)容
bookmark.ReplaceContent("bookmark_table", table);
//生成Word文件
doc.SaveToFile("output.docx", FileFormat.Docx2013);
運行代碼,得到下面的結(jié)果:

圖6 生成的文件
注:
1. Spire.Doc本身也有Bookmark類,但僅用于添加書簽到文檔中,請注意本文中的Bookmark類是自定義的方便自己使用的方法的集合。
2. Spire.Doc 6.4.5 為商業(yè)版,在不應(yīng)用許可證的情況下,生成的文檔會有水印信息。筆者寫文章時已應(yīng)用臨時許可證(官方提供的用于測試軟件的License)。
3. 筆者使用免費版的Spire.Doc測試過,以上效果基本都能實現(xiàn),但圖片的環(huán)繞方式只能設(shè)置為“InLine”,且水平位置為靠右,設(shè)置其他環(huán)繞方式時,圖片位置會出錯。這應(yīng)該是免費版的Bug。
到此這篇關(guān)于C#替換Word文檔中的書簽內(nèi)容的詳細(xì)步驟的文章就介紹到這了,更多相關(guān)C#替換Word書簽內(nèi)容內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實體對象序列化成Json并讓字段的首字母小寫的兩種解決方法
這篇文章主要介紹了C#實體對象序列化成Json并讓字段的首字母小寫的兩種方法,在這兩種方法中小編比較推薦使用第二種方法,需要的朋友可以參考下2018-06-06
C#組件系列 你值得擁有的一款Excel處理神器Spire.XLS
又一款Excel處理神器Spire.XLS,這篇文章主要為大家詳細(xì)介紹了第三方組件Spire.XLS,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09

