locked
excel file shows empty which generated from my website. RRS feed

  • Question

  • User1487175000 posted

    Hi,

    I am generating excel sheet on my webpage. Gridview is used on the page and then i generate html of gridview and save as excel. 

    Problem:

    Suddenly my user complain when they open the excel sheet its shows noting. But when i tried on my computer its shows the data. However problem is not with one user i received complain from many user. I did not find any clue what to do. 

    Code which generate excel:

    using System.IO;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    
    public class GridViewExportUtil
    {
    
        public static void Export(string fileName, GridView gv)
        {
            HttpContext.Current.Response.Clear();
            HttpContext.Current.Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", fileName));
            HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.Default;
            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();
    
                    //  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>
        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"));
                }
                else if (current is TextBox)
                {
                    control.Controls.Remove(current);
                    control.Controls.AddAt(i, new LiteralControl((current as TextBox).Text));
                }
    
                if (current.HasControls())
                {
                    GridViewExportUtil.PrepareControlForExport(current);
                }
            }
        }
    }

    Excel snapshot:

    Tuesday, August 23, 2016 9:28 PM

Answers

  • User283571144 posted

    Hi Shahid,

    shahid.majeed

    Suddenly my user complain when they open the excel sheet its shows noting. But when i tried on my computer its shows the data. However problem is not with one user i received complain from many user. I did not find any clue what to do. 

    According to your codes, I had written a demo on my computer, it works well, too.

    I use VS 2015 , and my excel version is Excel 2016.

    From mikes article:

    A Better Way To Export Gridviews To Excel

    I guess there are something wrong with using the RenderControl method to generate HTML and then save it to a file with a .xls extension.

    This kind of works, but the resulting file is actually an HTML file masquerading as an Excel file.

    And that has two flaws: it cannot be used as a data source because providers complain that it is not in an acceptable format, and users of Office 2007 or newer are always confronted with a warning about the contents of the file when they try to open it, causing confusion, suspicion or annoyance.

    So I suggest you could change your codes, not using RenderControl method.

    You could use EPPlus, it could be downloaded from Nuget Package Manager.

    Link:http://epplus.codeplex.com/

    Best Regards,

    Brando

     

    • Marked as answer by Anonymous Thursday, October 7, 2021 12:00 AM
    Wednesday, August 24, 2016 3:19 AM