在之前几篇文章中,介绍了关于Apsose.cell这个强大的Excel操作控件的使用,相关文章如下:

使用Aspose.Cell控件实现Excel高难度报表的生成(一)

使用Aspose.Cell控件实现Excel高难度报表的生成(二)

使用Aspose.Cell控件实现多个Excel文件的合并

这几篇文章,都对Apose.Cell这个控件生成各种Excel的方式进行了阐述,对直接把DataTable或者IList生成Excel的操作,对通过模板方式实现自定义报表的各种方式,以及多个文件的合并的方式进行了介绍。

本文继续介绍该控件进一步的使用,也主要介绍如何动态生成(不使用模板文件)各种单元格,以及图表的增加等功能,介绍生成的表格完全自定义,这个报表时一个典型的图文并茂的统计报表,它的最终样式如下所示。

这个报表,表格数据是动态生成,图形则是直接从窗体的图表控件(如ZedGraph图表控件)或者PictureBox控件中获取,写入Excel文档中的。

测试程序主界面如下所示。

和很多其他的Excel操作控件(NPOI、Myxls)一样吗,Apose.Cell也提供了WorkBook、WorkSheet、Range、Cell这些对象的包装,操作这些对象,基本上能够满足我们各种复杂的需求,给我们更加弹性化的操作。

1、 添加基本对象进行操作

            Workbook workbook = new Workbook();
Worksheet worksheet = workbook.Worksheets[0];

这几个对象是操作Excel必须的,如果需要设定生成的Excel打印预览的参数,进行一些属性设置,如下所示。

            Workbook workbook = new Workbook();
Worksheet worksheet = workbook.Worksheets[0]; worksheet.PageSetup.Orientation = PageOrientationType.Landscape;//横向打印
worksheet.PageSetup.Zoom = 100;//以100%的缩放模式打开
worksheet.PageSetup.PaperSize = PaperSizeType.PaperA4;

我们知道,由于该报表完全是手工生成,报表的标题,以及下面几行说明文字,也是需要生成的,操作其实就是把一些单元格合并为一个区域(Range),然后赋值,改变样式就可以了,如下所示的效果和代码

            Range range; Cell cell;
int colSpan = 4 + DeptNameList.Count * 2;
range = worksheet.Cells.CreateRange(0, 0, 1, colSpan);
range.Merge();
range.RowHeight = 20;
range.Style = CreateTitleStyle(workbook);
cell = range[0, 0];
cell.PutValue("患病情况统计"); range = worksheet.Cells.CreateRange(1, 0, 1, colSpan);
range.Merge();
range.RowHeight = 15;
cell = range[0, 0];
cell.PutValue("所选部别范围内,总计有1000名人员,查询统计结果如下:"); range = worksheet.Cells.CreateRange(2, 0, 1, colSpan);
range.Merge();
range.RowHeight = 15;
cell = range[0, 0];
cell.PutValue("自2007-1-1开始到现在,统计共有500人有患病史,累计900人次,患病情况如下表:");

2、生成报表头部表格

报表中最复杂的是表头的生成,因为它是不规则的表头,因此需要很细的操作Cell和Range对象,实现复杂表头(也是很常见的)的生成。

这个是慢工出细活,需要对Cell和Range熟悉使用,然后给他们分配不同的行列就可以生成一个标准如下的表头了。

            Style headStyle = CreateStyle(workbook, true);
