今天遇到了一Issue,解决从页面输出report 到excel,即导入页面数据。导入到excel数据的方法很多,我下面贴了一个网址·(1)),介绍诸多的方法。我用的基本就是类似于Figuer5的方法,就是从数据绑定控件直接导出。但是因为数据绑定控件实际上也是将其内容传送到客户端形成客户端脚本,即Repeater.RenderControl(htmlTextWriter)*注意,可能你用的是别的数据绑定控件,这个无所谓*,所以你也可以自己写一个最终在客户端形成的脚本来展现你自己的数据,这句话需要再解释一下。
也就是说,如果你用的是Repeater空间的话,展现出来的可能是一个table的形式,这样其实你就可以自己写一个table,进行填充,然后对table进行输出,为何要这样呢?为什么不直接用Repeater.RenderControl(htmlTextWriter)不就行了?实际上是这样的,可能在这个数据绑定控件中我们有一些触发客户端事件,记住,是客户端事件,(JS事件会不会有问题?需要你们去尝试。)导致输出报错,所以你需要从新定义一个Repeater,使他初始化,来单独存储你需要导出的数据--记住,这个Repeater要求是,仅仅存储数据,于是一个简单的table就可以解决问题。
这样的话,我们就需要写一个table,然后把它转化成为一个string,用Response.Write()方法来写出。我用的方法是stringbuilder来生成这个字符串,但是可能有些人偏爱HtmlTextWriter生成的页面,也可能真的后者的稳定性好一些。我后面也附了一个在用HTMLTEXTWRITER来生成页面的方法(网址2))。
现在我也把我的方法帖过来。
DataPage dataPage = best_PriceManager.SearchByPage(exportForm);
StringBuilder stringbuilder = new StringBuilder();
stringbuilder.AppendFormat("<table border=/"1/" cellpadding=/"0/" cellspacing=/"0/">");
stringbuilder.AppendFormat("<tr>");
stringbuilder.AppendFormat("<th style=/"padding-left:20px;background-color:#A3A3A3;/">Date</th>");
stringbuilder.AppendFormat("<th style=/"padding-left:20px;background-color:#A3A3A3;/">Type</th>");
stringbuilder.AppendFormat("<th style=/"padding-left:20px;background-color:#A3A3A3;/">SKU</th>");
stringbuilder.AppendFormat("<th style=/"padding-left:20px;background-color:#A3A3A3;/">Category</th>");
stringbuilder.AppendFormat("<th style=/"padding-left:20px;background-color:#A3A3A3;/">Brand</th>");
stringbuilder.AppendFormat("<th style=/"padding-left:20px;background-color:#A3A3A3;/">Notes</th>");
stringbuilder.AppendFormat("<th style=/"text-align:right;background-color:#A3A3A3;/">Amount</th>");
stringbuilder.AppendFormat("</tr>");
foreach (DataRow row in dataPage.CurrentPage.Rows)
{
DateTime createDate = Utility.TryDateTimeParse(row["CreateDate"],DateTime.Now);
stringbuilder.AppendFormat("<tr>");
stringbuilder.AppendFormat("<td style=/"text-align:center;width:70px; height:20px;/" valign=/"top/">{0}-{1}-{2}</td>", createDate.Year,createDate.Month,createDate.Day);
stringbuilder.AppendFormat("<td style=/"width:60px;padding-left:20px;/" valign=/"top/">{0}</td>", row["RefundType"]);
stringbuilder.AppendFormat("<td style=/"width:60px;padding-left:20px;/" valign=/"top/">{0}</td>", row["sku"]);
stringbuilder.AppendFormat("<td style=/"width:60px;padding-left:20px;/" valign=/"top/">{0}</td>", row["Category"]);
stringbuilder.AppendFormat("<td style=/"width:60px;padding-left:20px;/" valign=/"top/">{0}</td>", row["Brand"]);
stringbuilder.AppendFormat("<td style=/"width:60px;padding-left:20px;/" valign=/"top/">{0}</td>", row["Note"]);
stringbuilder.AppendFormat("<td style=/"width:60px;padding-left:20px;/" valign=/"top/">{0}</td>",(Utility.TryDecimalParse(row["Amount"],0)).ToString("N2"));
stringbuilder.AppendFormat("</tr>");
}
stringbuilder.AppendFormat("<tr><td>TotalAmount</td><td colspan=/"6/" align=/"right/">{0}</td>", TotalAmount);
stringbuilder.AppendFormat("</tr></table>");
string html = stringbuilder.ToString();到此为止为字符串的生成。
string attachment = "attachment; filename=BestPrice_Report.xls";
Response.ClearContent();
Response.AddHeader("content-disposition", attachment);
Response.ContentType = "application/ms-excel";
StringWriter stringWriter = new StringWriter();
HtmlTextWriter htmlTextWriter = new HtmlTextWriter(stringWriter);
htmlTextWriter.Write(html);
Response.Write(stringWriter.ToString());
Response.End();
解释:
1.字符串的生成。我用的是一个数据源,用foreach方法遍历数据源的每一项,给其赋值,逻辑比较简单。只是形式罢了。毕竟今天是刚学,但总的来说,这个是比较简单的。
2.后面的就是整个导出需要的几条字段了。
参考网址:
1)http://www.aspnetpro.com/NewsletterArticle/2003/09/asp200309so_l/asp200309so_l.asp
2)http://dotnetperls.com/htmltextwriter