我正在寻找一个免费的模板引擎来生成简单的报告。我想要一些基本功能,例如:
我将使用它来生成HTML和XML报告。我不是在寻找ASP.NET模板引擎。
这适用于WinForms应用程序。
我已经看到了这个问题Can you recommend a .net template engine?,但是所有这些模板引擎对我来说都是过度杀伤力,并且专注于ASP.NET。
请仅推荐免费图书馆。
//我仍然在寻找一个NVelocity,但它对.NET来说看起来没有任何希望,过于复杂,当你下载它的一堆文件不清楚该做什么,没有教程,启动文档等。
答案 0 :(得分:3)
我第二次不推荐nVelocity。这是一个可怕的港口。
.NET实际上通过使用CodeDOM构建了模板功能。
以下是如何做到这一点的非常好的演练:
http://www.codeproject.com/KB/cs/smarttemplateengine.aspx
通过一些次要编码,您将能够创建具有内联C#的模板:
<html>
<head>
<title>My Report</title>
</head>
<body>
<% foreach (ReportRow r in ReportData) { %>
<!-- Markup and Code for Report -->
<% } %>
</body>
</html>
答案 1 :(得分:2)
我们将NVelocity用作基于MonoRail的网站的一部分。老实说,我不会推荐NVelocity。它是Java版本到.NET版本的直接端口(并且直接指向CTRL + C,CTRL + V,将一些Java关键字更改为C#关键字 - 这是不可维护的)。 Castle不得不分叉它以添加一些面向.NET的功能(字典访问,花哨的foreach循环),因为最初的.NET维护者正在使它处于不健康的状态。如果你尝试在多行中拆分long if语句,那么在转义一些自己的指令时遇到问题会变得非常烦躁。我并不是要全力以赴,这是一个很好的语言,它是免费的,它在我们的网站上使用,每天服务数千个请求 - 我只是不会再使用它,除非我看到一个新的实现相同的语法。
对于生成电子邮件的系统的其他区域,我只是使用在字符串中替换$ SPECIAL_KEYWORDS $的老式方法(即,将关键字映射到值,迭代并替换的字典)。效率不高,但运作良好。
期待阅读其他一些答案。
答案 2 :(得分:2)
虽然我看到你已经接受了答案,但我鼓励你看看Spark view engine。
网站示例:
<viewdata products="IEnumerable[[Product]]"/>
<ul if="products.Any()">
<li each="var p in products">${p.Name}</li>
</ul>
<else>
<p>No products available</p>
</else>
答案 3 :(得分:1)
我会推荐StringTemplate(http://www.stringtemplate.org)。我用它来生成邮件。您可以使用存储在文件系统或数据库中的模板组(需要花费一些工作量)。
答案 4 :(得分:0)
感谢您的帮助,CodeDOM特别向我展示了一个很好的方式, 现在我正在使用这个:http://www.stefansarstedt.com/templatemaschine.html
这不是最好的,有点脏,但为我做了诀窍。这是适合我的LGPL,简称。
我已经查看了其他建议但是不喜欢它们,对于我想要的东西来说太复杂了(而且非常混乱的DLL,依赖等等。)
答案 5 :(得分:0)
John Resig有一个很棒的Javascript模板,名为micro-template。模板的语法是:
<script type="text/html" id="item_tmpl">
<div id="<%=id%>" class="<%=(i % 2 == 1 ? " even" : "")%>">
<div class="grid_1 alpha right">
<img class="righted" src="<%=profile_image_url%>"/>
</div>
<div class="grid_6 omega contents">
<p><b><a href="/<%=from_user%>"><%=from_user%></a>:</b> <%=text%></p>
</div>
</div>
</script>
模板函数将支持使用Javascript,因此您可以获得循环功能和对DOM的完全访问权限,因此任何jQuery或其他框架都可供您使用。这是一种非常灵活的方法,因为它允许您快速地将新功能包含在网页中,只需很少的努力和更改。它也适用于.Net,如Dave Ward的post所示。
模板可以是一个html文件,您可以使用$ .get()命令检索该文件。您将模板作为数据源提供给JSON对象。最后,还有一个允许您预编译模板的功能。
答案 6 :(得分:0)
这是另一个模板引擎:UltTemplate Engine
以下是模板代码:
Dear $User.FullName$,
{%set orders=User.GetOrders() /}
Thank you for your order of $orders.Length$ items, We believe you will be very satisfied with the quality of costume pieces included in each. It is this quality that makes our imaginative play apparel so unique.
We created an account for you to track your orders. Here is the login information:
Email: $User.EmailAddress$
Password: $User.Password$
Following is the details of your order (OrderId: $OrderId$):
# Part ID Name Quantity Price(per unit) Sub Total
{%set Total=0.0 /}{%foreach orderproduct,i in orders%}{%set Total = Total + orderproduct.Price * orderproduct.Quantity/}
{%rendertemplate orderproducttemplate item=orderproduct/}{$foreach%}
Total: $PadLeft(Format(Total,"$$#.##"),11)$
If you have any concern, please call us at 913-555-0115.
Sincerely,
$CompanyName$
{%template orderproducttemplate%}$PadLeft(i,4)$$PadLeft(item.PartId, 7)$ $PadRight(item.ProductName, 15)$ $PadRight(item.Quantity, 5)$ $PadLeft(Format(item.Price,"$$#.##"), 7)$ $PadLeft(Format(item.Price*item.Quantity,"$$#.##"), 12)${$template%}
这是输出:
Dear John Borders,
Thank you for your order of 3 items, We believe you will be very satisfied with the quality of costume pieces included in each. It is this quality that makes our imaginative play apparel so unique.
We created an account for you to track your orders. Here is the login information:
Email: myemail@somedomain.com
Password: 123abc
Following is the details of your order (OrderId: 1625DGHJ):
# Part ID Name Quantity Price(per unit) Sub Total
0 1239 Product A 3 $104.09 $312.27
1 22 Product B 1 $134.09 $134.09
2 167 Product C 5 $14.7 $73.5
Total: $519.86
If you have any concern, please call us at 913-555-0115.
Sincerely,
My Company Name
这是C#代码:
class OrderProduct
{
private int _partId;
private string _productName;
private int _quantity;
private float _price;
public int PartId
{
get { return _partId; }
set { _partId = value; }
}
public string ProductName
{
get { return _productName; }
set { _productName = value; }
}
public int Quantity
{
get { return _quantity; }
set { _quantity = value; }
}
public float Price
{
get { return _price; }
set { _price = value; }
}
}
class User
{
private string _fullName;
private string _emailAddress;
private string _password;
public string FullName
{
get { return _fullName; }
set { _fullName = value; }
}
public string EmailAddress
{
get { return _emailAddress; }
set { _emailAddress = value; }
}
public string Password
{
get { return _password; }
set { _password = value; }
}
public OrderProduct[] GetOrders()
{
OrderProduct[] ops = new OrderProduct[3];
ops[0] = new OrderProduct();
ops[0].PartId = 1239;
ops[0].Price = 104.09f;
ops[0].ProductName = "Product A";
ops[0].Quantity = 3;
ops[1] = new OrderProduct();
ops[1].PartId = 22;
ops[1].Price = 134.09f;
ops[1].ProductName = "Product B";
ops[1].Quantity = 1;
ops[2] = new OrderProduct();
ops[2].PartId = 167;
ops[2].Price = 14.7f;
ops[2].ProductName = "Product C";
ops[2].Quantity = 5;
return ops;
}
}
private void btnRun_Click(object sender, EventArgs e)
{
try
{
dt.LoadFromString(txtSource.Text);
dt.SetValue("CompanyName", "My Company Name");
User u = new User();
u.EmailAddress = "myemail@somedomain.com";
u.FullName = "John Borders";
u.Password = "123abc";
dt.SetValue("User", u);
dt.SetValue("OrderId", "1625DGHJ");
txtOutput.Text = dt.Run();
}
catch (Exception exc)
{
MessageBox.Show("An error occurred: " + exc.Message);
}
}
答案 7 :(得分:0)
在阅读这些答案时,我不禁要注意,对于较小的应用程序,所有答案和库等都非常复杂。因此,我想建议T4T Text Templates。
以下是Writing的教程。它不需要任何未包含在visual studio中的库。如果您不需要过于复杂的模板或报告,那么可能值得一看。
模板代码示例:
<#@ template language="C#" #>
<html><body>
<h1>Sales for Previous Month</h2>
<table>
<# for (int i = 1; i <= 10; i++)
{ #>
<tr><td>Test name <#= i #> </td>
<td>Test value <#= i * i #> </td> </tr>
<# } #>
</table>
This report is Company Confidential.
</body></html>
在您的应用程序代码中,您可以使用以下调用生成模板的内容:
MyWebPage page = new MyWebPage();
String pageContent = page.TransformText();
System.IO.File.WriteAllText("outputPage.html", pageContent);