Style normalStyle = CreateStyle(workbook, false);
int startRow = 4;
range = worksheet.Cells.CreateRange(startRow, 0, 2, 1);
range.Merge();
range.Style = headStyle;
cell = range[0, 0];
cell.PutValue("序号");
cell.Style = headStyle; range = worksheet.Cells.CreateRange(startRow, 1, 2, 1);
range.Merge();
range.Style = headStyle;
range.ColumnWidth = 40;
cell = range[0, 0];
cell.PutValue("疾病名称");
cell.Style = headStyle; int startCol = 2;
foreach (string deptName in DeptNameList)
{
range = worksheet.Cells.CreateRange(startRow, startCol, 1, 2);
range.Merge();
range.Style = headStyle;
cell = range[0, 0];
cell.PutValue(deptName); cell = worksheet.Cells[startRow + 1, startCol];
cell.PutValue("人次");
cell.Style = headStyle;
cell = worksheet.Cells[startRow + 1, startCol + 1];
cell.PutValue("百分比");
cell.Style = headStyle; startCol += 2;
} range = worksheet.Cells.CreateRange(startRow, startCol, 1, 2);
range.Merge();
range.Style = headStyle;
cell = range[0, 0];
cell.PutValue("合计"); cell = worksheet.Cells[startRow + 1, startCol];
cell.PutValue("人次");
cell.Style = headStyle;
cell = worksheet.Cells[startRow + 1, startCol + 1];
cell.PutValue("百分比");
cell.Style = headStyle;
#endregion

3、填入表格内容

这个不算复杂,只需要遍历然后生成内容到单元格即可。

            //写入数据到Excel
startRow = startRow + 2;
for (int i = 0; i < dt.Rows.Count; i++)
{
startCol = 0;
for (int j = 0; j < dt.Columns.Count; j++)
{
DataRow dr = dt.Rows[i];
cell = worksheet.Cells[startRow, startCol];
cell.PutValue(dr[j]);
cell.Style = normalStyle; startCol++;
}
startRow++;
}

4、插入图表及导出打开操作

这个Apose.Cell控件的WorkSheet提供了worksheet.Pictures.Add方法,可以添加图片的操作,不过图片是通过流方式写入,我们把图表的Image对象转换一下,创建一个内存流就可以了。如下所示。

            //写入图注
startRow += 1;//跳过1行
range = worksheet.Cells.CreateRange(startRow++, 0, 1, colSpan);
range.Merge();
range.RowHeight = 15;
cell = range[0, 0];
cell.PutValue("以柱状图展示如下:"); //插入图片到Excel里面
byte[] bytes = ImageHelper.ImageToBytes(this.pictureBox1.Image);
using (MemoryStream stream = new MemoryStream(bytes))
{
worksheet.Pictures.Add(startRow, 0, stream);
} //Save the excel file.
string saveFile = FileDialogHelper.SaveExcel("rangecells.xls", "C:\\");
if (!string.IsNullOrEmpty(saveFile))
{
workbook.Save(saveFile);
if (MessageUtil.ShowYesNoAndTips("保存成功,是否打开文件?") == System.Windows.Forms.DialogResult.Yes)
{
System.Diagnostics.Process.Start(saveFile);
}
}

至此,基于Apose.Cell的自定义报表的另外一种操作也全部实现了,为了实现这个简单的例子,以便在项目中使用,花了不少时间,不过以后对于生成这类复杂的和自定义报表,可以直接利用它们基础的对象进行操作即可;

如果是一些常规的报表,可以利用自定义模板的方式生成,然后绑定数据源;如果是二维表,或者ILIst集合,导出Excel就更简单了。以上两种都可以直接利用封装好的AsposeExcelTools来进行操作,这个通用的类库,可以省却每次去编写代码的繁琐,提高效率。

