利用Aspose.Word控件實(shí)現(xiàn)Word文檔的操作
偶然一次機(jī)會,一個項(xiàng)目的報表功能指定需要導(dǎo)出為Word文檔,因此尋找了很多篇文章,不過多數(shù)介紹的比較簡單一點(diǎn),于是也參考了官方的幫助介紹,終于滿足了客戶的需求。下面我由淺入深來介紹這個控件在實(shí)際業(yè)務(wù)中的使用過程吧。
1、二維表格的Word操作
日常中,常見的內(nèi)容輸出就是二維表格的方式,表頭比較固定,內(nèi)容每行一條,那么在實(shí)際的使用控件我們該如何操作呢,其實(shí)這個控件這方面介紹的文章很多,參考一下就能做出來了。其實(shí)介紹這個就是要說明書簽的重要性,這個在Aspose.Cell控件也是如此,書簽除了可以用來替換內(nèi)容,還可以用來標(biāo)記內(nèi)容輸入的開始位置等等功能。
首先我們在一個空白的Word文檔中繪制一個表格頭,然后再換行的開始插入一個標(biāo)簽引用,插入書簽有兩種方式,一種是在Word(2007、2010)的【插入】-【書簽】中插入制定位置的書簽引用,如下所示。

一種是在Word的自定義快速訪問工具欄上添加其他命令,如下步驟所示

前者插入的書簽是沒有文字或者特別的標(biāo)記,但是確實(shí)存在,后者會插入一個灰色塊作為占位符,如下所示,我這這個二維表格的例子里面使用后者進(jìn)行測試(兩者同等效果的)

這樣設(shè)計好Word模板后,下一步就是如何利用代碼生成二維表格了。首先這里提示一下,就是我故意設(shè)置了每個表格單元格的寬度不同,所以也就要求生成的行要和頭部對應(yīng),所以表格生成每行之前,肯定要獲得對應(yīng)列的樣式屬性的,否則就會對應(yīng)不上了。下面看代碼。
try
{
Aspose.Words.Document doc = new Aspose.Words.Document(templateFile);
Aspose.Words.DocumentBuilder builder = new Aspose.Words.DocumentBuilder(doc);
DataTable nameList = DataTableHelper.CreateTable("編號,姓名,時間");
DataRow row = null;
for (int i = 0; i < 50; i++)
{
row = nameList.NewRow();
row["編號"] = i.ToString().PadLeft(4, '0');
row["姓名"] = "伍華聰 " + i.ToString();
row["時間"] = DateTime.Now.ToString();
nameList.Rows.Add(row);
}
List<double> widthList = new List<double>();
for (int i = 0; i < nameList.Columns.Count; i++)
{
builder.MoveToCell(0, 0, i, 0); //移動單元格
double width = builder.CellFormat.Width;//獲取單元格寬度
widthList.Add(width);
}
builder.MoveToBookmark("table"); //開始添加值
for (var i = 0; i < nameList.Rows.Count; i++)
{
for (var j = 0; j < nameList.Columns.Count; j++)
{
builder.InsertCell();// 添加一個單元格
builder.CellFormat.Borders.LineStyle = LineStyle.Single;
builder.CellFormat.Borders.Color = System.Drawing.Color.Black;
builder.CellFormat.Width = widthList[j];
builder.CellFormat.VerticalMerge = Aspose.Words.Tables.CellMerge.None;
builder.CellFormat.VerticalAlignment = CellVerticalAlignment.Center;//垂直居中對齊
builder.ParagraphFormat.Alignment = ParagraphAlignment.Center;//水平居中對齊
builder.Write(nameList.Rows[i][j].ToString());
}
builder.EndRow();
}
doc.Range.Bookmarks["table"].Text = ""; // 清掉標(biāo)示
doc.Save(saveDocFile);
if (MessageUtil.ShowYesNoAndTips("保存成功,是否打開文件?") == System.Windows.Forms.DialogResult.Yes)
{
System.Diagnostics.Process.Start(saveDocFile);
}
}
catch (Exception ex)
{
LogHelper.Error(ex);
MessageUtil.ShowError(ex.Message);
return;
}
以上代碼的步驟就是
1)創(chuàng)建Aspose.Words.Document 和 Aspose.Words.DocumentBuilder對象,然后生成數(shù)據(jù)的二維表格內(nèi)容。
2)遍歷模板表格,或者每一列的寬度,以備后用。
3)移動到表格的書簽位置,然后開始錄入數(shù)據(jù),Word表格的每個Cell都要求制定樣式和寬度,這樣才能和表格頭部吻合。
4)保存文件內(nèi)容到新的文件里面即可。
輸出的效果如下所示。

