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