The Last Day Of Summer

.NET技术 C# ASP.net ActiveReport SICP 代码生成 报表应用 RDLC
posts - 305, comments - 1896, trackbacks - 68, articles - 3
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

在报表应用中,pdf是使用非常普遍的文件格式,几乎在所有的报表开发工具中都提供了对pdf的支持。.NET世界里,报表开发工具几乎清一色都是商业的:水晶报表,ActiveReportReporting Service等,开源工具实在是凤毛麟角。

 

之所以会想到用iTextSharp来开发报表是基于对ActiveReport的分析。用过ActiveReport的人肯定都知道,ActiveReport的报表文件分为两个,一个是.rpx文件,是定义报表的页面布局的,实际上就是一个xml,还有一个是同名的代码文件,用来编写操作报表的代码,包括数据绑定,页面设置等等。同时,ActiveReport提供将报表导出成pdf格式的方法。我反编译ActiveReport中和pdf相关的程序集,都已经被混淆过了,没办法,好在有iTextSharp

 

iTextSharpjava下的iText移植而来,用来开发pdf应用,我们可以用它来对数据集生成表格,保存成pdf文件,然后将它打开来进行预览,下面是一个小例子。

 

例子用的表名为“Users”,有三个字段:UserIDUserNameAddress,随便象其中初始化几条数据。下面是C#的代码,加载数据部分的就略去了,生成的报表显示有一个表头“UserList”,接下来有一个日期,再下来是一个有三列的表格,分别显示UserIDUserNameAddress。生成pdf后再打开进行浏览。

 

Document document = new Document(PageSize.A4, 20, 20, 20, 20);             

PdfWriter.GetInstance(document, new FileStream("sample.pdf", FileMode.Create));

document.Open();

Table datatable = new Table(3);

datatable.Padding = 4;

datatable.Spacing = 0;             

float[] headerwidths = { 10, 24,24};

datatable.Widths = headerwidths;

datatable.WidthPercentage = 100;

Paragraph g =new Paragraph("User List");

g.Alignment = iTextSharp.text.Rectangle.ALIGN_CENTER;

document.Add(g);

string s = System.DateTime.Now.ToShortDateString();

Paragraph g1 = new Paragraph(s);

g1.Alignment = iTextSharp.text.Rectangle.ALIGN_RIGHT;

g1.Font.Size = 8;

document.Add(g1);

datatable.DefaultCellBorderWidth = 1;

datatable.DefaultHorizontalAlignment = 1;

datatable.DefaultRowspan = 1;

iTextSharp.text.Font f = FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.BOLD);

iTextSharp.text.Font f1 = FontFactory.GetFont(FontFactory.HELVETICA, 8, iTextSharp.text.Font.NORMAL);

datatable.AddCell(new Phrase("ID", f));

datatable.AddCell(new Phrase("Name", f));

datatable.AddCell(new Phrase("Address", f));

foreach (DataRow dr in this.database1DataSet1.Tables[0].Rows)

{

        datatable.DefaultHorizontalAlignment = Element.ALIGN_LEFT;

        datatable.AddCell(new Phrase(dr[0].ToString(), f1));

        datatable.AddCell(new Phrase(dr[1].ToString(), f1));

        datatable.AddCell(new Phrase(dr[2].ToString(), f1));

}                  

document.Add(datatable);

document.Close();

System.Diagnostics.Process.Start("sample.pdf");


      最后的运行效果,可能不太清楚:
     

从上面的代码也可以看出,对pdf的操作,生成表格都是一句句代码写的,简单的报表还可以应付,如果是复杂的报表,这样干就有些吃力了。

 

显然,使用iTextSharp,最大的优势就是对代码的完全控制。同时最大的问题就是报表设计器的缺失,有了报表设计器,将其保存为xml,然后用iTextSharpxml文件载入,来确定报表布局,再配合自己写的代码生成报表。这样既能照顾到开发效率,又能照顾到灵活性,毕竟iTextSharp是开源的,出了问题自己也好跟踪定位。

 

说到底,目前问题只解决了一半,如果想节约点成本,同时应用也比较简单,这条路也还是可以不错的。

另外添加一个iTextSharp的很好的资源:HardRock的blog

Feedback

#1楼    回复  引用  查看    

2006-10-05 17:53 by volnet(可以叫我大V)      
好羡慕会用报表的人啊
我的MFC+LISTCTRL+Crystal Report如何产生报表

我一次报表都没有生成过。嗨~新手落难了。
有想法吗?告诉我吧,谢谢你了先。
如果可以请给我留言。

#2楼    回复  引用  查看    

2006-10-05 18:14 by aspnetx      
相对比较大一些的报表,我们这的人都选择了Reporting Service
itextsharp确实也很不错

#3楼 [楼主]   回复  引用  查看    

2006-10-05 18:37 by Cure      
@aspnetx
我见过一个java项目,没有可视化的报表设计器,完全是用iText一行行写出来的,而且那报表巨复杂,线,表格那都是用尺子量的,够痛苦。
所以要用iTextSharp,恐怕主要是出于成本的问题,现在买个报表工具也花不少钱,国内当然无所谓了,什么东西都可以上盗版或破解什么的。
听说Reporting Service不错,一直想学学,可是对我来说,系统要求太高了,我现在还用win2000 Professional版的。T_T

#4楼    回复  引用    

2006-10-06 23:04 by Johnny Hu [未注册用户]
我也用itextsharp做报表,自己控制流程打印速度飞快,比cr.net设计复杂的签套报表快上百倍
痛苦的就是流程要自己写. 通用与自定义永远是矛盾的,想快就得自己写 :)

#5楼    回复  引用  查看    

2006-10-07 14:56 by neuhawk      
reportview+localreport不可以吗?

#6楼    回复  引用    

2006-10-08 21:33 by iceboundrock [未注册用户]
SQL 2005 Express不就自带了Reporting Service么?是免费的啊

#7楼 [楼主]   回复  引用  查看    

2006-10-09 08:51 by Cure      
@iceboundrock
可是现在有很多人还在用VS2003+SQLServer2000呀

#8楼    回复  引用    

2006-11-13 18:50 by skyey [未注册用户]
请问怎样控制table 的样式????

#9楼 [楼主]   回复  引用  查看    

2006-11-14 12:57 by Cure      
@skyey
你可以通过下面的地址下载例子程序,然后主要看chapt05中的内容,这部分就是将如何控制表格的。
http://prdownloads.sourceforge.net/itextsharp/iTextSharp.tutorial.01.zip?download

#10楼    回复  引用    

2007-06-22 13:27 by wizzly [未注册用户]
我用EXCEL2000来做报表,很简单的

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-10-28 10:59 编辑过


相关链接:

历史上的今天:
2004-10-05 Gmail 邀请