2、單元格合并的操作
常見的Word文件或者Excel文件中,都經(jīng)??吹胶喜卧竦膬?nèi)容,因此這個部分也是非常常見的操作,必須掌握。
我們先看一個例子代碼及效果。
try
{
Aspose.Words.Document doc = new Aspose.Words.Document(templateFile);
Aspose.Words.DocumentBuilder builder = new Aspose.Words.DocumentBuilder(doc);
builder.InsertCell();
builder.CellFormat.Borders.LineStyle = LineStyle.Single;
builder.CellFormat.Borders.Color = System.Drawing.Color.Black;
builder.CellFormat.VerticalMerge = CellMerge.First;
builder.Write("Text in merged cells.");
builder.InsertCell();
builder.CellFormat.Borders.LineStyle = LineStyle.Single;
builder.CellFormat.Borders.Color = System.Drawing.Color.Black;
builder.CellFormat.VerticalMerge = CellMerge.None;
builder.Write("Text in one cell");
builder.EndRow();
builder.InsertCell();
builder.CellFormat.Borders.LineStyle = LineStyle.Single;
builder.CellFormat.Borders.Color = System.Drawing.Color.Black;
// This cell is vertically merged to the cell above and should be empty.
builder.CellFormat.VerticalMerge = CellMerge.Previous;
builder.InsertCell();
builder.CellFormat.Borders.LineStyle = LineStyle.Single;
builder.CellFormat.Borders.Color = System.Drawing.Color.Black;
builder.CellFormat.VerticalMerge = CellMerge.None;
builder.Write("Text in another cell");
builder.EndRow();
doc.Save(saveDocFile);
if (MessageUtil.ShowYesNoAndTips("保存成功,是否打開文件?") == System.Windows.Forms.DialogResult.Yes)
{
System.Diagnostics.Process.Start(saveDocFile);
}
}
catch (Exception ex)
{
LogHelper.Error(ex);
MessageUtil.ShowError(ex.Message);
return;
}
他的效果如下

關(guān)于合并單元格的介紹,你還可以參考下這篇官方介紹:http://www.aspose.com/docs/display/wordsnet/Working+with+Merged+Cells
如果上面的例子還不夠明白,OK,我在介紹一個實(shí)際的例子,來說明合并單元格的操作模式。
實(shí)際文檔生成如下所示:

文檔的模板如下所示:

其實(shí)這個里面的“測試”內(nèi)容是使用代碼寫入的,其實(shí)就是一行業(yè)務(wù)數(shù)據(jù),用兩行來展示,其中有些合并的單元格,這是一個實(shí)際項(xiàng)目的表格形式。我們注意到,每行有13個單元格,其中第一、第二、第十三列是合并列。和并列有一個特點(diǎn),就是它的兩個索引都有效,不過只是能使用第一個索引來對它進(jìn)行操作復(fù)制,利用第二個沒有用處的。
如第一個列是和并列,它應(yīng)該有0、13這樣的索引,第二列也是和并列,它也有1、14的索引,其他的類推。
了解這樣的邏輯關(guān)系后,我們看實(shí)際操作的代碼如下所示。
撰寫人:伍華聰
- asp.net下用Aspose.Words for .NET動態(tài)生成word文檔中的數(shù)據(jù)表格的方法
- asp.net下用Aspose.Words for .NET動態(tài)生成word文檔中的圖片或水印的方法
- 解決用Aspose.Words,在word文檔中創(chuàng)建表格的實(shí)現(xiàn)方法
- .net使用Aspose.Words進(jìn)行Word替換操作的實(shí)現(xiàn)代碼
- C# 利用Aspose.Words.dll將 Word 轉(zhuǎn)成PDF
- 使用Aspose.Cells組件生成Excel文件實(shí)例
- 使用aspose.word 第三方的插件實(shí)現(xiàn)導(dǎo)出word
- C#使用Aspose.Cells控件讀取Excel
相關(guān)文章
C#開發(fā)WinForm項(xiàng)目實(shí)現(xiàn)HTML編輯器
這篇文章介紹了C#開發(fā)WinForm項(xiàng)目實(shí)現(xiàn)HTML編輯器的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06
C#實(shí)現(xiàn)計算一個點(diǎn)圍繞另一個點(diǎn)旋轉(zhuǎn)指定弧度后坐標(biāo)值的方法
這篇文章主要介紹了C#實(shí)現(xiàn)計算一個點(diǎn)圍繞另一個點(diǎn)旋轉(zhuǎn)指定弧度后坐標(biāo)值的方法,涉及C#針對坐標(biāo)的數(shù)學(xué)運(yùn)算相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08
C#實(shí)現(xiàn)一個簡單實(shí)用的TXT文本操作及日志框架詳解
這篇文章主要給大家介紹了關(guān)于利用C#如何實(shí)現(xiàn)一個簡單實(shí)用的TXT文本操作及日志框架的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們一起來看看吧2018-07-07
C#實(shí)現(xiàn)XML與實(shí)體類之間相互轉(zhuǎn)換的方法(序列化與反序列化)
這篇文章主要介紹了C#實(shí)現(xiàn)XML與實(shí)體類之間相互轉(zhuǎn)換的方法,涉及C#序列化與反序列化操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2016-06-06
淺談C#下winform和JS的互相調(diào)用和傳參(webbrowser)
下面小編就為大家?guī)硪黄獪\談C#下winform和JS的互相調(diào)用和傳參(webbrowser)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12
C#中如何將MongoDB->RunCommand結(jié)果映射到業(yè)務(wù)類的方法總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于C#中如何將MongoDB->RunCommand結(jié)果映射到業(yè)務(wù)類的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2018-04-04

