在ASP.Net中生成CSV文件

我在button单击事件的aspx页面上使用下面的代码生成csv文件。 这个工程,当我没有命名我的文件,但当我尝试使用:Response.AddHeader(“Content-Disposition”,“attachment; filename = myfilename.csv”);

为了将文件命名为myfilename.csv,生成的Excel表格是网页的屏幕截图,而不是其中的文本。 有人可以帮我解决这个问题。
谢谢!

DataGrid dg = new DataGrid(); dg.DataSource = GetData(); htmlTextWriter.WriteLine("<b>Details</b>"); //Get the html for the control dg.HeaderStyle.Font.Bold = true; dg.HeaderStyle.BackColor = System.Drawing.Color.Gray; dg.DataBind(); dg.RenderControl(htmlTextWriter); //Write the HTML back to the browser. Response.Clear(); Response.ContentType = "application/vnd.ms-excel"; //Response.AddHeader("Content-Disposition", "attachment;filename=myfilename.csv"); this.EnableViewState = false; Response.Write(textWriter.ToString()); Response.End(); private System.Data.DataTable GetData() { System.Data.DataTable dt = new System.Data.DataTable("TestTable"); dt.Columns.Add("SSN"); dt.Columns.Add("Employee ID"); dt.Columns.Add("Member Last Name"); dt.Columns.Add("Member First Name"); dt.Columns.Add("Patient Last Name"); dt.Columns.Add("Patient First Name"); dt.Columns.Add("Claim No."); dt.Columns.Add("Service Line No."); dt.Columns.Add("Error Code"); dt.Columns.Add("Error Message"); dt.Rows.Add(123456789,4455,"asdf","asdf","sdfg","xzcv","dsfgdfg123",1234,135004,"some error"); dt.Rows.Add(123456788,3344,"rth","ojoij","poip","wer","aadf124",1233,135005,"Some Error"); dt.Rows.Add(123456787,2233,"dfg","sdfg","vcxb","cxvb","UHCAL125",1223,135006,"another error"); return dt; } 

我不完全确定你在这里瞄准什么,所以我假定你想在一个button单击事件中创build一个CSV文件并将其发回给用户。 您目前看到的将控件的HTML写入XLS文件。

尝试这个:

 protected void Button1_Click(object sender, EventArgs e) { var dataTable = GetData(); StringBuilder builder = new StringBuilder(); List<string> columnNames = new List<string>(); List<string> rows = new List<string>(); foreach (DataColumn column in dataTable.Columns) { columnNames.Add(column.ColumnName); } builder.Append(string.Join(",", columnNames.ToArray())).Append("\n"); foreach (DataRow row in dataTable.Rows) { List<string> currentRow = new List<string>(); foreach (DataColumn column in dataTable.Columns) { object item = row[column]; currentRow.Add(item.ToString()); } rows.Add(string.Join(",", currentRow.ToArray())); } builder.Append(string.Join("\n", rows.ToArray())); Response.Clear(); Response.ContentType = "text/csv"; Response.AddHeader("Content-Disposition", "attachment;filename=myfilename.csv"); Response.Write(builder.ToString()); Response.End(); } 

当我运行这个时,我被浏览器提示保存CSV文件。

编辑:

如果你想保持你目前的做法(这是生产HTML,而不是CSV),那么试试这个:

 Response.AddHeader("Content-Disposition", "attachment;filename=myfilename.xls"); 

请注意,我只是将文件扩展名从CSV更改为XLS。 使用CSV扩展名时,文本以HTML格式显示在Excel中。 使用XLS,就像上面这行注释掉一样。

和NickW的解决scheme一样,但更简洁的使用LINQ:

 //Append column names builder.Append(String.Join(",", from DataColumn c in dataTable.Columns select c.ColumnName )).Append("\n"); //Append data from datatable builder.Append(string.Join("\n", from DataRow row in dataTable.Rows select String.Join("\n", String.Join(",", row.ItemArray) ) )); Response.Clear(); Response.ContentType = "text/csv"; Response.AddHeader("Content-Disposition", "attachment;filename=myfilename.csv"); Response.Write(builder.ToString()); Response.End(); 

最后,我想我想出来了,如果我们打算在asp.net页面上生成excel文件,我们需要编写一个http处理程序,现在我的button_click只是redirect到TestHandler.ashx页面,并呈现了excel文件。 🙂

非常感谢你,所有你guyz

 public class TestHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { StringWriter textWriter = new StringWriter(); Html32TextWriter htmlTextWriter = new Html32TextWriter(textWriter); DataGrid dg = new DataGrid(); dg.DataSource = GetData(); //Get the html for the control dg.EnableViewState = false; dg.DataBind(); dg.RenderControl(htmlTextWriter); //Write the HTML back to the browser. context.Response.Clear(); //context.Response.AddHeader("Content-Disposition", string.Format("attachment;filename=test.csv")); //context.Response.ContentType = "text/csv"; context.Response.AddHeader("Content-Disposition", string.Format("attachment;filename=abc.xls")); context.Response.ContentType = "application/vnd.ms-excel"; context.Response.Write(textWriter.ToString()); context.Response.End(); } public bool IsReusable { get { return false; } } } 

尝试改变这一点:

 Response.ContentType = "application/text"; 

要么

 Response.ContentType = "text/csv";