使用Aspose.Cell控件实现Excel高难度报表的生成(三)的更多相关文章

  1. 使用Aspose.Cell控件实现Excel高难度报表的生成(二)

    继续在上篇<使用Aspose.Cell控件实现Excel高难度报表的生成(一)>随笔基础上,研究探讨基于模板的Aspose.cell报表实现,其中提到了下面两种报表的界面,如下所示: 或者 ...

  2. 使用Aspose.Cell控件实现Excel高难度报表的生成

    1.使用Aspose.Cell控件实现Excel高难度报表的生成(一) http://www.cnblogs.com/wuhuacong/archive/2011/02/23/1962147.html ...

  3. 使用Aspose.Cell控件实现Excel高难度报表的生成(一)

    时光飞逝,生活.工作.业余研究总是在不停忙碌着,转眼快到月底,该月的博客文章任务未完,停顿回忆一下,总结一些经验以及好的东西出来,大家一起分享一下.本文章主要介绍报表的生成,基于Aspose.Cell ...

  4. (转)使用Aspose.Cell控件实现Excel高难度报表的生成(一)

    本文章主要介绍报表的生成,基于Aspose.Cell控件的报表生成.谈到报表,估计大家都有所领悟以及个人的理解,总的来说,一般的报表生成,基本上是基于以下几种方式:一种是基于微软Excel内置的引擎来 ...

  5. 利用Aspose.Cell控件导入Excel非强类型的数据

    导入Excel的操作是非常常见的操作,可以使用Aspose.Cell.APOI.MyXls.OLEDB.Excel VBA等操作Excel文件,从而实现数据的导入,在导入数据的时候,如果是强类型的数据 ...

  6. 利用Aspose.Word控件和Aspose.Cell控件,实现Word文档和Excel文档的模板化导出

    我们知道,一般都导出的Word文档或者Excel文档,基本上分为两类,一类是动态生成全部文档的内容方式,一种是基于固定模板化的内容输出,后者在很多场合用的比较多,这也是企业报表规范化的一个体现. 我的 ...

  7. 使用Aspose.Cell控件实现多个Excel文件的合并

    之前有写过多篇关于使用Apose.Cell控件制作自定义模板报表和通用的导出Excel表格数据的操作,对这个控件的功能还是比较满意,而且也比较便利.忽然有一天,一个朋友说:你已经有生成基于自定义模板报 ...

  8. 用Aspose.Cells控件读取Excel

    Aspose是一个很强大的控件,可以用来操作word,excel,ppt等文件,用这个控件来导入.导出数据非常方便.其中Aspose.Cells就是用来操作Excel的,功能有很多.我所用的是最基本的 ...

  9. 基于C#语言MVC框架Aspose.Cells控件导出Excel表数据

    控件bin文件下载地址:https://download.csdn.net/download/u012949335/10610726 @{ ViewBag.Title = "xx" ...

随机推荐

  1. Ruby Hash与ActiveSupport’s HashWithIndifferentAccess对于key的区别

    Ruby Hash的key定义的时候是支持symbol或者string的,所以访问的时候只能是symbol或者string其中一种方式. 建议使用symbol定义Hash的key,因为symbol在R ...

  2. winform学习2-datagridview数据绑定

    1.datagridview.clearSelection()清除默认的选中项 2.列数据显示,首先列必须是显示状态, 3.布局-单元格内文字内容居中显示,示例:外观-defaultCellStyle ...

  3. 使用递归方法实现,向FTP服务器上传整个目录结构、从FTP服务器下载整个目录到本地的功能

    我最近由于在做一个关于FTP文件上传和下载的功能时候,发现Apache FTP jar包没有提供对整个目录结构的上传和下载功能,只能非目录类型的文件进行上传和下载操作,后来我查阅很多网上的实现方法,再 ...

  4. PHP5 session 详解【经典】 -- 转帖

    PHP5 session 详解[经典] http协议是WEB服务器与客户端(浏览器)相互通信的协议,它是一种无状态协议.所谓无状态,指的是不会维护http请求数据,http请求是独立的,非持久的.而越 ...

  5. Html - Footer

    通用的Footer代码片段 <style> #footer { padding: 20px; text-align: center; background-color: #666; bor ...

  6. 配置Log4j(很详细)

    Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息.通过配置,可以创建出Log4J的运行环境 ...

  7. linphone3.4.0代码分析

    主要类型定义: 1.LinphoneCoreVTable /** * This structure holds all callbacks that the application should im ...

  8. PHP file_get_contents函数读取远程数据超时的解决方法

    PHP file_get_contents函数读取远程数据超时的解决方法 投稿:junjie 字体:[增加 减小] 类型:转载   这篇文章主要介绍了PHP file_get_contents函数读取 ...

  9. ExtJS笔记2 Class System

    For the first time in its history, Ext JS went through a huge refactoring from the ground up with th ...

  10. Bootstrap页面布局4 - 嵌套布局

    嵌套布局: 在一行中,有三列,每一列都有对应的BS栅格系统中的格子,以下例中因为 .row中的div对应的class分别是span4,span4,span4,所以其每一列对应的格子数是 4,4,4 现 ...