asp.net下用Aspose.Words for .NET動(dòng)態(tài)生成word文檔中的數(shù)據(jù)表格的方法
1、概述
最近項(xiàng)目中有一個(gè)這樣的需求:導(dǎo)出word 文檔,要求這個(gè)文檔的格式不是固定的,用戶可以隨便的調(diào)整,導(dǎo)出內(nèi)容中的數(shù)據(jù)表格列是動(dòng)態(tài)的,例如要求導(dǎo)出姓名和性別,你就要導(dǎo)出這兩列的數(shù)據(jù),而且這個(gè)文檔不是導(dǎo)出來之后再調(diào)整而是導(dǎo)出來后已經(jīng)是調(diào)整過了的。看到這里,您也許馬上想到用模板導(dǎo)出!而且.NET中自帶有這個(gè)組件:Microsoft.Office.Interop.Word,暫且可以滿足需求吧。但這個(gè)組件也是有局限性的,例如客戶端必須裝 office組件,而且編碼復(fù)雜度高。最麻煩的需求是后面那個(gè)----動(dòng)態(tài)的表格列頭!下面就介紹如何使用 Aspose.Words for .NET來動(dòng)態(tài)的生成word文檔中的數(shù)據(jù)表格。
2、正文
Aspose.Words, 是Aspose“家族類庫(kù)”之一。除這個(gè)以外,還有其他許多厲害的類庫(kù)例如Aspose.pdf(操作PDF文件的類庫(kù))、Aspose.Flash(操作 Flash文件的類庫(kù))、Aspose.report(操作報(bào)表的類庫(kù))等等,大家有興趣的可以上官方網(wǎng)研究下。這些類庫(kù)都包含兩種語言,一種是java ,另一種是.NET.這里主要是介紹Aspose.Words for .NET。Aspose.Words for .NET功能非常強(qiáng)大,您不需要安裝office組件,都可以用這個(gè)來生成word文檔。Aspose.Words支持 DOC,DOCX,OOXML,RTF格式,HTML格式,OpenDocument格式,PDF格式,和其他格式 。從下面圖中,大家可以更加詳細(xì)的了解Aspose.Words的架構(gòu)。有一點(diǎn)忘了提,這套類庫(kù)是收費(fèi)的,在本文后面我會(huì)提供一個(gè)破解版的下載地址給大家的。
在介紹如何動(dòng)態(tài)的生成的表格之前,我們看看這個(gè)類庫(kù)是如何根據(jù)模板來生成值的:
首先,我們來建立一個(gè) word模板:template.doc 。在文檔中需要生成的數(shù)據(jù)地方建立一個(gè)書簽,如圖:
在這里大家可以看到,我們主要是通過BookMark來操作,做為動(dòng)態(tài)的數(shù)據(jù)的源。
下面我們來看看具體是怎么實(shí)現(xiàn)的:
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,并打開
是不是很簡(jiǎn)單?好了,下面我們來看看文章開頭所講的如何動(dòng)態(tài)生成word表格。
Aspose.Words對(duì)word文檔對(duì)象中的操作。在生成表格上有點(diǎn)類似二維數(shù)組。還記得需求說的“表格列數(shù)由用戶控制嗎”,所以我們要在模板上定義一個(gè)含有表頭的表格,這里要畫出您數(shù)據(jù)表中可以顯示的所有列頭,這樣做主要是考慮到用戶可以自己去減少不需要顯示列頭。這里要注意,書簽和列頭文字的順序不能顛倒,大家看下面代碼就知道了。如下圖:
灰色的部分就是bookmark了。Aspose.Words生成表格的原理就如同一個(gè)二維數(shù)組,也就是一個(gè)個(gè)單元格的去生成。我們來看看代碼部分是如何實(shí)現(xiàn)的:
DocumentBuilder builder = new DocumentBuilder(doc);
DataTable products = this.GetData(); //數(shù)據(jù)源
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.List<string> listcolumn = new System.Collections.Generic.List<string>(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"); //開始添加值
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 = ""; // 清掉標(biāo)示
doc.Save("baojiadan.doc", SaveFormat.Doc, SaveType.OpenInWord, page.Response);
我們來看看最后生成的效果:
到這里我們這一部分的功能就已經(jīng)全部完成了。
也許這種方法并不是最好,如果朋友們有興趣不妨研究研究,大家一起交流下。
附:Aspose.Words for NET 6.5 破解版下載地址
- ASP.NET對(duì)txt文件相關(guān)操作(讀取、寫入、保存)
- asp.net下將圖片保存到XML文件的方法
- asp.net 下載文件時(shí)根據(jù)MIME類型自動(dòng)判斷保存文件的擴(kuò)展名
- Asp.net 文件上傳類(取得文件后綴名,保存文件,加入文字水印)
- ASP.NET實(shí)現(xiàn)word文檔在線預(yù)覽功能代碼
- asp.net中Word轉(zhuǎn)Html的辦法(不需要WORD組件)
- asp.net 在線編輯word文檔 可保存到服務(wù)器
- ASP.NET實(shí)現(xiàn)將word文檔轉(zhuǎn)換成pdf的方法
- asp.net 按指定模板導(dǎo)出word,pdf實(shí)例代碼
- ASP.NET保存PDF、Word和Excel文件到數(shù)據(jù)庫(kù)
相關(guān)文章
ASP.NET 恢復(fù)備份Sqlserver實(shí)現(xiàn)代碼
在線恢復(fù)和備份SQL Server的代碼,需要的朋友可以參考下。2010-04-04.Net Core 多文件打包壓縮的實(shí)現(xiàn)代碼
最近項(xiàng)目需要實(shí)現(xiàn)多文件打包的功能,本文就詳細(xì)的介紹了.Net Core 多文件打包壓縮的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12ASP.NET Core Api網(wǎng)關(guān)Ocelot的使用初探
這篇文章主要介紹了ASP.NET Core Api網(wǎng)關(guān)Ocelot的使用初探,幫助大家更好的理解和學(xué)習(xí)使用.NET技術(shù),感興趣的朋友可以了解下2021-03-03ASP.NET DataTable去掉重復(fù)行的2種方法
這篇文章主要介紹了ASP.NET DataTable去掉重復(fù)行的2種方法,本文直接給出去重代碼,需要的朋友可以參考下2015-02-02.net開發(fā)微信公眾平臺(tái)實(shí)例教程
這篇文章主要介紹了.net開發(fā)微信公眾平臺(tái)的方法,對(duì)微信公眾平臺(tái)開發(fā)的原理與相應(yīng)的.net實(shí)現(xiàn)方法都做了較為詳細(xì)的講述,非常實(shí)用,需要的朋友可以參考下2014-10-10ASP.NET Core自定義中間件如何讀取Request.Body與Response.Body的內(nèi)容詳解
這篇文章主要給大家介紹了關(guān)于在ASP.NET Core自定義中間件中如何讀取Request.Body與Response.Body的內(nèi)容,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用ASP.NET Core具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05.Net Core實(shí)現(xiàn)選擇數(shù)據(jù)熱更新讓服務(wù)感知配置的變化
這篇文章主要介紹了.Net Core實(shí)現(xiàn)選擇數(shù)據(jù)熱更新讓服務(wù)感知配置的變化,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03使用HttpClient消費(fèi)ASP.NET Web API服務(wù)案例
這篇文章介紹了使用HttpClient消費(fèi)ASP.NET Web API服務(wù)的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10