代码之家  ›  专栏  ›  技术社区  ›  Justin C

将GridView导出到Excel而不丢失Excel中的网格线

  •  4
  • Justin C  · 技术社区  · 16 年前

    我有一个要导出到Excel的GridView。当我使用我在网上找到的示例代码时,它会很好地将内容导出到Excel,但由于某些原因,它还会清除导出表之外的所有网格线。

    那么,有没有一种方法可以将GridView中的数据导出到Excel工作簿中,使其看起来就像刚刚输入Excel一样?我已经在下面粘贴了我正在使用的代码,假设一个名为toPrint的GridView存在并且有准确的数据。

    Response.Clear();
    Response.AddHeader("content-disposition", "attachment; filename=" + name + "_Registration_Forms.xls");
    Response.Charset = "";
    Response.ContentType = "application/vnd.ms-excel";
    Page.EnableViewState = false;
    
    System.IO.StringWriter stringWrite = new System.IO.StringWriter();
    System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
    
    toPrint.RenderControl(htmlWrite);
    
    Response.Write(stringWrite.ToString());
    Response.End();
    

    编辑:找到一个部分解决方案。如果我导出为逗号分隔的列表,并将标题设置为CSV文件,它将很好地打开,并且显示所有网格线(甚至是导出数据之外的网格线)。当然,唯一的问题是在导出值之前必须从值中去掉所有逗号和换行符。

    4 回复  |  直到 16 年前
        1
  •  5
  •   Mistlin    12 年前

    下面的帖子给了我答案。 http://forums.asp.net/t/1074110.aspx

    System.IO.StringWriter dvWriter = new System.IO.StringWriter();
    System.Web.UI.HtmlTextWriter OutputGenerator = new System.Web.UI.HtmlTextWriter(dvWriter);
    
                //To put in the excel gridlines 
                dvWriter.Write(@"<html xmlns:x=""urn:schemas-microsoft-com:office:excel"">");
                dvWriter.Write(@"<head>
                                   <xml>
                                     <x:ExcelWorkbook> 
                                        <x:ExcelWorksheets>
                                           <x:ExcelWorksheet>
                                              <x:WorksheetOptions>
                                                 <x:Panes></x:Panes>
                                                 <x:Print><x:Gridlines /></x:Print>
                                              </x:WorksheetOptions>
                                            </x:ExcelWorksheet>
                                          </x:ExcelWorksheets>
                                        </x:ExcelWorkbook>
                                      </xml>
                                    </head>");
    //*******Put your Table Body here *******
    
        2
  •  3
  •   David Glass    16 年前

    我以前使用过下面的helper函数。我给了用户一个复选框,用户可以选择是否包含网格线。显然,您可以将其更改为始终包含网格线。

    namespace Helpers
    {
        public class GridViewExportUtil
        {
            public static void Export(string fileName, GridView gv, bool includeGridLines)
            {
               HttpContext.Current.Response.Clear();
               HttpContext.Current.Response.AddHeader(
                   "content-disposition", string.Format("attachment; filename={0}", fileName));
               HttpContext.Current.Response.ContentType = "application/ms-excel";
    
               using (StringWriter sw = new StringWriter())
               {
                   using (HtmlTextWriter htw = new HtmlTextWriter(sw))
                   {
                   //  Create a form to contain the grid
                   Table table = new Table();
    
                if (includeGridLines)
                {
                   table.GridLines = gv.GridLines;
                }
    
                   //  add the header row to the table
                   if (gv.HeaderRow != null)
                   {
                       GridViewExportUtil.PrepareControlForExport(gv.HeaderRow);
                       table.Rows.Add(gv.HeaderRow);
                   }
    
                   //  add each of the data rows to the table
                   foreach (GridViewRow row in gv.Rows)
                   {
                    GridViewExportUtil.PrepareControlForExport(row);
                       table.Rows.Add(row);
                   }
    
                   //  add the footer row to the table
                   if (gv.FooterRow != null)
                   {
                       GridViewExportUtil.PrepareControlForExport(gv.FooterRow);
                       table.Rows.Add(gv.FooterRow);
                   }
    
                      //  render the table into the htmlwriter
                      table.RenderControl(htw);
    
                      //  render the htmlwriter into the response
                      HttpContext.Current.Response.Write(sw.ToString());
                      HttpContext.Current.Response.End();
                  }
               }
           }
    
            /// <summary>
            /// Replace any of the contained controls with literals
            /// </summary>
            /// <param name="control"></param>
           private static void PrepareControlForExport(Control control)
            {
               for (int i = 0; i < control.Controls.Count; i++)
               {
                   Control current = control.Controls[i];
                   if (current is LinkButton)
                   {
                      control.Controls.Remove(current);
                      control.Controls.AddAt(i, new LiteralControl((current as LinkButton).Text));
                   }
                   else if (current is ImageButton)
                   {
                      control.Controls.Remove(current);
                      control.Controls.AddAt(i, new LiteralControl((current as ImageButton).AlternateText));
                   }
                   else if (current is HyperLink)
                   {
                      control.Controls.Remove(current);
                      control.Controls.AddAt(i, new LiteralControl((current as HyperLink).Text));
                   }
                   else if (current is DropDownList)
                   {
                      control.Controls.Remove(current);
                      control.Controls.AddAt(i, new LiteralControl((current as DropDownList).SelectedItem.Text));
                   }
                   else if (current is CheckBox)
                   {
                      control.Controls.Remove(current);
                      control.Controls.AddAt(i, new LiteralControl((current as CheckBox).Checked ? "True" : "False"));
                   }
    
                   if (current.HasControls())
                   {
                    GridViewExportUtil.PrepareControlForExport(current);
                   }
               }
            }
        }
    }
    

    GridViewExportUtil.Export("QueryResults.xls", GridView1, includeGridLines);
    
        3
  •  3
  •   Wayne Werner    14 年前

    我解决问题的方法是 Gridlines="Both" 内部 <datagrid> 标签。

        4
  •  0
  •   Ray de la Garza    11 年前

    VB语言

    Public Overrides Sub VerifyRenderingInServerForm(control As Control)
        'base.VerifyRenderingInServerForm(control);
    'This remains empty
    End Sub
    
    Protected Sub btnExcel_Click(sender As Object, e As ImageClickEventArgs) Handles btnExcel.Click
    
        Response.Clear()
        Response.AddHeader("content-disposition", "attachment;filename=FileName.xls")
        Response.Charset = ""
        Response.Cache.SetCacheability(HttpCacheability.NoCache)
        Response.ContentType = "application/vnd.ms-excel"
    
        Dim stringWrite As New System.IO.StringWriter()
        Dim htmlWrite As System.Web.UI.HtmlTextWriter = New HtmlTextWriter(stringWrite)
    
        htmlWrite.Write("<html xmlns:o=""urn:schemas-microsoft-com:office:office"" ")
        htmlWrite.Write("xmlns:x=""urn:schemas-microsoft-com:office:excel"" ")
        htmlWrite.Write("xmlns=""http://www.w3.org/TR/REC-html40""> ")
        htmlWrite.Write("<head> ")
        htmlWrite.Write("<!--[if gte mso 9]><xml> ")
        htmlWrite.Write("<x:ExcelWorkbook> ")
        htmlWrite.Write("<x:ExcelWorksheets> ")
        htmlWrite.Write("<x:ExcelWorksheet> ")
        htmlWrite.Write("<x:Name>Sheet1</x:Name> ")
        htmlWrite.Write("<x:WorksheetOptions> ")
        htmlWrite.Write("<x:Selected/> ")
        htmlWrite.Write("<x:ProtectContents>False</x:ProtectContents> ")
        htmlWrite.Write("<x:ProtectObjects>False</x:ProtectObjects> ")
        htmlWrite.Write("<x:ProtectScenarios>False</x:ProtectScenarios> ")
        htmlWrite.Write("</x:WorksheetOptions> ")
        htmlWrite.Write("</x:ExcelWorksheet> ")
        htmlWrite.Write("</x:ExcelWorksheets> ")
        htmlWrite.Write("</x:ExcelWorkbook> ")
        htmlWrite.Write("</xml><![endif]--> ")
        htmlWrite.Write("</head>")
        htmlWrite.WriteLine("")
    
        gridView.HeaderStyle.Reset()
        gridView.FooterStyle.Reset()
        gridView.AlternatingRowStyle.Reset()
        gridView.RowStyle.Reset()
    
        gridView.BackColor = Color.Transparent
        gridView.GridLines = GridLines.None
        gridView.RenderControl(htmlWrite)
    
        Response.Write(stringWrite.ToString())
        Response.[End]()
    End Sub
    

    public override void VerifyRenderingInServerForm(Control control)
    {
        //base.VerifyRenderingInServerForm(control);
        //This remains empty
    }
    
    
    protected void btnExcel_Click(object sender, ImageClickEventArgs e)
    {
        Response.Clear();
        Response.AddHeader("content-disposition", "attachment;filename=FileName.xls");
        Response.Charset = "";
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.ContentType = "application/vnd.ms-excel";
        System.IO.StringWriter stringWrite = new System.IO.StringWriter();
        System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
    
        htmlWrite.Write("<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" ");
        htmlWrite.Write("xmlns:x=\"urn:schemas-microsoft-com:office:excel\" ");
        htmlWrite.Write("xmlns=\"http://www.w3.org/TR/REC-html40\"> ");
        htmlWrite.Write("<head> ");
        htmlWrite.Write("<!--[if gte mso 9]><xml> ");
        htmlWrite.Write("<x:ExcelWorkbook> ");
        htmlWrite.Write("<x:ExcelWorksheets> ");
        htmlWrite.Write("<x:ExcelWorksheet> ");
        htmlWrite.Write("<x:Name>Sheet1</x:Name> ");
        htmlWrite.Write("<x:WorksheetOptions> ");
        htmlWrite.Write("<x:Selected/> ");
        htmlWrite.Write("<x:ProtectContents>False</x:ProtectContents> ");
        htmlWrite.Write("<x:ProtectObjects>False</x:ProtectObjects> ");
        htmlWrite.Write("<x:ProtectScenarios>False</x:ProtectScenarios> ");
        htmlWrite.Write("</x:WorksheetOptions> ");
        htmlWrite.Write("</x:ExcelWorksheet> ");
        htmlWrite.Write("</x:ExcelWorksheets> ");
        htmlWrite.Write("</x:ExcelWorkbook> ");
        htmlWrite.Write("</xml><![endif]--> ");
        htmlWrite.Write("</head>");
        htmlWrite.WriteLine("");
    
        gridView.HeaderStyle.Reset();
        gridView.FooterStyle.Reset();
        gridView.AlternatingRowStyle.Reset();
        gridView.RowStyle.Reset();
    
        gridView.BackColor = Color.Transparent;
        gridView.GridLines = GridLines.None;
        gridView.RenderControl(htmlWrite);
    
        Response.Write(stringWrite.ToString());
        Response.End();
    
    }
    
    推荐文章