如何将c#datagridview导出到Excel中

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

我正在使用以下源代码。 我想要以下问题的专家build议。

  1. 我的代码是否正确? 因为我没有得到任何文件保存在选定的path。

  2. 在从网格输出数据时是否存在性能问题,因为网格中可能有多less数据可用?

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

获取工作簿的句柄,然后调用Workbook.SaveCopyAs(filePath);

尝试下课

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

删除标签,如果你不想要他们..根据您的需要进行更改。

实施的弱点: – 你没有免费使用资源; – 你一个一个的出口项目(这是非常缓慢的),有范围devise的,你可以设置对象[,](盒装诠释,string,…); – 你不处理文本格式(Excel格式的决定是不正确的), – 你混合查看和导出逻辑。