将 GridView 导出到 Excel 2007

Posted

技术标签:

【中文标题】将 GridView 导出到 Excel 2007【英文标题】:Export GridView to Excel 2007 【发布时间】:2014-12-20 06:27:52 【问题描述】:

我想将 gridview 导出到 excel 2007,我正在使用的代码可以使用 mime 类型 application/vnd.ms-excel (excel 2003) 导入到 excel 2007 但我收到一条警告消息,上面写着“文件您尝试打开的格式不同...”,单击“是”和“否”,打开文件,购买我不能为客户提供此消息。并使用 excel 2007 的 mime 类型( application/vnd.openxmlformats-officedocument.spreadsheetml.sheet) 文件甚至无法打开“Excel 无法打开文件,因为格式或扩展名无效”。

这是我现在使用的代码:

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.IO;
using System.Drawing;


namespace TesteFornecedores

    public partial class Default : System.Web.UI.Page
    
        protected void Page_Load(object sender, EventArgs e)
        
            if (!this.IsPostBack)
            
                this.BindGrid();
            
        

        private void BindGrid()
        
            using (DataSet ds = new DataSet())
            
                ds.ReadXml(Server.MapPath("~/Customers.xml"));
                GridView1.DataSource = ds;
                GridView1.DataBind();
            
        


        protected void OnPageIndexChanging(object sender, GridViewPageEventArgs e)
        
            GridView1.PageIndex = e.NewPageIndex;
            this.BindGrid();
        




        protected void ExportToExcel(object sender, EventArgs e)
        
            Response.Clear();
            Response.Buffer = true;
            Response.AddHeader("content-disposition", "attachment;  filename=ExcelList");
            Response.Charset = "";
            Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            using (StringWriter sw = new StringWriter())
            
                htmlTextWriter hw = new HtmlTextWriter(sw);

                //To Export all pages
                GridView1.AllowPaging = false;
                this.BindGrid();

                GridView1.HeaderRow.BackColor = Color.White;
                foreach (TableCell cell in GridView1.HeaderRow.Cells)
                
                    cell.BackColor = GridView1.HeaderStyle.BackColor;
                
                foreach (GridViewRow row in GridView1.Rows)
                
                    row.BackColor = Color.White;
                    foreach (TableCell cell in row.Cells)
                    
                        if (row.RowIndex%2 == 0)
                        
                            cell.BackColor = GridView1.AlternatingRowStyle.BackColor;
                        
                        else
                        
                            cell.BackColor = GridView1.RowStyle.BackColor;
                        
                        cell.CssClass = "textmode";
                    
                

                GridView1.RenderControl(hw);

                //style to format numbers to string
                string style = @"<style> .textmode   </style>";
                Response.Write(style);
                Response.Output.Write(sw.ToString());
                Response.Flush();
                Response.End();
            
        

        public override void VerifyRenderingInServerForm(Control control)
        
            /* Verifies that the control is rendered */
        
    

有人知道可以帮我在 excel 2007 中打开这个 gridview 的解决方案吗?

谢谢。

【问题讨论】:

【参考方案1】:

您没有导出为实际的 Excel 格式。您正在创建一个 HTML 文件,并且由于您提供了 Excel 知道如何处理的 MIME 类型,因此 Excel 会尝试打开它。 Excel 确实知道如何读取基本的 HTML 文件,但很难控制格式,您会收到警告消息。

相反,您需要做的是使用可以为您生成它们的库来生成 .xlsx 文件。这方面的例子是EPPlus 和Open Office XML SDK。请注意,您需要避免使用基于 Excel 互操作的解决方案,因为 Microsoft 在服务器端不支持这些解决方案,它们将难以调试,并且会引起头痛。

顺便说一句,不要认为它是“导出一个 GridView”。这是一个糟糕的做法。 GridView 是用于在 HTML 中显示数据的 UI 元素。将其视为“我如何导出这些数据?”在您的情况下,将其视为导出 DataSet 或 XML 类型的数据。

【讨论】:

【参考方案2】:
        Response.Clear();
        Response.ContentType = "application/excel";
        Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
        Response.BinaryWrite(objectData);//objectData is binary data
        Response.End();

您的回复应该是这样的。我很确定您的代码将不起作用,因为您没有向响应提供有效的 excel 文件,请阅读OleDbConnection

使用来自 Grid 的 DataSource 的 DataSet。之后构建OleDbConnection

OleDbConnection conn = new OleDbConnection();


string connectString = String.Format(
                    "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=0;Extended Properties='Excel 12.0 Xml;HDR=1;'",
                    fileName, "YES");

                conn.ConnectionString = connectString;
                conn.Open();

 OleDbCommand comm = new OleDbCommand();
 comm.CommandText = string.Format("CREATE TABLE [0] ", "TableName");

DataSet 中的列添加到 comm.CommanText。构建dataSet 列结构的副本。之后:

comm.Connection = conn;
comm.ExecuteNonQuery();

现在您已经创建了具有与您的数据集相同的列的表。

现在你应该更新内容

            OleDbDataAdapter ad = new OleDbDataAdapter(
                string.Format("SELECT * FROM [0]", "TableName"), conn);
            OleDbCommandBuilder builder = new OleDbCommandBuilder(ad);
            builder.QuotePrefix = "[";
            builder.QuoteSuffix = "]";

             // Saves the data set
            ad.Update(DataSetFromTheGrid);

现在您在表格中填满了数据。 //注意文件名与连接字符串中的文件名相同! FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);

            BinaryReader reader = new BinaryReader(fs);
            excelBytes = reader.ReadBytes((int)fs.Length);
            //after the returned bytes it will be good to delete the file !

将此字节返回给响应,您就有了您的 excel 文件。

【讨论】:

以上是关于将 GridView 导出到 Excel 2007的主要内容,如果未能解决你的问题,请参考以下文章

将GridView导出到Excel,并在网页上显示完全相同的样式

如何在 C# 中将文件导出到 excel 2007+

将数据导出到Excel2007格式。

把GridView1的数据导出到excel的sheet1把GridView2的数据导出到excel的sheet2.

将大型数据查询(60k+ 行)导出到 Excel

将大型数据查询(60k+ 行)导出到 Excel