万能报表之数据篇
对于上篇中提到的报表我们以如下的事例,来说明如何做:报表事例图:
模板图:
来源数据图:(即为上图中Data2中的数据)
生成报表图:
现在相信大家己经看出来了,我的报表是在Excel中完成的,我们的报表在项目中都是借助excel来实现的,将生成的报表传到我们的MOSS上 Excel服务器上供用户查看以用下载。借助于excel中的透视表来做,基本上能够满足各种需求。当然对于特别特别复杂的我们可以自己定义想要的模板。完成如上图的报表我们要做的准备工作如下:
报表的数据来源:
根据我们报表的展示需求,我们先来确定下呈现报表所需要的数据,写好数据的返回格式,以便于写存储过程从项目中提取我们所需要的数据。如我们现在要生成如上图的报表,通过分析发现,我们需要如源数据图中的这些数据,到此数据的需求格式我们就定下来了。
报表的模板:
根据上面我们分析需要的数据,我们来制作报表的模板。在此我特别说明一下,模板是透视表,是根据上图中的Data2字段来生成的。对Excel透视表不清楚的,在此我一两句也说不清,网上有很多教程,可以去先学习下。再来做模板,及数据返回需求的格式分析就会不感到吃力。
数据写入到Excel:
怎么把数据写到Excel的Data2中是我们这次报表生成的关键。要想把数据写到Excel中我们要借助于一个微软开源的程序: OpenXML。
下面我们来看一下OpenXML是什么,其实OpenXML并不是一种新技术,它早在2006年就出来了,只是在网上介绍它利用它来操作Excel的说明文章和示例太少了,也就很少有人去应用它了。OpenXML(OOXML)是微软在Office 2007中提出的一种新的文档格式,Office 2007中的Word、Excel、PowerPoint默认均采用OpenXML格式 。OpenXML在2006年12月成为了ECMA规范的一部分。至于它的其它介绍,大家到网上查看吧,它的功能是非常强大的。我们今天主要用它来操作Excel。
在介绍如何做之前,我们先做好准备工作:
第一、 报表的模板:我们已经在上面做好了。
第二、 下载OpenXMLSDKv2.msi,(下载地址:http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=5124)安装一下OpenXMLSDKv2.msi,在项目中引用 DocumentFormat.OpenXml.dll 和WindowsBase.dll
准备工作做完了,现在看看如何把我们查询出的数据写到Excel中,生成报表吧。
代码如下:
1 public byte[] WriteToExcel( CarryResource CarryResource, string ModelUrl)
2
3 { using (MemoryStream stream = SpreadsheetReader.StreamFromFile(ModelUrl))// ModelUrl为报表模板的位置
4
5 {
6
7
8
9 DataSet ds = GetData(CarryResource); //生成报表所需要的结果集
10
11 SpreadsheetDocument doc = SpreadsheetDocument.Open(stream, true);
12
13 WorksheetPart worksheetPart = SpreadsheetReader.GetWorksheetPartByName(doc, "Data2");//读取工作表Data2
14
15 WorksheetWriter writer = new WorksheetWriter(doc, worksheetPart);
16
17 writer.PasteDataTable(ds.Tables[0], "A2");//将查询出的结果集中的我们所要的表数据写入到工作表Data2中的指定位置
18
19 SpreadsheetWriter.Save(doc); //保存工作表
20
21 return stream.ToArray();
22
23 }
24
25 }
现在我们报表是以流的形式存在于内存中,在我的项目中,我是把流上传到MOSS上的Excel server服务器供用户查看及下载。在此我们可以把流下载到本地看一下效果。
1 byte[] bytes = WriteToExcel( CarryResource CarryResource, string ModelUrl)//这两个参数,我就不写值了。
2
3 Response.ContentType = "application/octet-stream";
4
5 Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(DateTime.Now.ToShortDateString() + ".xlsx", System.Text.Encoding.UTF8));
6
7 Response.BinaryWrite(bytes);
8
9 Response.Flush();
10
11 Response.End();
下载后打开就可以看到如下的报表了:
至此,我们的报表就生成好了,其实,OpenXMl还有很多种其它的用法,方法也有很多种,我这里只是一种最简单,也是最有效的用法。起到一个抛砖引玉的作用。希望大家深深挖掘它,和大家来一起分享。最后一篇《万能报表之图片篇》最晚我也将会在这个星期天写出来,分享给大家。大家有什么不明白的地方可以留言一起讨论,进行编辑完善。