Создать файл CSV в ASP.Net

Я использую код ниже на странице aspx на событие нажатия кнопки, чтобы создать CSV-файл. Это работает, когда я не называю свой файл, но когда я пытаюсь использовать: Response.AddHeader ("Контент-диспозиция ","прикрепление; имя файла = myfilename.csv»);

чтобы присвоить файлу имя myfilename.csv, сгенерированный лист Excel представляет собой снимок экрана с веб-страницей, а не с текстом в нем. Может кто-нибудь помочь мне с этой проблемой.

Спасибо!

DataGrid dg = new DataGrid();
dg.DataSource = GetData();
htmlTextWriter.WriteLine("Details");

//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;
}
 nick_w06 нояб. 2012 г., 06:44
ЭтоtextWriter переменная опечатка для?htmlTextWriter
 Karthik06 нояб. 2012 г., 06:40
попробуйте это .. Response.ContentType = "применение / vnd.ms-первенствовать»; Response.AddHeader (»содержание-расположение ","прикрепление; имя файла = Cs_V.xls»); Response.Charset = "";
 user117819206 нояб. 2012 г., 21:24
Спасибо Karthi, хотя это помогло. Я думал, что у меня там был такой же код, я раскомментировал строку Response.addheader, и она не генерирует файл. Ник, textwriter является stringwriter, я не добавил эту строку в коде, где я объявляю textwriter

Ответы на вопрос(4)

Попробуйте изменить это:

Response.ContentType = "application/text";

Или же

Response.ContentType = "text/csv";

Наконец, я думаю, я понял, что нам нужно написать обработчик http, если мы намереваемся генерировать файлы Excel на страницах asp.net, теперь мой button_click просто перенаправляет на страницу TestHandler.ashx, и он отображает файл Excel. :)

Большое спасибо всем вам, парень

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

Так же, как 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();
Решение Вопроса

Я не совсем уверен, к чему вы стремитесь, поэтому предположил, что вы хотите создать файл CSV в событии нажатия кнопки и отправить его обратно пользователю. То, что у вас есть, похоже, записывает HTML-код элемента управления в файл XLS.

Попробуй это:

protected void Button1_Click(object sender, EventArgs e)
{
    var dataTable = GetData();
    StringBuilder builder = new StringBuilder();
    List columnNames = new List();
    List rows = new List();

    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 currentRow = new List();

        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 текст в Excel отображался как HTML. Используя XLS, он выглядит так же, как и когда закомментированная строка выше.

 user117819206 нояб. 2012 г., 21:25
Спасибо всем, что поделились своими мыслями, я наконец понял это. Вам нужно указать универсальный обработчик, чтобы написать что-то вроде этого в asp.net. Если вы попытаетесь сохранить файл на своей странице, тогда весь HTML-скрипт будет добавлен на страницу. Чтобы избежать этого:
 nick_w06 нояб. 2012 г., 21:36
Вы опробовали мой ответ? Я обнаружил, что только одна строка из моего редактирования добилась цели.
 user117819206 нояб. 2012 г., 21:34
context.Response.AddHeader (»Content-Disposition», string.Format ("прикрепление; имя файла = abc.xls»)); context.Response.ContentType = "применение / vnd.ms-первенствовать»; context.Response.Write (textWriter.ToString ()); context.Response.End (); }
 Jayesh29 мар. 2019 г., 06:24
из какого пространства имен "Отклик" класс принадлежит?
 user117819206 нояб. 2012 г., 21:33
public void ProcessRequest (контекст 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 ();

Ваш ответ на вопрос