The Last Day Of Summer

.NET技术 C# ASP.net ActiveReport SICP 代码生成 报表应用 RDLC
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

报表开发最后一计-使用iTextSharp来开发报表

Posted on 2006-10-05 12:34  Cure  阅读(5381)  评论(12编辑  收藏  举报

在报表应用中,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