瑞雪年

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: 订阅 订阅 :: 管理 ::

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

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

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

示例:

报表模版可以这样写:

 

代码
<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>

 

 

代码:

报表预览:

 

代码

    
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:

 

代码

    
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, 80503065);
        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();
        }
    }

 

 

posted on 2009-12-24 09:16  瑞雪年  阅读(2422)  评论(2编辑  收藏  举报