Générer un fichier CSV ASP.Net

j'utilise le code ci-dessous sur une page aspx sur le bouton cliquer événement pour générer le fichier csv. Cela fonctionne quand je ne nomme pas mon fichier mais quand j'essaie d'utiliser: Réponse.AddHeader ("Content-Disposition", " attachment;filename=myfilename.csv");

nom du fichier monfichier.csv, la feuille excel généré est la capture d'écran de la page web au lieu d'avoir le texte. Quelqu'un peut-il m'aider avec ce problème.

Merci!

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;
}
11
demandé sur dckuehn 2012-11-06 09:22:49

4 réponses

je ne suis pas exactement sûr de ce que vous visez ici, donc j'ai supposé que vous êtes désireux de créer un fichier CSV dans un événement clic du bouton et l'envoyer à l'utilisateur. Ce que vous avez actuellement apparaît pour écrire le HTML du contrôle dans un fichier XLS.

essaye ceci:

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

quand j'exécute ceci, le navigateur me demande de sauvegarder le fichier CSV.

Edit:

Si vous souhaitez maintenir votre approche actuelle (qui est la production de HTML, pas de CSV), puis essayez ceci:

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