1

asp.net グリッドビューの選択した行を Excel シートにダウンロードする必要があります。私がやっていることは、すべてを一度にチェックするか、いくつかを選択してから、下のダウンロードボタンを押すと、選択したすべての行がExcelとしてダウンロードされます。ここでダウンロードボタンを押すとすべてが正常に機能しますが、選択を無視してすべての行がダウンロードされます。グリッド ビューのサンプル 以下は私のコードです

public void ExportGridToExcel(GridView grdGridView, string fileName)
{
    Response.Clear();

    Response.AddHeader("content-disposition", string.Format("attachment;filename={0}.xls", fileName));
    Response.Charset = "";

    Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);

    Response.ContentType = "application/vnd.xls";

    StringWriter stringWriter = new StringWriter();
    HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);

// I Tried using following (but with no success)
//-----Trial Starts----------------
//foreach (GridViewRow gvr in gvProgramList.Rows)
//    {
//        CheckBox cbox = (CheckBox)gvr.FindControl("cboxSelect");
//        if(cbox.Checked)
//            gvr.Visible = true;
//        else
//            gvr.Visible = false;
//    }
//--------Trial ends---------------
    grdGridView.DataBind();
    ClearControls(grdGridView);

    // Throws exception: Control 'ComputerGrid' of type 'GridView'
    // must be placed inside a form tag with runat=server.
    // ComputerGrid.RenderControl(htmlWrite);

    // Alternate to ComputerGrid.RenderControl above
    System.Web.UI.HtmlControls.HtmlForm form = new System.Web.UI.HtmlControls.HtmlForm();
    Controls.Add(form);



    form.Controls.Add(grdGridView);
    form.RenderControl(htmlWriter);
    Response.Write(stringWriter.ToString());
    Response.End();
    foreach (GridViewRow gvr in gvProgramList.Rows)
    {
        CheckBox cbox = (CheckBox)gvr.FindControl("cboxSelect");
            gvr.Visible = true;
    }
    grdGridView.DataBind();
}

private void ClearControls(Control control)
{
    for (int i = control.Controls.Count - 1; i >= 0; i--)
    {
        ClearControls(control.Controls[i]);
    }

    if (!(control is TableCell))
    {
        if (control.GetType().GetProperty("SelectedItem") != null)
        {
            LiteralControl literal = new LiteralControl();
            control.Parent.Controls.Add(literal);
            try
            {
                literal.Text =
                    (string)control.GetType().GetProperty("SelectedItem").
                        GetValue(control, null);
            }
            catch
            { }
            control.Parent.Controls.Remove(control);
        }
        else if (control.GetType().GetProperty("Text") != null)
        {
            LiteralControl literal = new LiteralControl();
            control.Parent.Controls.Add(literal);
            literal.Text =
                (string)control.GetType().GetProperty("Text").
                    GetValue(control, null);
            control.Parent.Controls.Remove(control);
        }
    }
    return;
}

protected void btnDownload_Click(object sender, EventArgs e)
{
    if (gvProgramList.Rows.Count > 0)
    {
        ExportGridToExcel(gvProgramList, "ProgramList");
    }
}
4

2 に答える 2

0

これを行うためのロジックを提案できます。

1.グリッドビューの選択した行で動的データテーブルを作成します。グリッドビューの行をループし、選択した行を取得して新しいデータテーブルに追加するだけです。

2.次に、この新しいデータテーブルをExcelシートに変換するためのコードを記述します(Googleの「データテーブルをExcelに変換」の結果がたくさんあります)

于 2013-01-01T14:55:11.360 に答える
0
Try like the below code,hope it helps you..

ダウンロードボタンのクリックイベントで、このfnを呼び出します

private void ExportToExcell()
{       
        DataTable dt = new DataTable();
        dt.Columns.Add("Plan ID");
        dt.Columns.Add("Plan Name");
        dt.Columns.Add("Balance");
        foreach (GridViewRow row in gdvBal.Rows)
        {
            CheckBox chkCalls = (CheckBox)row.FindControl("chkCalls");
            if (chkCalls.Checked == true)
            {
                int i = row.RowIndex;
                Label lblPlanId = (Label)gdvBal.Rows[i].FindControl("lblPlanId");
                Label lblPlanName = (Label)gdvBal.Rows[i].FindControl("lblPlanName");
                Label lblBalance = (Label)gdvBal.Rows[i].FindControl("lblBalance");

                DataRow dr = dt.NewRow();
                dr["Plan ID"] = Convert.ToString(lblPlanId.Text);
                dr["Plan Name"] = Convert.ToString(lblPlanName.Text);
                dr["Balance"] = Convert.ToString(lblBalance.Text);
                dt.Rows.Add(dr);
            }
        }
        GridView gdvExportxls = new GridView();
        gdvExportxls.DataSource = dt;
        gdvExportxls.DataBind();
        Response.Clear();
        Response.Buffer = true;
        Response.ContentType = "application/ms-excel";
        Response.AddHeader("content-disposition", string.Format("attachment;filename=BillingForfBalances.xls", "selectedrows"));
        Response.Charset = "";
        StringWriter stringwriter = new StringWriter();
        HtmlTextWriter htmlwriter = new HtmlTextWriter(stringwriter);
        gdvExportxls.RenderControl(htmlwriter);
        Response.Write(stringwriter.ToString().Replace("<div>", " ").Replace("</div>", " "));
        Response.End();

}
于 2013-01-02T09:11:21.007 に答える