您好,欢迎来到步遥情感网。
搜索
您的当前位置:首页利用Aspose.Word控件实现Word文档的操作

利用Aspose.Word控件实现Word文档的操作

来源:步遥情感网
利⽤Aspose.Word控件实现Word⽂档的操作

Aspose系列的控件,功能都挺好,之前⼀直在我的Winform开发框架中⽤Aspose.Cell来做报表输出,可以实现多样化的报表设计及输出,由于⼀般输出的内容⽐较正规化或者多数是表格居多,所以⼀般使⽤Aspose.Cell来实现我想要的各种Excel报表输出。虽然⼀直也知道Aspose.Word是⽤来⽣成Word⽂档的,⽽且深信其也是⼀个很强⼤的控件,但⼀直没⽤⽤到,所以就不是很熟悉。

偶然⼀次机会,⼀个项⽬的报表功能指定需要导出为Word⽂档,因此寻找了很多篇⽂章,不过多数介绍的⽐较简单⼀点,于是也参考了官⽅的帮助介绍,终于满⾜了客户的需求。下⾯我由浅⼊深来介绍这个控件在实际业务中的使⽤过程吧。

1、⼆维表格的Word操作

⽇常中,常见的内容输出就是⼆维表格的⽅式,表头⽐较固定,内容每⾏⼀条,那么在实际的使⽤控件我们该如何操作呢,其实这个控件这⽅⾯介绍的⽂章很多,参考⼀下就能做出来了。其实介绍这个就是要说明书签的重要性,这个在Aspose.Cell控件也是如此,书签除了可以⽤来替换内容,还可以⽤来标记内容输⼊的开始位置等等功能。

⾸先我们在⼀个空⽩的Word⽂档中绘制⼀个表格头,然后再换⾏的开始插⼊⼀个标签引⽤,插⼊书签有两种⽅式,⼀种是在Word(2007、2010)的【插⼊】-【书签】中插⼊制定位置的书签引⽤,如下所⽰。

⼀种是在Word的⾃定义快速访问⼯具栏上添加其他命令,如下步骤所⽰

前者插⼊的书签是没有⽂字或者特别的标记,但是确实存在,后者会插⼊⼀个灰⾊块作为占位符,如下所⽰,我这这个⼆维表格的例⼦⾥⾯使⽤后者进⾏测试(两者同等效果的)

这样设计好Word模板后,下⼀步就是如何利⽤代码⽣成⼆维表格了。⾸先这⾥提⽰⼀下,就是我故意设置了每个表格单元格的宽度不同,所以也就要求⽣成的⾏要和头部对应,所以表格⽣成每⾏之前,肯定要获得对应列的样式属性的,否则就会对应不上了。下⾯看代码。

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 widthList = new List(); 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 = \"\"; // 清掉标⽰

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)创建Aspose.Words.Document 和 Aspose.Words.DocumentBuilder对象,然后⽣成数据的⼆维表格内容。2)遍历模板表格,或者每⼀列的宽度,以备后⽤。

3)移动到表格的书签位置,然后开始录⼊数据,Word表格的每个Cell都要求制定样式和宽度,这样才能和表格头部吻合。4)保存⽂件内容到新的⽂件⾥⾯即可。输出的效果如下所⽰。

2、单元格合并的操作

常见的Word⽂件或者Excel⽂件中,都经常看到合并单元格的内容,因此这个部分也是⾮常常见的操作,必须掌握。我们先看⼀个例⼦代码及效果。

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; }

他的效果如下

关于合并单元格的介绍,你还可以参考下这篇官⽅介绍:

如果上⾯的例⼦还不够明⽩,OK,我在介绍⼀个实际的例⼦,来说明合并单元格的操作模式。实际⽂档⽣成如下所⽰:

⽂档的模板如下所⽰:

其实这个⾥⾯的“测试”内容是使⽤代码写⼊的,其实就是⼀⾏业务数据,⽤两⾏来展⽰,其中有些合并的单元格,这是⼀个实际项⽬的表格形式。我们注意到,每⾏有13个单元格,其中第⼀、第⼆、第⼗三列是合并列。和并列有⼀个特点,就是它的两个索引都有效,不过只是能使⽤第⼀个索引来对它进⾏操作复制,利⽤第⼆个没有⽤处的。

如第⼀个列是和并列,它应该有0、13这样的索引,第⼆列也是和并列,它也有1、14的索引,其他的类推。了解这样的逻辑关系后,我们看实际操作的代码如下所⽰。

try {

Aspose.Words.Document doc = new Aspose.Words.Document(templateFile);

Aspose.Words.DocumentBuilder builder = new Aspose.Words.DocumentBuilder(doc);

List widthList = new List();

for (int i = 0; i < 13; i++) {

builder.MoveToCell(0, 2, i, 0); //移动单元格

double width = builder.CellFormat.Width;//获取单元格宽度 widthList.Add(width); }

builder.MoveToBookmark(\"table\"); //开始添加值

Table table = builder.StartTable();

builder.RowFormat.HeadingFormat = true;

builder.ParagraphFormat.Alignment = ParagraphAlignment.Center;

for (int j = 0; j < 26; j++) {

builder.InsertCell();// 添加⼀个单元格

builder.CellFormat.Borders.LineStyle = LineStyle.Single;

builder.CellFormat.Borders.Color = System.Drawing.Color.Black; int cellIndex = (j > 12) ? (j-13) : j; //位于第⼏个单元格 builder.CellFormat.Width = widthList[cellIndex];

builder.CellFormat.VerticalAlignment = CellVerticalAlignment.Center;//垂直居中对齐 builder.ParagraphFormat.Alignment = ParagraphAlignment.Center;//⽔平居中对齐 builder.CellFormat.VerticalMerge = Aspose.Words.Tables.CellMerge.None; if (cellIndex == 0 || cellIndex == 1 || cellIndex == 12) {

if (j > 12) {

builder.CellFormat.VerticalMerge = CellMerge.Previous; } else {

builder.CellFormat.VerticalMerge = CellMerge.First; } }

builder.Write(\"测试\" + j.ToString()); if (cellIndex == 12 ) {

builder.EndRow(); } }

builder.EndTable();

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; }

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- obuygou.com 版权所有 赣ICP备2024042798号-5

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务