TableRow样式用于导出到Excel

时间:2012-09-21 07:18:15

标签: c# asp.net .net

我有以下代码用于导出到gridview的excel。我将gridview行添加到System.Web.UI.WebControls.Table中。现在,我需要将背景颜色应用于导出的Excel中的标题和数据行(有两个标题行)。

我厌倦了以下。它没有提供所需的结果。

当前解决方案的问题

  1. 一个标题行没有背景颜色
  2. 着色应用于没有数据的单元格(单元格“H”,“I”等)
  3. 我们如何纠正它?

    enter image description here

    注意:我正在尝试学习导出功能。因此,请不要建议使用任何第三方控件。我正在探索这种方法的所有功能。

    我使用以下代码将标题分组添加到原始gridview。

    protected void gvCustomers_RowCreated(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.Header)
        {
            System.Text.StringBuilder sbNewHeader = new StringBuilder();
            sbNewHeader.AppendFormat("&nbsp;</th>" +
                "<th colspan='2' class='tableColGroupAssociate'>Associate Info <a href='#' class='associateHide'> Hide </a> </th>" +
                "<th colspan='2' class='tableColGroupTransaction'>Financial Info <a href='#' class='financialHide'> Hide </a> </th>" +
                "<th colspan='2' class='tableColGroupDailyTax'>Tax Info <a href='#' class='dailyTaxHide'> Hide </a> </th>"
                + "</tr>");
            sbNewHeader.AppendFormat("<tr class='{0}'><th>{1}", this.gvCustomers.HeaderStyle.CssClass, e.Row.Cells[0].Text);
            e.Row.Cells[0].Text = sbNewHeader.ToString();
        }
    }
    

    完整代码

    public static void Export(GridView gv)
    {
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", "MyExcelFile.xls"));
        HttpContext.Current.Response.ContentType = "application/ms-excel";
    
        using (StringWriter stringWriter = new StringWriter())
        {
            using (HtmlTextWriter tetxWriter = new HtmlTextWriter(stringWriter))
            {
    
                System.Web.UI.WebControls.Table tableControl = new Table();
                tableControl.GridLines = gv.GridLines;
    
                //Before the next step - we can remove any controls inside the gridview and replace with literal control
    
                //  Add the header row to the table
                if (gv.HeaderRow != null)
                {
                    TableRow tableRow = gv.HeaderRow;
                    tableRow.Style[System.Web.UI.HtmlTextWriterStyle.BackgroundColor] = "Orange";
                    tableControl.Rows.Add(gv.HeaderRow);
                }
    
                //  Add each of the data rows to the table
                foreach (GridViewRow row in gv.Rows)
                {
                    TableRow tableRow = row;
                    tableRow.Style[System.Web.UI.HtmlTextWriterStyle.BackgroundColor] = "Yellow";
                    tableControl.Rows.Add(row);
                }
    
    
                //  Render the table into the htmlwriter
                tableControl.RenderControl(tetxWriter);
    
                //  Render the htmlwriter into the response
                HttpContext.Current.Response.Write(stringWriter.ToString());
                HttpContext.Current.Response.End();
    
    
            }
        }
    }
    

    修改

    根据Ankit的评论,我尝试了以下方法;结果仍然不如预期。

                if (gv.HeaderRow != null)
                {
                    TableRow tableRow = gv.HeaderRow;
    
                    foreach (TableCell cell in tableRow.Cells)
                    {
                        cell.Style[System.Web.UI.HtmlTextWriterStyle.BackgroundColor] = "Orange";
                    }
                    tableControl.Rows.Add(gv.HeaderRow);
                }
    

    enter image description here


2 个答案:

答案 0 :(得分:1)

如果您想更好地控制excel文件的编写方式,请查看ClosedXML

添加表格就像

一样简单
var wb = new XLWorkbook();
wb.Worksheets.Add(myDataTable);
wb.SaveAs("MySheet.xlsx");

使用API​​,您可以这样编码:

var rngTable = ws.Range("B2:F6");
rngTable.FirstCell().Style
    .Font.SetBold()
    .Fill.SetBackgroundColor(XLColor.CornflowerBlue)
    .Alignment.SetHorizontal(XLAlignmentHorizontalValues.Center);

答案 1 :(得分:0)

我想办法做到这一点......为了别人的利益,我会在这里发布:

