【问题标题】:Export Grid view to excel and save excel file to folder将网格视图导出到 excel 并将 excel 文件保存到文件夹
【发布时间】:2012-05-11 19:06:00
【问题描述】:

我想保存导出网格视图数据的excel文件。我已经编写了将gridview数据导出到excel的代码,但我不知道如何保存导出的文件。

以下是我将 gridview 导出到 excel 的代码:

Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("content-disposition", "attachment;filename=MyFiles.xls");
Response.Charset = "";
this.EnableViewState = false;
System.IO.StringWriter sw = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter htw = new System.Web.UI.HtmlTextWriter(sw);
gvFiles.RenderControl(htw);
Response.Write(sw.ToString());
Response.End();

【问题讨论】:

  • 你知道你导出的不是excel文件而是html表格吗? Excel可以解释它,反正它不是一个真正的excel文件。看看EPPLus
  • 就像 Tim 所说的使用 EPPlus - 它是一个库,可以为您生成实际的 .xlsx 文件,然后您可以下载这些文件。我将它用于预算监控应用程序,非常棒。
  • 你的网格视图的数据源是什么?
  • 几乎所有的答案都在这里写一个(HtmlTextWriter)字符串或有互操作代码。两者都不要使用。这将导致您稍后在 DateTime 和 Decimal 格式方面出现问题。 Excel 也会发出警告,因为您生成的不是“真正的”Excel 文件,而是扩展名为 .xls 的 HTML 页面。开始使用专门的库来创建 Excel 文件,例如 EPPlusExample herehere.

标签: c# asp.net


【解决方案1】:

您在询问如何保存导出的文件...您的代码将呈现的 gridview (HTML) 内容放入响应中。在这种情况下,您的浏览器(客户端)将收到此响应并弹出一个对话框询问保存位置。所以您的浏览器会为您保存文件。

如果你想将它保存在服务器端,你不能将渲染的 gridview 放入响应中。而是将其写入本地硬盘上的文件(如上面的答案所示)。

请记住,在您自己的开发机器以外的环境(即生产环境)中,ASP.NET 工作进程可能没有足够的访问权限来写入硬盘上的指定位置。以下是解决该问题的几个答案:

ASP.net user account permissions
ASP.NET + Access to the path is denied
System.UnauthorizedAccessException: Access to the path is denied

