2016-03-25 36 views
0

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

+0

数据,需要从'.xls'在你的代码更改文件类型为'.xlsx'我可以张贴在如何做到这一点使用'ClosedXML'但是'1 million'为例行数很多,从我的理解Excel的数量方面有69k的限制的行..但我可以发布我做什么,你可以测试它..我目前这样做,它的作品就像一个魅力..也没有这么难,更不用说还有其他方法来保存数据datable到Excel ..我已经在这里发布一些以及在Stackoverflow – MethodMan

+0

也可以告诉我们你自从你说什么以来你已经尝试了什么,你正在寻找的是以前的任何发现/解决方案,你已经找到 – MethodMan

+0

@MethodMan:你的示例代码片段会有用。我想指出的是,从2007版开始,Excel工作表包含1048576行,因此可按OP中所述完成任务。最好的问候, –

回答

1

这里是我用来导出数据表到Excel我创建了一个类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.Empty

/// <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); 
     } 
    } 
} 
+0

谢谢MethodMan。 – GLP

+0

我不确定我是否也可以使用ClosedXML。我从这个网站http://mikesknowledgebase.azurewebsites.net/pages/CSharp/ExportToExcel.htm找到了一个解决方案,这非常有帮助。基本上它使用OpenXMLWriter写入Excel文件。但是我注意到我的内存使用率仍然高达20%,我想知道我能做些什么来改进它。 – GLP

+0

你怎么不能使用ClosedXML ..如果你可以使用OpenXML,你一定可以使用ClosedXML我注意到在使用ClosedXML时没有内存问题..如果你没有显示任何现有的代码,很难知道你遇到什么内存问题关于你如何使用它.. – MethodMan