2012-11-06 26 views
10

Korzystam z poniższego kodu na stronie aspx na zdarzenie click button, aby wygenerować plik csv. Działa to, gdy nie nazwę pliku, ale gdy próbuję użyć: Response.AddHeader ("Content-Disposition", "attachment; filename = myfilename.csv");Generowanie pliku CSV w ASP.Net

nazwa pliku jako moja_nazwa_pliku.csv, wygenerowany arkusz programu excel to zrzut ekranu strony internetowej zamiast posiadania w niej tekstu. Czy ktoś może mi pomóc w tym problemie?
Dzięki!

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

spróbować .. Response.ContentType = "application/vnd.ms-Excel"; Response.AddHeader ("content-disposition", "attachment; filename = Cs_V.xls"); Response.Charset = ""; – Karthik

+0

Czy zmienna 'textWriter' jest literówką dla' htmlTextWriter'? –

+0

Dzięki, Karthi, ta pomoc jednak. Myślałem, że mam tam ten sam kod, odkomentowałem linię Response.addheader i nie generuję pliku. Nick, autor tekstów jest pisarzem, nie dodałem tej linii w kodzie, gdzie deklaruję autora tekstów – user1178192

Odpowiedz

15

Nie jestem dokładnie pewien, czego dążą do tutaj, więc założyliśmy, że jesteś chcąc utworzyć CSV plik w zdarzeniu kliknięcia przycisku i odeślij go do użytkownika. Wygląda na to, że obecnie wpisujesz kod HTML kontrolki do pliku XLS.

Spróbuj tego:

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

Kiedy uruchamiam to mam poproszony przez przeglądarkę, aby zapisać plik CSV.

Edit:

Jeśli chcesz zachować obecne podejście (który jest produkujących HTML, a nie plik CSV), a następnie spróbuj tego:

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

Zauważ, że ja po prostu zmieniły rozszerzenie pliku od CSV do XLS. Podczas korzystania z rozszerzenia CSV tekst pojawił się w programie Excel jako HTML. Używając XLS, wygląda tak, jak robi to, gdy powyższy wiersz jest komentowany.

+0

Dziękuję wszystkim za dzielenie się swoimi przemyśleniami, w końcu wymyśliłem to. Musisz określić Generic Handler, aby napisać coś takiego w asp.net. Jeśli spróbujesz zapisać plik na swojej stronie, cały skrypt HTML zostanie dodany do strony.Aby tego uniknąć: – user1178192

+0

public void ProcessRequest (kontekst HttpContext) { 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 ("attachment; filename = abc.xls")); context.Response.ContentType = "application/vnd.ms-excel"; context.Response.Write (textWriter.ToString()); context.Response.End(); } – user1178192

0

Spróbuj zmienić to:

Response.ContentType = "application/text"; 

Albo

Response.ContentType = "text/csv"; 
1

samo jak rozwiązanie NickW, ale bardziej zwięźle użyciu 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

Wreszcie Myślę, że zorientowaliśmy się, musimy napisać obsługi HTTP jeśli zamierzamy generowania plików Excel na stronach ASP.NET, teraz mój button_click po prostu przekierowuje na stronę TestHandler.ashx i renderuje plik Excela. :)

Dziękuję bardzo wszystkim ty 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; 
     } 
    } 
}