【问题标题】:How to export GridView to excel using OpenXML in c#? [closed]如何在 c# 中使用 OpenXML 将 GridView 导出到 excel? [关闭]
【发布时间】:2016-07-13 13:42:14
【问题描述】:

我知道人们已经问过类似的问题。但解决方案不是我想要的。就我而言,我们的 GridView 至少拥有一百万条记录。另外,我们的客户不喜欢来自 excel 2007 的警告消息。由于警告消息,我们不能使用最常用的 GridView.RenderControl() 方法。所以我们决定尝试 OpenXML。但是从我找到的所有示例代码中,要使用 OpenXML 创建一个 excel 文件,您似乎必须循环 GridView 的每一行和每一列并写入 excel 文件的每个单元格。这将需要很多时间。有谁知道是否有更好/更快的解决方案?此外,出于安全原因,我们不能使用第三方 DLL。谢谢。

【问题讨论】:

  • 您需要将代码中的文件类型从 .xls 更改为 .xlsx 我可以发布一个关于如何使用 ClosedXML 执行此操作的示例,但是 1 million 行来自我的很多了解 Excel 在行数方面有 69k 限制.. 但我可以发布我所做的,你可以测试它.. 我目前正在这样做,它就像一个魅力.. 也不是那么难,更不用说有将数据保存到 Excel 的其他方法。我在 Stackoverflow 上也发布了一些内容
  • 您能否向我们展示您所尝试的,因为您声明您正在寻找的内容不在您之前找到的任何帖子/解​​决方案中
  • @MethodMan :您的示例代码 sn-p 会很有用。我想指出的是,从 2007 版开始,Excel 工作表包含 1048576 行,因此可以按照 OP 中的描述完成任务。最好的问候,
  • 我将发布我目前正在使用 ClosedXML 做的事情,等待一秒
  • @MethodMan:谢谢和问候,

标签: c# asp.net excel gridview


【解决方案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);
        }
    }
}

【讨论】:

  • 我也不确定是否可以使用 ClosedXML。我从这个网站mikesknowledgebase.azurewebsites.net/pages/CSharp/… 找到了一个解决方案,非常有帮助。基本上它使用 OpenXMLWriter 写入一个 excel 文件。但是我注意到我的内存使用率仍然高达 20%,我想知道是否可以做些什么来改善它。
  • 为什么你不能使用 ClosedXML.. 如果你可以使用 OpenXML,你肯定可以使用 ClosedXML 我注意到使用 ClosedXML 时没有内存问题..很难知道你有什么内存问题如果你没有显示任何关于你如何使用它的现有代码..
猜你喜欢
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 2019-10-28
相关资源
最近更新 更多