asp.net下用Aspose.Words for .NET動態產生word文檔中的資料表格的方法

來源:互聯網
上載者:User

1、概述

  最近項目中有一個這樣的需求:匯出word 文檔,要求這個文檔的格式不是固定的,使用者可以隨便的調整,匯出內容中的資料表格列是動態,例如要求匯出姓名和性別,你就要匯出這兩列的資料,而且這個文檔不是匯出來之後再調整而是匯出來後已經是調整過了的。看到這裡,您也許馬上想到用模板匯出!而且.NET中內建有這個組件:Microsoft.Office.Interop.Word,暫且可以滿足需求吧。但這個組件也是有局限性的,例如用戶端必須裝 office組件,而且編碼複雜度高。最麻煩的需求是後面那個----動態表格列頭!下面就介紹如何使用 Aspose.Words for .NET來動態產生word文檔中的資料表格。

2、本文

Aspose.Words, 是Aspose“家族類庫”之一。除這個以外,還有其他許多厲害的類庫例如Aspose.pdf(操作PDF檔案的類庫)、Aspose.Flash(操作 Flash檔案的類庫)、Aspose.report(操作報表的類庫)等等,大家有興趣的可以上官方網研究下。這些類庫都包含兩種語言,一種是java ,另一種是.NET.這裡主要是介紹Aspose.Words for .NET。Aspose.Words for .NET功能非常強大,您不需要安裝office組件,都可以用這個來產生word文檔。Aspose.Words支援 DOC,DOCX,OOXML,RTF格式,HTML格式,OpenDocument格式,PDF格式,和其他格式 。從下面圖中,大家可以更加詳細的瞭解Aspose.Words的架構。有一點忘了提,這套類庫是收費的,在本文後面我會提供一個破解版的給大家的。

在介紹如何動態產生的表格之前,我們看看這個類庫是如何根據模板來產生值的:

首先,我們來建立一個 word模板:template.doc 。在文檔中需要產生的資料地方建立一個書籤,:

在這裡大家可以看到,我們主要是通過BookMark來操作,做為動態資料的源。

下面我們來看看具體是怎麼實現的: 複製代碼 代碼如下: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,並開啟

是不是很簡單?好了,下面我們來看看文章開頭所講的如何動態產生word表格。

Aspose.Words對word文檔對象中的操作。在產生表格上有點類似二維數組。還記得需求說的“表格列數由使用者控制嗎”,所以我們要在模板上定義一個含有表頭的表格,這裡要畫出您資料表中可以顯示的所有列頭,這樣做主要是考慮到使用者可以自己去減少不需要顯示列頭。這裡要注意,書籤和列頭文字的順序不能顛倒,大家看下面代碼就知道了。如:

灰色的部分就是bookmark了。Aspose.Words產生表格的原理就如同一個二維數組,也就是一個個儲存格的去產生。我們來看看代碼部分是如何?的: 複製代碼 代碼如下: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.List<string> listcolumn = new System.Collections.Generic.List<string>(count);
for (var i = 0; i < count; i++)
{
builder.MoveToCell(0, 0, i, 0); //移動儲存格
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(); // 添加一個儲存格
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);

我們來看看最後產生的效果:

到這裡我們這一部分的功能就已經全部完成了。

也許這種方法並不是最好,如果朋友們有興趣不妨研究研究,大家一起交流下。

附:Aspose.Words for NET 6.5 破解版

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.