- 相關(guān)推薦
有關(guān)使用 Aspose.Words for .NET來(lái)動(dòng)態(tài)的生成word文檔中的數據表
1、概述
最近項目中有一個(gè)這樣的需求:導出word文檔,要求這個(gè)文檔的格式不是固定的,用戶(hù)可以隨便的調整,導出內容中的數據表格列是動(dòng)態(tài)的,例如要求導出姓名和性別,你就要導出這兩列的數據,而且這個(gè)文檔不是導出來(lái)之后再調整而是導出來(lái)后已經(jīng)是調整過(guò)了的?吹竭@里,您也許馬上想到用模板導出!而且.NET中自帶有這個(gè)組件:Microsoft.Office.Interop.Word,暫且可以滿(mǎn)足需求吧。但這個(gè)組件也是有局限性的,例如客戶(hù)端必須裝office組件,而且編碼復雜度高。最麻煩的需求是后面那個(gè)----動(dòng)態(tài)的表格列頭!下面就介紹如何使用 Aspose.Words for .NET來(lái)動(dòng)態(tài)的生成word文檔中的數據表格。
2、正文
Aspose.Words, 是Aspose“家族類(lèi)庫”之一。除這個(gè)以外,還有其他許多厲害的類(lèi)庫例如Aspose.pdf(操作PDF文件的類(lèi)庫)、Aspose.Flash(操作 Flash文件的類(lèi)庫)、Aspose.report(操作報表的類(lèi)庫)等等,大家有興趣的可以上官方網(wǎng)研究下。這些類(lèi)庫都包含兩種語(yǔ)言,一種是java ,另一種是.NET.這里主要是介紹Aspose.Words for .NET。Aspose.Words for .NET功能非常強大,您不需要安裝office組件,都可以用這個(gè)來(lái)生成word文檔。Aspose.Words支持 DOC,DOCX,OOXML,RTF格式,HTML格式,OpenDocument格式,PDF格式,和其他格式 。從下面圖中,大家可以更加詳細的了解Aspose.Words的架構。有一點(diǎn)忘了提,這套類(lèi)庫是收費的,在本文后面我會(huì )提供一個(gè)破解版的下載地址給大家的。
在介紹如何動(dòng)態(tài)的生成的表格之前,我們看看這個(gè)類(lèi)庫是如何根據模板來(lái)生成值的:
首先,我們來(lái)建立一個(gè) word模板:template.doc 。在文檔中需要生成的數據地方建立一個(gè)書(shū)簽,如圖:
在這里大家可以看到,我們主要是通過(guò)BookMark來(lái)操作,做為動(dòng)態(tài)的數據的源。
下面我們來(lái)看看具體是怎么實(shí)現的:
復制代碼 代碼如下:
string tmppath = Server.MapPath("~/template.doc");
Document doc = new Document(tmppath); //載入模板
if (doc.Range.Bookmarks["name"] != null)
{
Bookmark mark = doc.Range.Bookmarks["name"];
mark.Text = "張三公司";
}
doc.Save("demo.doc", SaveFormat.Doc, SaveType.OpenInWord, Response); //保存為doc,并打開(kāi)
是不是很簡(jiǎn)單?好了,下面我們來(lái)看看文章開(kāi)頭所講的如何動(dòng)態(tài)生成word表格。
Aspose.Words對word文檔對象中的操作。在生成表格上有點(diǎn)類(lèi)似二維數組。還記得需求說(shuō)的“表格列數由用戶(hù)控制嗎”,所以我們要在模板上定義一個(gè)含有表頭的表格,這里要畫(huà)出您數據表中可以顯示的所有列頭,這樣做主要是考慮到用戶(hù)可以自己去減少不需要顯示列頭。這里要注意,書(shū)簽和列頭文字的順序不能顛倒,大家看下面代碼就知道了。如下圖:
灰色的部分就是bookmark了。Aspose.Words生成表格的原理就如同一個(gè)二維數組,也就是一個(gè)個(gè)單元格的去生成。我們來(lái)看看代碼部分是如何實(shí)現的:
復制代碼 代碼如下:
DocumentBuilder builder = new DocumentBuilder(doc);
DataTable products = this.GetData(); //數據源
int count = 0;
//記錄要顯示多少列
for (var i = 0; i < products.Columns.Count; i++)
{
if (doc.Range.Bookmarks[products.Columns[i].ColumnName.Trim()] != null)
{
Bookmark mark = doc.Range.Bookmarks[products.Columns[i].ColumnName.Trim()];
mark.Text = "";
count++;
}
}
System.Collections.Generic.Listlistcolumn = new System.Collections.Generic.List(count);
for (var i = 0; i < count; i++)
{
builder.MoveToCell(0, 0, i, 0); //移動(dòng)單元格
if (builder.CurrentNode.NodeType == NodeType.BookmarkStart)
{
listcolumn.Add((builder.CurrentNode as BookmarkStart).Name);
}
}
double width = builder.CellFormat.Width;//獲取單元格寬度
builder.MoveToBookmark("table"); //開(kāi)始添加值
for (var m = 0; m < products.Rows.Count; m++)
{
for (var i = 0; i < listcolumn.Count; i++)
{
builder.InsertCell(); // 添加一個(gè)單元格
builder.CellFormat.Borders.LineStyle = LineStyle.Single;
builder.CellFormat.Borders.Color = System.Drawing.Color.Black;
builder.CellFormat.Width = width;
builder.CellFormat.VerticalMerge = Aspose.Words.Tables.CellMerge.None;
builder.Write(products.Rows[m][listcolumn[i]].ToString());
}
builder.EndRow();
}
doc.Range.Bookmarks["table"].Text = ""; // 清掉標示
doc.Save("baojiadan.doc", SaveFormat.Doc, SaveType.OpenInWord, page.Response);
我們來(lái)看看最后生成的效果:
到這里我們這一部分的功能就已經(jīng)全部完成了。
也許這種方法并不是最好,如果朋友們有興趣不妨研究研究,大家一起交流下。
【使用 Aspose.Words for .NET來(lái)動(dòng)態(tài)的生成word文檔】相關(guān)文章:
如何給word文檔加密08-02
word文檔怎么打不開(kāi)08-21
word文檔格式排版要求11-17
編輯Word文檔說(shuō)課稿范文06-29
word頁(yè)碼生成技巧02-20
Word文檔內容的選取技巧09-23
cad圖紙轉到word文檔10-01
word文檔頁(yè)碼怎么設置10-07
詳解word文檔另類(lèi)技巧08-24
word文檔要怎么設置頁(yè)碼06-15