使用HTML作报表

NVelocity 可以算上castle一个比较重头的组件了,TemplateEngine Component 是NVelocity的一个默认的应用实现,使用它可以轻松使用HTML作为模板,生成报表。

组件下载地址:http://www.castleproject.org/castle/download.html

当然,报表都少不了导出PDF,这一还要借助另外一个开源组件:iText, 它的.NET移植版iText.NET 还有一个C#重制版iTextSharp ,iText.NET的作者在项目介绍中还推荐在新项目中使用iTextSharp了。

示例:

报表模版可以这样写:

 

ExpandedBlockStart.gif 代码
< html >
    
< head >
    
< link  rel ="stylesheet"  type ="text/css"  href ="$CssName" >
  
</ link >
</ head >
    
< body >
        
< div > Header </ div >
        
< br />

< table  border ="0"  cellpadding ="0"  cellspacing ="0"  style ="margin:0;padding:0" >

#foreach ( $dr in $Dt.Rows)
#set($name=$dr.get_Item(3).ToString().Trim().Replace(" ", "%20"))

< tr >
< td  style ='padding:5px'
 
onmousedown ="window.location.href('$name')"
 onmouseover
="style.backgroundColor='#DFEEEE';"
 onmouseout
="style.backgroundColor='#FFFFFF';" >
< span  style ="font-size: 20px; color: #0000FF" > Compound Name:  </ span >< span  style ="font-size: 20px; color: #FF0000" > $dr.get_Item(3) </ span >
< br />< b >< span > Drug Alias:  </ span ></ b >< span > $dr.get_Item(4) </ span >
< br />< b >< span > Category:  </ span ></ b >< span > $dr.get_Item(2) </ span >
</ td ></ tr >

#end
</ table >
< br />

        
< div > Bottom
        
</ div >
    
</ body >
</ html >

 

 

代码:

报表预览:

 

ExpandedBlockStart.gif 代码

    
protected   void  Button2_Click( object  sender, EventArgs e)
    {
        DataTable dataTable 
=  GetDataTable();
        
string  output  =  ProcessTemplate(dataTable);
        Response.Write(output);
        Response.Flush();
        Response.Close();
    }

    
private   string  ProcessTemplate(DataTable dataTable)
    {
        INVelocityEngine velocityEngine 
=  NVelocityEngineFactory.CreateNVelocityFileEngine(Server.MapPath( " ~/Templates " ),  true );
        System.Collections.Hashtable context 
=   new  System.Collections.Hashtable();
        context.Add(
" CssName " , ResolveAbsoluteUrl( " ~/css/default.css " ));
        context.Add(
" Dt " , dataTable);
        
string  output  =  velocityEngine.Process(context,  " temp.htm " );
        
return  output;
    }

    
private  DataTable GetDataTable()
    {
        DataTable dataTable 
=   new  DataTable();
        dataTable.Columns.Add(
" a " );
        dataTable.Columns.Add(
" b " );
        dataTable.Columns.Add(
" c " );
        dataTable.Columns.Add(
" d " );
        dataTable.Columns.Add(
" e " );
        
for  ( int  i  =   0 ; i  <   10 ; i ++ )
        {
            DataRow dataRow 
=  dataTable.NewRow();
            
for  ( int  j  =   0 ; j  <  dataTable.Columns.Count; j ++ )
            {
                dataRow[j] 
=   string .Format( " value: {0}, {1} " , i, j);
            }
            dataTable.Rows.Add(dataRow);
        }
        
return  dataTable;
    }

 

导出PDF:

 

ExpandedBlockStart.gif 代码

    
protected   void  Button5_Click( object  sender, EventArgs e)
    {
        System.Reflection.Assembly.Load(
" Apache.Xml.Commons " );
        System.Reflection.Assembly.Load(
" Apache.Crimson " );
        System.Reflection.Assembly.Load(
" iTextAsian " );

        DataTable dataTable 
=  GetDataTable();
        
string  output  =  ProcessTemplate(dataTable);
        
string  fileName  =  Server.MapPath( " ~/Temp/temp.htm " );
        System.IO.File.WriteAllText(fileName, output, System.Text.ASCIIEncoding.ASCII);

        MemoryStream stream 
=   new  MemoryStream();
        com.lowagie.text.Document document 
=   new  com.lowagie.text.Document(PageSize.A4,  80 50 30 65 );
        PdfWriter.getInstance(document, stream);
        HtmlParser.parse(document, fileName);

        document.close();
        stream.Flush();
        
byte [] bytes  =  stream.ToArray();
        
if  (bytes  !=   null )
        {
            Page.Response.Clear();
            Page.Response.ContentType 
=   " application/pdf " ;
            Page.Response.AppendHeader(
" Content-Disposition " " attachment;filename=temp.pdf " );
            Page.Response.BinaryWrite(bytes);
            Page.Response.End();
        }
    }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值