C# Gridview未导出excel中的最后一行

C# Gridview未导出excel中的最后一行,c#,asp.net,gridview,C#,Asp.net,Gridview,我正在尝试将gridview的内容导出到excel工作表,但excel工作表中始终缺少gridview的最后一行 我认为这可能是由于标题行,但无法找出如何克服这一点。下面是导出到excel工作表的代码 private void btnExportToExcel_OnClick(object sender, EventArgs e) { Response.Clear(); Response.Buffer = true; Response.Ad

我正在尝试将gridview的内容导出到excel工作表,但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();
        }
    }
private void btnExportToExcel\u OnClick(对象发送方,事件参数e)
{
Response.Clear();
Response.Buffer=true;
AddHeader(“内容处置”、“附件;文件名=GridViewExport.xls”);
响应。Charset=“”;
Response.ContentType=“application/vnd.ms excel”;
使用(StringWriter sw=new StringWriter())
{
HtmlTextWriter hw=新的HtmlTextWriter(sw);
//导出所有页面的步骤
GridView1.AllowPaging=false;
GridView1.RenderControl(hw);//此处gridview不渲染最后一行
//将数字格式化为字符串的样式
字符串样式=@“.textmode{}”;
回应。写作(风格);
Response.Output.Write(sw.ToString());
Response.Flush();
Response.End();
}
}

这对我来说很好。这是我的代码和简单的数据。我的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();
        }
    }
}
public分部类\u默认值:System.Web.UI.Page
{
受保护的无效页面加载(对象发送方、事件参数e)
{
DataTable dt=新的DataTable();
dt.列。添加(“Id”);
DataRow dr=dt.NewRow();
dr[“Id”]=1;
dt.Rows.Add(dr);
dr=dt.NewRow();
dr[“Id”]=2;
dt.Rows.Add(dr);
//导出所有页面的步骤
grdTest.allowpage=false;
grdTest.AllowSorting=false;
grdTest.DataSource=dt;
grdTest.DataBind();
}
公共覆盖无效VerifyRenderingInServerForm(控件)
{
/*验证是否呈现控件*/
}
受保护的无效btnExport\u单击(对象发送方,事件参数e)
{
{
Response.Clear();
Response.Buffer=true;
AddHeader(“内容处置”、“附件;文件名=GridViewExport.xls”);
响应。Charset=“”;
Response.ContentType=“application/vnd.ms excel”;
使用(StringWriter sw=new StringWriter())
{
HtmlTextWriter hw=新的HtmlTextWriter(sw);
grdTest.RenderControl(hw);//此处gridview不渲染最后一行
//将数字格式化为字符串的样式
字符串样式=@“.textmode{}”;
回应。写作(风格);
Response.Output.Write(sw.ToString());
Response.Flush();
Response.End();
}
}
}

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

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

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

无论如何,您并不是在创建Excel文件。您是在创建HTML文件,然后使用Excel MIME类型和文件扩展名提供它。为什么不使用能够生成真正Excel文件的库呢?EPPlus、NPOI、Closed XML或Office XML SDK?即使我将其呈现为HTML或外部第三方工具,如iTextSharp、Gridview1.RenderControl(hw)由于某些原因,将跳过最后一行。如果您使用我上面提到的某个库直接导出数据源,而不是通过GridView,则不会出现此问题。我的工作要求对第三方工具的依赖性最小。由于我能够导出并获取excel文件,可能需要一些小的代码更改,以解决此问题你应该把你的用例清楚地告诉他们:你需要生成实际有效的Excel文件,而不是杂乱无章的垃圾。重新发明轮子是危险的,浪费你的时间和公司的时间。无论如何,Office XMLSDK是由微软提供的,也许他们不会认为这是第三方。