C# 在 ASP.Net 中生成 CSV 文件
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/13244875/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Generate CSV file in ASP.Net
提问by user1178192
I am using the code below on an aspx page on button click event to generate csv file. This works when I do not name my file but when I try to use: Response.AddHeader("Content-Disposition", "attachment;filename=myfilename.csv");
我在按钮单击事件的 aspx 页面上使用下面的代码来生成 csv 文件。当我没有命名我的文件但当我尝试使用时,这会起作用: Response.AddHeader("Content-Disposition", "attachment;filename=myfilename.csv");
to name the file as myfilename.csv, the excel sheet generated is the screen shot of the web page instead of having text in it. Can someone help me with this problem.
Thanks!
将文件命名为 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;
}
采纳答案by nick_w
I am not exactly sure what you are aiming for here, so I have assumed that you are wanting to create a CSV file in a button click event and send that back to the user. What you currently have appears to write the HTML of the control into an XLS file.
我不确定您在这里的目标是什么,所以我假设您想在按钮单击事件中创建一个 CSV 文件并将其发送回用户。您目前所拥有的似乎是将控件的 HTML 写入 XLS 文件。
Try this:
尝试这个:
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();
}
When I run this I am prompted by the browser to save the CSV file.
当我运行它时,浏览器会提示我保存 CSV 文件。
Edit:
编辑:
If you would like to maintain your current approach (which is producing HTML, not CSV) then try this:
如果您想保持当前的方法(生成 HTML,而不是 CSV),请尝试以下操作:
Response.AddHeader("Content-Disposition", "attachment;filename=myfilename.xls");
Note that I have simply changed the file extension from CSV to XLS. When using the CSV extension, the text appeared in Excel as HTML. Using XLS, it appears just as it does when the above line is commented out.
请注意,我只是将文件扩展名从 CSV 更改为 XLS。使用 CSV 扩展时,文本在 Excel 中显示为 HTML。使用 XLS,它看起来就像注释掉上面的行一样。
回答by Amin Sayed
Try changing this:
尝试改变这个:
Response.ContentType = "application/text";
Or
或者
Response.ContentType = "text/csv";
回答by Zev Spitz
Same as NickW's solution, but more concisely using LINQ:
与 NickW 的解决方案相同,但更简洁地使用 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();
回答by user1178192
Finally I think i figured it out, we need to write a http handler if we intend to generate excel files on asp.net pages, now my button_click just redirects to TestHandler.ashx page and it renders the excel file. :)
最后我想我想通了,如果我们打算在 asp.net 页面上生成 excel 文件,我们需要编写一个 http 处理程序,现在我的 button_click 只是重定向到 TestHandler.ashx 页面并呈现 excel 文件。:)
Thank you very much all you 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;
}
}
}

