【问题标题】:Gridview not exporting last row in the excelGridview没有导出excel中的最后一行
【发布时间】:2017-05-04 07:01:30
【问题描述】:

我正在尝试将 gridview 的内容导出到 excelsheet,而 excel 表中始终缺少 gridview 的最后一行。

我认为这可能是由于标题行,但无法弄清楚如何克服这个问题。下面是导出到excel表的代码

private void btnExportToExcel_OnClick(object sender, EventArgs e)
    {
        Response.Clear();
        Response.Buffer = true;
        Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.xls");
        Response.Charset = "";
        Response.ContentType = "application/vnd.ms-excel";
        using (StringWriter sw = new StringWriter())
        {
            HtmlTextWriter hw = new HtmlTextWriter(sw);

            //To Export all pages
            GridView1.AllowPaging = false;

            GridView1.RenderControl(hw); //here gridview is not rendering last row 

            //style to format numbers to string
            string style = @"<style> .textmode { } </style>";
            Response.Write(style);
            Response.Output.Write(sw.ToString());
            Response.Flush();
            Response.End();
        }
    }

【问题讨论】:

  • 无论如何,您都没有创建 Excel 文件。您正在创建一个 HTML 文件,然后使用 Excel MIME 类型和文件扩展名来提供它。为什么不使用能够生成真实 Excel 文件的库? EPPlus、NPOI、封闭式 XML 或 Office XML SDK?
  • 即使我将其渲染为 HTML 或 iTextSharp 等外部第三方工具,Gridview1.RenderControl(hw) 也会由于某种原因跳过最后一行
  • 如果你使用我上面提到的其中一个库直接导出数据源而不是通过GridView,你就不会遇到这个问题。
  • 我的工作需要最少的第三方工具依赖。由于我能够导出并获取 excel 文件,可能是一些小的代码更改可能会修复它并满足要求
  • 这太荒谬了。你应该让他们清楚你的用例:你需要生成实际有效的 Excel 文件,而不是 hacky junk。重新发明轮子是危险的,浪费你和公司的时间。反正Office XML SDK是微软提供的,可能他们不会认为是第3方。

标签: c# asp.net gridview


【解决方案1】:

这对我来说很好用。这是我的简单数据代码。我的 aspx 页面只有一个网格和一个导出按钮

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
    DataTable dt = new DataTable();
    dt.Columns.Add("Id");
    DataRow dr = dt.NewRow();
    dr["Id"] = 1;
    dt.Rows.Add(dr);

    dr = dt.NewRow();
    dr["Id"] = 2;
    dt.Rows.Add(dr);

    //To Export all pages
    grdTest.AllowPaging = false;
    grdTest.AllowSorting = false;
    grdTest.DataSource = dt;
    grdTest.DataBind();
}
public override void VerifyRenderingInServerForm(Control control)
{
    /* Verifies that the control is rendered */
}

protected void btnExport_Click(object sender, EventArgs e)
{
    {
        Response.Clear();
        Response.Buffer = true;
        Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.xls");
        Response.Charset = "";
        Response.ContentType = "application/vnd.ms-excel";
        using (StringWriter sw = new StringWriter())
        {
            HtmlTextWriter hw = new HtmlTextWriter(sw);

            grdTest.RenderControl(hw); //here gridview is not rendering last row 

            //style to format numbers to string
            string style = @"<style> .textmode { } </style>";
            Response.Write(style);
            Response.Output.Write(sw.ToString());
            Response.Flush();
            Response.End();
        }
    }
}

【讨论】:

    【解决方案2】:

    我无法在任何地方在线找到解决方案,但我找到了发生这种情况的原因,这是由于在 rowDatabound 上的 gridview 中添加了一个额外的 GridviewRow,并且添加的单行跳过了最后一行。

    为了解决这个问题,在 gridview 数据绑定之前,我添加了一个空的页脚行来解决这个问题:

            DataRow dr= dt.NewRow();
            dt.Rows.Add(dr);
            GridView1.DataSource = dt;
            GridView1.DataBind();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多