如何使用C#中的OpenXML将GridView导出为Excel?

我知道人们已经提出了类似的问题。 但解决scheme不是我所期待的。 对于我的情况,我们的GridView至less保存了一百万条logging。 另外,我们的客户不喜欢excel 2007的警告信息。由于警告信息,我们不能使用最常见的使用GridView.RenderControl()的方法。 所以我们决定尝试OpenXML。 但是从我发现的所有示例代码中,为了使用OpenXML创build一个excel文件,似乎必须循环GridView的每一行和列,并写入Excel文件的每个单元格。 这将需要很长的时间。 有谁知道是否有更好/更快的解决scheme? 另外,由于安全原因,我们不能使用第三方DLL。 谢谢。

这里是我用来导出DataTable到Excel的一种方法我创build了一个类public static class Extensions来存放这些方法

 internal static void ExportToXcel_MyDataTable(DataTable dt, string fileName, Page page) { var recCount = dt.Rows.Count; RemoveHtmlSpecialChars(dt); fileName = string.Format(fileName, DateTime.Now.ToString("MMddyyyy_hhmmss")); var xlsx = new XLWorkbook(); var ws = xlsx.Worksheets.Add("Some Report Name"); ws.Style.Font.Bold = true; ws.Cell("C5").Value = "MY TEST EXCEL REPORT"; ws.Cell("C5").Style.Font.FontColor = XLColor.Black; ws.Cell("C5").Style.Font.SetFontSize(16.0); ws.Cell("E5").Value = DateTime.Now.ToString("MM/dd/yyyy HH:mm"); ws.Range("C5:E5").Style.Font.SetFontSize(16.0); ws.Cell("A7").Value = string.Format("{0} Records", recCount); ws.Style.Font.Bold = false; ws.Cell(9, 1).InsertTable(dt.AsEnumerable()); ws.Row(9).InsertRowsBelow(1); // ws.Style.Font.FontColor = XLColor.Gray; ws.Columns("1-8").AdjustToContents(); ws.Tables.Table(0).ShowAutoFilter = true; ws.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; DynaGenExcelFile(fileName, page, xlsx); } private static void DynaGenExcelFile(string fileName, Page page, XLWorkbook xlsx) { page.Response.ClearContent(); page.Response.ClearHeaders(); page.Response.ContentType = "application/vnd.ms-excel"; page.Response.AppendHeader("Content-Disposition", string.Format("attachment;filename={0}.xlsx", fileName)); using (MemoryStream memoryStream = new MemoryStream()) { xlsx.SaveAs(memoryStream); memoryStream.WriteTo(page.Response.OutputStream); } page.Response.Flush(); page.Response.End(); } 

如果你在DataTable中有Html /特殊字符,这个方法将删除它们,用string.Emptyreplace行数据

 /// <summary> /// Remove all HTML special characters from datatable field if they are present /// </summary> /// <param name="dt"></param> private static void RemoveHtmlSpecialChars(DataTable dt) { for (int rows = 0; rows < dt.Rows.Count; rows++) { for (int column = 0; column < dt.Columns.Count; column++) { dt.Rows[rows][column] = dt.Rows[rows][column].ToString().Replace("&nbsp;", string.Empty); } } }