【讨论】:

    【解决方案2】:

    你可以这样做:

    private void ExportGridView()
    {
        System.IO.StringWriter sw = new System.IO.StringWriter();
        System.Web.UI.HtmlTextWriter htw = new System.Web.UI.HtmlTextWriter(sw);
    
        // Render grid view control.
        gvFiles.RenderControl(htw);
    
        // Write the rendered content to a file.
        string renderedGridView = sw.ToString();
        System.IO.File.WriteAllText(@"C:\Path\On\Server\ExportedFile.xlsx", renderedGridView);
    }
    

    【讨论】:

    • 出现错误 'GridView' 类型的控件 'gvFiles' 必须放在带有 runat=server 的表单标签内。 :(
    • 得到了 ans public override void VerifyRenderingInServerForm(Control control) { }
    【解决方案3】:

    这可能会对你有所帮助//

    protected void exporttoexcel_Click(object sender, EventArgs e)
    {
        Response.Clear();
    
        Response.AddHeader("content-disposition", "attachment;filename=" attachment" + ".xls");
    
        Response.Charset = "";
    
        // If you want the option to open the Excel file without saving than
    
        // comment out the line below
    
        // Response.Cache.SetCacheability(HttpCacheability.NoCache);
    
        Response.ContentType = "application/vnd.xls";
    
        System.IO.StringWriter stringWrite = new System.IO.StringWriter();
    
        System.Web.UI.HtmlTextWriter htmlWrite =
        new HtmlTextWriter(stringWrite);
    
        GridView1.RenderControl(htmlWrite);
    
        Response.Write(stringWrite.ToString());
    
        Response.End();
    
    }
    public override void VerifyRenderingInServerForm(Control control)
    {
    
        // Confirms that an HtmlForm control is rendered for the
        //specified ASP.NET server control at run time.
    
    }
    

    【讨论】:

    • 这帮助我编写了完整的 Export-To-Excel 代码。我只是不太确定是否将 VerifyRenderingInServerForm(Control control) 保留为空。
    【解决方案4】:

    点击链接:C# Excel file OLEDB read HTML IMPORT

    使用Extended Properties=\"HTML Import;HDR=No;IMEX=1 the select * from [tablename], 表名从GetOleDbSchemaTable返回。

    注意:这不会加载正常的 excel。为此使用Extended Properties=\"Excel 8.0;HDR=No;IMEX=1\,其中表名将带有$ 符号。

    查看示例代码: Can't read excel file after creating it using File.WriteAllText() function

    【讨论】:

      【解决方案5】:
      public partial class exportgridtoexcel : System.Web.UI.Page
      {
          SqlConnection con=new SqlConnection(ConfigurationManager.ConnectionStrings["dbconnection"].ConnectionString.ToString());
          protected void Page_Load(object sender, EventArgs e)
          {
              if (!Page.IsPostBack)
              {
                  GetData();
              }
          }
          public void GetData()
          {
              SqlDataAdapter sda = new SqlDataAdapter("select * from EmpData", con);
              DataTable dt = new DataTable();
              sda.Fill(dt);
              GridView1.DataSource = dt;
              GridView1.DataBind();
          }
      
          protected void btnDownload_Click(object sender, EventArgs e)
          {
              GetData();
              exporttoexcel("Report.xls", GridView1);
              GridView1 = null;
              GridView1.Dispose();
      
      
      
          }
          public void exporttoexcel(string filename,GridView gv)
          {
              Response.ClearContent();
              Response.AddHeader("content-disposition", "attachment;filename=" + filename);
              Response.ContentType = "applicatio/excel";
              StringWriter sw = new StringWriter(); ;
              HtmlTextWriter htm=new HtmlTextWriter(sw);
              gv.RenderControl(htm);
              Response.Write(sw.ToString());
              Response.End();
          }
          public override void VerifyRenderingInServerForm(Control control)
          {
      
          }
      }
      

      }

      【讨论】:

        【解决方案6】:

        这里解决了这个问题的另一个解决方案:http://codentq.wordpress.com/2014/02/13/write-excel-file-from-dataset/

        您必须通过本文提到的方法在数据集中获取网格视图数据:http://codentq.wordpress.com/2014/02/13/get-data-from-grid-to-datatable-or-dataset/

        【讨论】:

          【解决方案7】:

          首先将EPPLUS参考库添加到应用程序中,使用OfficeOpenXml添加;

          //业务对象类

          类 bocl {

              string name;
          
              public string NAME
              {
                  get { return name; }
                  set { name = value; }
              }
              string id;
          
              public string ID
              {
                  get { return id; }
                  set { id = value; }
              }
          
          
          
              public bocls() { }
              public bocls(string name, string id)
              {
                  this.name = name;
                  this.id = id;         
          
              }
          

          //在导出按钮点击事件中

          protected void lbtnExport_Click(object sender, EventArgs e) {

                      List<bocls> list6 =  new List<bocls>();
                     //copy the grid view values into list
                      list6 = (from row in dataGridView1.Rows.Cast<DataGridViewRow>()
                      from cell in row.Cells.Cast<DataGridViewCell>()
                      select new 
                      {
                          //project into your new class from the row and cell vars.
                      }).ToList();
              }
                      ExcelPackage excel = new ExcelPackage();
                      var workSheet = excel.Workbook.Worksheets.Add("Products");
                      var totalCols = GridView1.Rows[0].Cells.Count;
                      var totalRows = GridView1.Rows.Count;
                      var headerRow = GridView1.HeaderRow;
                      for (var i = 1; i <= totalCols; i++)
                      {
                          workSheet.Cells[1, i].Value = headerRow.Cells[i - 1].Text;
                      }
                      for (var j = 1; j <= totalRows; j++)
                      {
                          for (var i = 1; i <= totalCols; i++)
                          {
                              var item = list6.ElementAt(j - 1);
          
                              workSheet.Column(1).Width = 13;
                              workSheet.Column(2).Width = 10;
          
                              workSheet.Cells[j + 1, i].Style.WrapText = true;
          
                              if (headerRow.Cells[i - 1].Text == "ID")
                                  workSheet.Cells[j + 1, i].Value = item.GetType().GetProperty("id").GetValue(item, null);
                              else if (headerRow.Cells[i - 1].Text == "NAME")
                                  workSheet.Cells[j + 1, i].Value = item.GetType().GetProperty("name").GetValue(item, null);
          
                              workSheet.Cells[j + 1, i].Value = workSheet.Cells[j + 1, i].Value.ToString().Replace("<br/>", "");
                          }
                      }
                      using (var memoryStream = new MemoryStream())
                      {
          
                          Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                          string filename = Guid.NewGuid().ToString() + ".xlsx";
                          Response.AddHeader("content-disposition", "attachment;  filename=" + filename);
                          excel.SaveAs(memoryStream);   
                          //add your destination folder
                          FileStream fileStream = new FileStream(@"C:\Users\karthi\Downloads\New folder\" + filename, FileMode.Create,FileAccess.Write,FileShare.Write);
                          memoryStream.WriteTo(fileStream);
                          fileStream.Close();
                          memoryStream.WriteTo(Response.OutputStream);
                          memoryStream.Close();
                          memoryStream.WriteTo(Response.OutputStream);
                          Response.Flush();
                          Response.End();
                      }
          
              }
          

          【讨论】:

            猜你喜欢
            • 2011-11-29
            • 1970-01-01
            • 1970-01-01
            • 2014-10-01
            • 2019-02-05
            • 2013-08-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多