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″>
<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>
<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”))
<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
<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“);
string output = ProcessTemplate(dataTable);
string fileName = Server.MapPath(“~/Temp/temp.htm“);
System.IO.File.WriteAllText(fileName, output, System.Text.ASCIIEncoding.ASCII);
com.lowagie.text.Document document = new com.lowagie.text.Document(PageSize.A4, 80, 50, 30, 65);
PdfWriter.getInstance(document, stream);
HtmlParser.parse(document, fileName);
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();
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();
}
}