参考文献:

  1. ASP.NET Excel export encoding problem
  2. enter image description here

    其他注意:创建新表时,TableSection可用于定义标题

     newRow.TableSection = TableRowSection.TableHeader;
    

    <强> CODE

    //更改了用于为HTML呈现添加动态标头的逻辑:

    protected void gvCustomers_RowCreated(object sender, GridViewRowEventArgs e)
    {
    
        if (e.Row.RowType == DataControlRowType.Header)
        {
            GridViewRow newHeaderRow = new GridViewRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal);
    
            TableCell cell1 = new TableHeaderCell();
            cell1.ColumnSpan = 1; //e.Row.Cells.Count;
            cell1.Text = "";
    
            TableCell cell2 = new TableCell();
            cell2.ColumnSpan = 2;
            cell2.Text = "One";
    
            TableCell cell3 = new TableCell();
            cell3.ColumnSpan = 2;
            cell3.Text = "Two";
    
            TableCell cell4 = new TableCell();
            cell4.ColumnSpan = 2;
            cell4.Text = "Three";
    
            newHeaderRow.Cells.Add(cell1);
            newHeaderRow.Cells.Add(cell2);
            newHeaderRow.Cells.Add(cell3);
            newHeaderRow.Cells.Add(cell4);
    
            ((GridView)sender).Controls[0].Controls.AddAt(0, newHeaderRow);
        }
    
        if (e.Row.RowType == DataControlRowType.Header)
        {
    
            //System.Text.StringBuilder sbNewHeader = new StringBuilder();
            //sbNewHeader.AppendFormat("&nbsp;</th>" +
            //    "<th colspan='2' class='tableColGroupAssociate'>Associate Info <a href='#' class='associateHide'> Hide </a> </th>" +
            //    "<th colspan='2' class='tableColGroupTransaction'>Financial Info <a href='#' class='financialHide'> Hide </a> </th>" +
            //    "<th colspan='2' class='tableColGroupDailyTax'>Tax Info <a href='#' class='dailyTaxHide'> Hide </a> </th>"
            //    + "</tr>");
            //sbNewHeader.AppendFormat("<tr class='{0}'><th>{1}", this.gvCustomers.HeaderStyle.CssClass, e.Row.Cells[0].Text);
            //e.Row.Cells[0].Text = sbNewHeader.ToString();
    
    
        }
    
    }
    

    //导出逻辑 - 再次应用类似的逻辑

    public static void Export(GridView gv)
    {
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", "MyExcelFile.xls"));
        HttpContext.Current.Response.ContentType = "application/ms-excel";
    
    
        //Response.ContentEncoding = System.Text.Encoding.Unicode;
        //Response.BinaryWrite(System.Text.Encoding.Unicode.GetPreamble());
    
    
        using (StringWriter stringWriter = new StringWriter())
        {
            using (HtmlTextWriter tetxWriter = new HtmlTextWriter(stringWriter))
            {
    
                System.Web.UI.WebControls.Table tableControl = new Table();
                tableControl.GridLines = gv.GridLines;
    
                //  Add the header row to the table
                if (gv.HeaderRow != null)
                {
                    ReplaceControlForExport(gv.HeaderRow);
    
    
                    #region Dynamic Frrst Header Row
    
                    TableRow newRow = new TableRow();
    
                    TableCell cell1 = new TableHeaderCell();
                    cell1.ColumnSpan = 1; 
                    cell1.Text = "";
    
                    TableCell cell2 = new TableCell();
                    cell2.ColumnSpan = 2;
                    cell2.Text = "One";
    
                    TableCell cell3 = new TableCell();
                    cell3.ColumnSpan = 2;
                    cell3.Text = "Two";
    
                    TableCell cell4 = new TableCell();
                    cell4.ColumnSpan = 2;
                    cell4.Text = "Three";
    
                    newRow.Cells.Add(cell1);
                    newRow.Cells.Add(cell2);
                    newRow.Cells.Add(cell3);
                    newRow.Cells.Add(cell4);
    
                    foreach (TableCell cell in newRow.Cells)
                    {
                        cell.Style[System.Web.UI.HtmlTextWriterStyle.BackgroundColor] = "Purple";
                    }
                    tableControl.Rows.Add(newRow);
    
                    #endregion 
    
                    TableRow originalHeaderRow = gv.HeaderRow;
                    foreach (TableCell cell in originalHeaderRow.Cells)
                    {
                        cell.Style[System.Web.UI.HtmlTextWriterStyle.BackgroundColor] = "Orange";
                    }
                    tableControl.Rows.Add(originalHeaderRow);
                }
    
    
                //  Add each of the data rows to the table
                foreach (GridViewRow row in gv.Rows)
                {
                    ReplaceControlForExport(row);
    
                    TableRow tableRow = row;
                    foreach (TableCell cell in tableRow.Cells)
                    {
                        cell.Style[System.Web.UI.HtmlTextWriterStyle.BackgroundColor] = "Yellow";
                    }
                    tableControl.Rows.Add(row);
                }
    
    
                //  Render the table into the htmlwriter
                tableControl.RenderControl(tetxWriter);
    
                //  Render the htmlwriter into the response
                HttpContext.Current.Response.Write(stringWriter.ToString());
                HttpContext.Current.Response.End();
    
    
            }
        }
      }
    
     private static void ReplaceControlForExport(Control mainControlElement)
     {
        for (int i = 0; i < mainControlElement.Controls.Count; i++)
        {
            Control currentControl = mainControlElement.Controls[i];
    
            if (currentControl is LinkButton)
            {
                mainControlElement.Controls.Remove(currentControl);
                mainControlElement.Controls.AddAt(i, new LiteralControl((currentControl as LinkButton).Text));
            }
            else if (currentControl is ImageButton)
            {
                mainControlElement.Controls.Remove(currentControl);
                mainControlElement.Controls.AddAt(i, new LiteralControl((currentControl as ImageButton).AlternateText));
            }
            else if (currentControl is HyperLink)
            {
                mainControlElement.Controls.Remove(currentControl);
                mainControlElement.Controls.AddAt(i, new LiteralControl((currentControl as HyperLink).Text));
            }
            else if (currentControl is DropDownList)
            {
                mainControlElement.Controls.Remove(currentControl);
                mainControlElement.Controls.AddAt(i, new LiteralControl((currentControl as DropDownList).SelectedItem.Text));
            }
            else if (currentControl is CheckBox)
            {
                mainControlElement.Controls.Remove(currentControl);
                mainControlElement.Controls.AddAt(i, new LiteralControl((currentControl as CheckBox).Checked ? "True" : "False"));
            }
    
            //Recursive Call
            if (currentControl.HasControls())
            {
                ReplaceControlForExport(currentControl);
            }
        }
    }