【问题标题】:How to export c# datagridview into Excel如何将c#datagridview导出到Excel
【发布时间】:2011-12-29 11:28:01
【问题描述】:

在我的应用程序中,需要将 datagridview 导出到 Excel 中。

我正在使用以下源代码。我想就以下问题寻求专家建议。

  1. 我的代码是否正确?因为我没有在所选路径中保存任何文件。

  2. 从网格导出数据时是否存在任何性能问题,因为网格中可能有尽可能多的可用数据?

  3. 我正在使用命名空间“Microsoft.Office.Interop.Excel”,不确定是否正确?
  private void btnSaveResult_Click(object sender, EventArgs e)
        {
            try
            {
                if (this.saveFileDialog.ShowDialog() == DialogResult.OK)
                {
                    saveFileDialog.Filter = "Execl files (*.xls)|*.xls";
                    saveFileDialog.FilterIndex = 0;
                    saveFileDialog.RestoreDirectory = true;
                    saveFileDialog.CreatePrompt = true;
                    saveFileDialog.Title = "Export Excel File To";
                    Microsoft.Office.Interop.Excel.ApplicationClass ExcelApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
                    ExcelApp.Application.Workbooks.Add(Type.Missing);
                    ExcelApp.Columns.ColumnWidth = 30;
                    for (int i = 0; i < grdResult.Rows.Count; i++)
                    {
                        DataGridViewRow row = grdResult.Rows[i];
                        for (int j = 0; j < row.Cells.Count; j++)
                        {
                            ExcelApp.Cells[i + 1, j + 1] = row.Cells[j].ToString();
                        }
                    }                    
                    ExcelApp.ActiveWorkbook.Saved = true;
                    ExcelApp.Quit();
                    MessageBox.Show("The Save button was clicked or the Enter key was pressed" + "\nThe file would have been saved as " + this.saveFileDialog.FileName);

                }
                else MessageBox.Show("The Cancel button was clicked or Esc was pressed");

            }
            catch (Exception ex)
            {
                MessageBox.Show("Cancelled Save Operation");
                this.Close();
            }


        }

【问题讨论】:

    标签: c# excel datagridview


    【解决方案1】:

    在添加时获取工作簿的句柄,并调用 Workbook.SaveCopyAs(filePath);

    【讨论】:

      【解决方案2】:

      尝试关注课程

          using System;
          using System.Data;
          using System.Configuration;
          using System.IO;
          using System.Web;
          using System.Web.Security;
          using System.Web.UI;
          using System.Web.UI.WebControls;
          using System.Web.UI.WebControls.WebParts;
          using System.Web.UI.HtmlControls;
      
          /// <summary>
          /// Summary description for GridViewExportUtil
          /// </summary>
          public class GridViewExportUtil
          {
      public GridViewExportUtil()
      {
          //
          // TODO: Add constructor logic here
          //
      }
          public static void ExportGridView(string fileName, GridView gv, Label header, Label date)
              {
                  HttpContext.Current.Response.Clear();
                  HttpContext.Current.Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", fileName));
                  HttpContext.Current.Response.ContentType = "application/ms-excel";
      
                  using (StringWriter sw = new StringWriter())
                  {
                      using (HtmlTextWriter htw = new HtmlTextWriter(sw))
                      {
                          gv.AllowPaging = false;
                          //  Create a table to contain the grid
                          Table table = new Table();
      
                          //  include the gridline settings
                          table.GridLines = gv.GridLines;
      
                          gv.Style["font-family"] = "Tahoma";
                          //  add the header row to the table
      
                          if (gv.HeaderRow != null)
                          {
                              GridViewExportUtil.PrepareControlForExport(gv.HeaderRow);
                              gv.HeaderRow.BackColor = System.Drawing.Color.Lavender;
                              gv.HeaderRow.ForeColor = System.Drawing.Color.Green;
      
                              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);
                          }
                          htw.WriteLine("<br>");
                          // htw.WriteLine("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
                          if (header.Text != null)
                          {
                              header.Font.Size = 15;
                              header.Font.Bold = true;
                              header.ForeColor = System.Drawing.Color.Blue;
                              header.RenderControl(htw);
                          }
                          htw.WriteLine("</p>");
                          //  render the table into the htmlwriter
                          table.RenderControl(htw);
                          htw.WriteLine("<br>");
                          htw.WriteLine("Report taken on :", System.Drawing.FontStyle.Bold);
                          if (date.Text != null)
                          {
                              date.ForeColor = System.Drawing.Color.Blue;
                              date.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"));
                      }
                      else if (current is Label)
                      {
                          control.Controls.Remove(current);
                          control.Controls.AddAt(i, new LiteralControl((current as Label).Text));
                      }
      
                      if (current.HasControls())
                      {
                          GridViewExportUtil.PrepareControlForExport(current);
                      }
                  }
              }
          }
      

      并如下使用它

         protected void Button1_Click(object sender, EventArgs e)
             {
          Label1.Visible = true;
          Label2.Visible = true;
      
          Label1.Text = "Login Information Data";
          Label2.Text = Convert.ToString(System.DateTime.Now);
      
          if (GridView1.Visible == true)
          {
              // GridViewExportUtil.Export("StateReport.xls", GridView1);
              GridViewExportUtil.ExportGridView("LoginInformation.xls", GridView1, Label1, Label2);
          }
      
             }
      

      如果您不想要标签,请删除它们。根据需要进行更改。

      【讨论】:

        【解决方案3】:

        实施弱点: - 你不会释放你使用的资源; - 您一个一个地导出项目(它非常慢),为此设计了一个范围,您可以在其中设置 object[,] (boxed int, strings, ...); - 你不处理文本的格式(Excel 关于格式的决定是不正确的), - 你混合视图和导出逻辑。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-15
          • 1970-01-01
          • 2014-04-09
          • 2013-09-11
          相关资源
          最近更新 更多