开发者

Export GridView to Excel

开发者 https://www.devze.com 2022-12-22 21:07 出处:网络
using Matt\'s util code (a bit edited for Unicode text) public class GridViewExportUtil { /// <param name=\"fileName\"></param>

using Matt's util code

(a bit edited for Unicode text)

    public class GridViewExportUtil
{
    /// <param name="fileName"></param>
    /// <param name="gv"></param>
    public static void Export(string fileName, GridView gv)
    {
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.ContentType = "application/ms-excel";
        HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        HttpContext.Current.Response.Charset = System.Text.Encoding.Unicode.EncodingName;
        HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.Unicode;
        HttpContext.Current.Response.BinaryWrite(System.Text.Encoding.Unicode.GetPreamble());
        HttpContext.Current.Response.AddHeader(
             "content-disposition", string.Format(//"content-disposition",
                "attachment; filename=Report.xml"));//, fileName)); // Need .XLS file


        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>
    /// <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);
            }
        }
    }

Question : How to make downloaded file editable (not Read only)

And ... XLS wont opens with Unicode format. When开发者_C百科 I changing format to UTF8 I can't see Russian words :S

Second question : How to make Unicode for .xls

Third question : How can I save table lines ?

Thank you.

4 - how to create table in the NPOI sheet

            int i =0;
            if (gv.HeaderRow != null)
            {
                GridViewExportUtil.PrepareControlForExport(gv.HeaderRow);
                sheet1.CreateRow(1).CreateCell(i).SetCellValue(gv.HeaderRow.ToString());
                //table.Rows.Add(gv.HeaderRow);
                i++;
            }

like it ?


HTML is not the same thing as XML.

The SpreadsheetML language used by Excel 2002/2003 is a completely different language. If you even get Excel to open the file, it's only because it tends to recognize HTML files regardless of the file extension.

As for the Unicode issue, I think the problem is your StringWriter's Encoding setting when calling ToString().

I recommend looking into the NPOI project, which contains everything you need to create binary/BIFF (Excel 97/2000), SpreadsheetML (Excel 2002/2003), and OOXML (Excel 2007) files from .NET:

http://npoi.codeplex.com/

0

精彩评论

暂无评论...
验证码 换一张
取 消