我有一个MS SQL视图,我希望在ASPNET Web窗体应用程序中以CSV格式提供。我正在为项目中的其他视图和表使用Entity Framework。启用此下载的最佳方法是什么?
我可以添加一个LinkButton,其Click处理程序在视图上迭代,将其CSV表单写入磁盘,然后提供该文件。但是,如果可以避免,我宁愿不写入磁盘,而且这涉及可以通过其他解决方案避免的迭代代码。
答案 0 :(得分:2)
您可以迭代数据集,但不是在服务器上创建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
答案 1 :(得分:1)
请参阅this article,特别是方法WriteToCsv();
这会将csv数据作为PersonList.csv
发送到浏览器。
更新:可能的Asp.Net场景:
protected void Page_Load(object sender, EventArgs e)
{
var data = GetMyData(...);
CSVExporter.WriteToCSV(data);
}
答案 2 :(得分:0)
这是我从任何IDataReader中停止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());
答案 3 :(得分:0)
我发现了这个问题,它解决了困境的HttpHandler部分。
In ASP.NET, how to get the browser to download string content into a file? (C#)