2012-11-06 36 views
10

Tôi đang sử dụng mã bên dưới trên trang aspx trên sự kiện nhấp nút để tạo tệp csv. Điều này hoạt động khi tôi không đặt tên tệp của mình nhưng khi tôi cố gắng sử dụng: Response.AddHeader ("Content-Disposition", "attachment; filename = myfilename.csv");Tạo tệp CSV trong ASP.Net

để đặt tên tệp là myfilename.csv, bảng excel được tạo là ảnh chụp màn hình của trang web thay vì có văn bản trong đó. Ai đó có thể giúp tôi vấn đề này không.
Cảm ơn!

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; 
} 
+0

thử này .. Response.ContentType = "application/vnd.ms-excel"; Response.AddHeader ("content-disposition", "attachment; filename = Cs_V.xls"); Response.Charset = ""; – Karthik

+0

Biến 'textWriter' có phải là lỗi đánh máy cho' htmlTextWriter' không? –

+0

Cảm ơn Karthi, dint giúp mặc dù. Tôi nghĩ rằng tôi đã có cùng một mã lên đó, tôi uncommented Response.addheader dòng và nó không tạo ra các tập tin. Nick, nhà viết kịch bản là người viết chuỗi, tôi không thêm dòng đó vào mã nơi tôi khai báo người viết văn bản – user1178192

Trả lời

15

Tôi không chắc chắn chính xác những gì bạn đang hướng tới ở đây, vì vậy tôi đã giả định rằng bạn đang muốn tạo ra một CSV trong một sự kiện bấm nút và gửi lại cho người dùng. Những gì bạn hiện đang xuất hiện để viết HTML của điều khiển vào một tệp XLS.

Hãy thử điều này:

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(); 
} 

Khi tôi chạy này tôi đang thúc đẩy bởi các trình duyệt để lưu các tập tin CSV.

Edit:

Nếu bạn muốn duy trì cách tiếp cận hiện tại của bạn (được sản xuất HTML, không CSV) sau đó thử này:

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

Lưu ý rằng tôi đã chỉ cần thay đổi phần mở rộng tập tin từ CSV sang XLS. Khi sử dụng phần mở rộng CSV, văn bản xuất hiện trong Excel dưới dạng HTML. Sử dụng XLS, nó xuất hiện giống như khi dòng trên được nhận xét.

+0

Cảm ơn tất cả vì đã chia sẻ suy nghĩ của bạn, cuối cùng tôi đã tìm ra điều này. Bạn cần phải chỉ định một trình xử lý chung để viết một cái gì đó như thế này trong asp.net Nếu bạn cố gắng lưu tệp trong trang của bạn thì toàn bộ tập lệnh html sẽ được thêm vào trang.Để tránh điều này: – user1178192

+0

void công khai ProcessRequest (HttpContext context) { StringWriter textWriter = new StringWriter(); Html32TextWriter htmlTextWriter = new Html32TextWriter (textWriter); DataGrid dg = new DataGrid(); dg.DataSource = GetData(); dg.DataBind(); dg.RenderControl (htmlTextWriter); context.Response.Clear(); – user1178192

+0

context.Response.AddHeader ("Content-Disposition", string.Format ("tệp đính kèm; tên tệp = abc.xls")); context.Response.ContentType = "application/vnd.ms-excel"; context.Response.Write (textWriter.ToString()); context.Response.End(); } – user1178192

0

Hãy thử thay đổi này:

Response.ContentType = "application/text"; 

Hoặc

Response.ContentType = "text/csv"; 
1

Tương tự như giải pháp NickW, nhưng chính xác hơn khi sử dụng 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(); 
1

Cuối cùng tôi nghĩ rằng tôi figured it out, chúng tôi cần phải viết một handler http nếu chúng ta có ý định tạo ra các file excel trên các trang asp.net, bây giờ button_click của tôi chỉ chuyển hướng đến trang TestHandler.ashx và nó hiển thị tệp excel. :)

Thank you very much tất cả các bạn 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; 
     } 
    } 
}