15

ボタンクリックイベントのaspxページで以下のコードを使用してcsvファイルを生成しています。これは、ファイルに名前を付けていないが、次を使用しようとした場合に機能します。Response.AddHeader( "Content-Disposition"、 "attachment; filename = myfilename.csv");

ファイルにmyfilename.csvという名前を付けるために、生成されるExcelシートは、テキストが含まれているのではなく、Webページのスクリーンショットです。誰かがこの問題で私を助けることができますか?
ありがとう!

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

4 に答える 4

20

ここで何を目指しているのか正確にはわかりません。そのため、ボタン クリック イベントで CSV ファイルを作成し、それをユーザーに送り返したいと考えています。現在持っているものは、コントロールの HTML を XLS ファイルに書き込むように見えます。

これを試して:

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

これを実行すると、ブラウザから CSV ファイルを保存するように求められます。

編集:

現在のアプローチ (CSV ではなく HTML を生成する) を維持したい場合は、次のことを試してください。

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

ファイル拡張子を CSV から XLS に変更しただけであることに注意してください。CSV 拡張子を使用すると、テキストが HTML として Excel に表示されました。XLS を使用すると、上記の行をコメントアウトしたときと同じように表示されます。

于 2012-11-06T06:02:57.800 に答える
3

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();
于 2012-11-06T09:53:56.423 に答える
1

最後に、私はそれを理解したと思います。asp.net ページで Excel ファイルを生成する場合は、http ハンドラーを記述する必要があります。今、私の 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;
        }
    }
}
于 2012-11-06T20:39:06.300 に答える
0

これを変更してみてください:

Response.ContentType = "application/text";

または

Response.ContentType = "text/csv";
于 2012-11-06T05:54:27.870 に答える