當前位置:才華齋>計算機>office辦公>

有關使用 Aspose.Words for .NET來動態的生成word文件中的資料表

office辦公 閱讀(2.04W)

1、概述

有關使用 Aspose.Words for .NET來動態的生成word文件中的資料表

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

2、正文

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

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

首先,我們來建立一個 word模板: 。在文件中需要生成的資料地方建立一個書籤,如圖:

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

下面我們來看看具體是怎麼實現的:

複製程式碼 程式碼如下:

string tmppath = Server.MapPath("~/");

Document doc = new Document(tmppath); //載入模板

if (marks["name"] != null)

{

Bookmark mark = marks["name"];

= "張三公司";

}

("", , InWord, Response); //儲存為doc,並開啟

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

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

灰色的部分就是bookmark了。s生成表格的原理就如同一個二維陣列,也就是一個個單元格的去生成。我們來看看程式碼部分是如何實現的:

複製程式碼 程式碼如下:

DocumentBuilder builder = new DocumentBuilder(doc);

DataTable products = ata(); //資料來源

int count = 0;

//記錄要顯示多少列

for (var i = 0; i < t; i++)

{

if (marks[mns[i]()] != null)

{

Bookmark mark = marks[mns[i]()];

= "";

count++;

}

}

listcolumn = new (count);

for (var i = 0; i < count; i++)

{

ToCell(0, 0, i, 0); //移動單元格

if (Type == markStart)

{

((entNode as BookmarkStart));

}

}

double width = h;//獲取單元格寬度

ToBookmark("table"); //開始新增值

for (var m = 0; m < t; m++)

{

for (var i = 0; i < t; i++)

{

rtCell(); // 新增一個單元格

Style = le;

r = k;

h = width;

icalMerge = ;

e([m][listcolumn[i]]ring());

}

ow();

}

marks["table"] = ""; // 清掉標示

("", , InWord, onse);

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

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

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