我有一个MS SQL视图,我想在ASPNET Web窗体应用程序中以CSV下载形式提供。我在实体框架中使用了项目中的其他视图和表格。什么是启用此下载的最佳方式?如何在ASP.NET Web窗体中将视图作为CSV提供
我可以添加一个LinkButton,它的Click处理器遍历视图,将其CSV表单写入磁盘,然后提供该文件。但是,如果可以避免的话,我宁愿不写入磁盘,也不要使用其他解决方案可以避免的迭代代码。
我有一个MS SQL视图,我想在ASPNET Web窗体应用程序中以CSV下载形式提供。我在实体框架中使用了项目中的其他视图和表格。什么是启用此下载的最佳方式?如何在ASP.NET Web窗体中将视图作为CSV提供
我可以添加一个LinkButton,它的Click处理器遍历视图,将其CSV表单写入磁盘,然后提供该文件。但是,如果可以避免的话,我宁愿不写入磁盘,也不要使用其他解决方案可以避免的迭代代码。
你可以遍历数据集,但不是创建CSV您的服务器上的文件只需通过HTTP响应返回。下面的函数应该做的伎俩。
Public Shared Sub ExportTextFile(ByVal response As System.Web.HttpResponse, ByVal text As String, ByVal fileName As String)
response.Clear()
response.AddHeader("content-disposition", String.Format("attachment;filename={0}", fileName))
response.Charset = ""
response.Cache.SetCacheability(HttpCacheability.NoCache)
response.ContentType = "application/vnd.text"
Dim stringWrite As New System.IO.StringWriter
Dim htmlWrite = New HtmlTextWriter(stringWrite)
response.Write(text.ToString)
response.End()
End Sub
请参阅this article,具体为方法WriteToCsv();
这会将csv数据发送到浏览器PersonList.csv
。
更新:可能Asp.Net场景:
protected void Page_Load(object sender, EventArgs e)
{
var data = GetMyData(...);
CSVExporter.WriteToCSV(data);
}
这是一个良好的开端,但字符串值应该总是用引号包围,如数据的嵌入式逗号否则会搞砸了CSV。 – 2010-03-29 18:50:07
有了这个解决方案,CSVExporter的方法是否会与在其Page_Load()中调用WriteToCsv()的.aspx页面合并? – ChessWhiz 2010-03-29 18:54:05
还有一个显然是支持写入CSV的Linq to CSV项目http://www.codeproject.com/KB/linq/LINQtoCSV.aspx#writing_to_a_file – R0MANARMY 2010-03-29 18:57:26
这里是我的代码来从任何IDataReader cea csv文件。使用ExecuteReader()和HttpResponse.OutputStream的结果调用它。它将写出第一行中的列名称,然后写出一组或多组数据行。按照matt的建议将其输出到浏览器,但我会建议内容类型为'text/csv'。
public static void createCsvFile(IDataReader reader, StreamWriter writer) {
for (int columnCounter = 0; columnCounter < reader.FieldCount; columnCounter++) {
if (columnCounter > 0) {
writer.Write(Separator);
}
writer.Write(Delimiter + reader.GetName(columnCounter) + Delimiter);
}
writer.WriteLine(string.Empty);
do {
while (reader.Read()) {
for (int columnCounter = 0; columnCounter < reader.FieldCount; columnCounter++) {
if (columnCounter > 0) {
writer.Write(Separator);
}
writer.Write("\""+ reader.GetValue(columnCounter).ToString().Replace('"', '\'') + "\"");
}
writer.WriteLine(string.Empty);
}
writer.Flush();
}
while (reader.NextResult());
我发现这个问题,它解决了困境的HttpHandler部分。
In ASP.NET, how to get the browser to download string content into a file? (C#)
因此,类似于ExportTextFile()的方法将用作链接的点击处理程序,但没有目标.aspx页面? – ChessWhiz 2010-03-29 18:50:58
@Chess你可以做到这一点,或将该代码放在ExportTextFile.aspx页面的Page_Load中。然后链接到那个。 – mxmissile 2010-03-29 18:53:23
如果你走这条路线(你可能应该)考虑实施你自己的HTTP处理程序,这样你就不会承担整个页面加载的成本。请参阅http://www.hanselman.com/blog/PermaLink,guid,5c59d662-b250-4eb2-96e4-f274295bd52e.aspx和http://haacked.com/archive/2005/03/17/AnAbstractBoilerplateHttpHandler.aspx以供参考。 – R0MANARMY 2010-03-29 18:54:05