C# EPPlus从datatable加载数据到excel,然后创建循环来执行同样的操作是否更有效?

C# EPPlus从datatable加载数据到excel,然后创建循环来执行同样的操作是否更有效?,c#,excel,datatable,epplus,C#,Excel,Datatable,Epplus,我需要改进将datatable映射到excel电子表格的代码的性能 旧代码在datatable中循环并创建excel。我还创建了一个计时器,打印出生成此方法报告所需的时间: var watch = System.Diagnostics.Stopwatch.StartNew(); System.Data.DataTable dt = new System.Data.DataTable(); dt = (System.Data.DataTable)Session["ISOReport"]; Tab

我需要改进将datatable映射到excel电子表格的代码的性能

旧代码在datatable中循环并创建excel。我还创建了一个计时器,打印出生成此方法报告所需的时间:

var watch = System.Diagnostics.Stopwatch.StartNew();
System.Data.DataTable dt = new System.Data.DataTable();
dt = (System.Data.DataTable)Session["ISOReport"];

TableCell td;
TableRow tr;
HyperLink a;
TableHeaderRow thr;
TableHeaderCell thc;

thr = new TableHeaderRow();
thr.BorderStyle = BorderStyle.Solid;

thr.BorderColor = System.Drawing.Color.White;

for (int i = 0; i < dt.Columns.Count; i++)
{
    thc = new TableHeaderCell();
    thc.Text = dt.Columns[i].ColumnName;
    thr.Cells.Add(thc);
}

tblReport.Rows.Add(thr);

for (int j = 0; j < dt.Rows.Count; j++)
{
    tr = new TableRow();
    tr.BorderStyle = BorderStyle.Solid;
    tr.BorderColor = System.Drawing.Color.White;

    for (int i = 0; i < dt.Columns.Count; i++)
    {
        td = new TableCell();
        td.Text = dt.Rows[j][i].ToString();

        tr.Cells.Add(td);
    }
    tblReport.Rows.Add(tr);
}
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;
lblInfo.Text = ReportName + " Generation Time: " + elapsedMs.ToString();
private void NewExport(string name, System.Data.DataTable dt)
{
    //DataSet ds = (DataSet)Session["DSIsoReport"];
    var watch = System.Diagnostics.Stopwatch.StartNew();

    using (pck = new ExcelPackage())
    {
        ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Demo");
        ws.Cells["A5"].LoadFromDataTable(dt, true);

        ws.DefaultColWidth = 25;

        int totalRow = ws.Dimension.End.Row;
        int totalCol = ws.Dimension.End.Column;

        var startCell = (ExcelRangeBase)ws.Cells["A5"];
        var endCell = startCell.Offset(0,0,1,totalCol);
        var headerCell = ws.Cells[endCell.ToString()];
        headerCell.Style.Fill.PatternType = ExcelFillStyle.Solid; 
        headerCell.Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.BurlyWood);
        var headerFont = headerCell.Style.Font;
        headerFont.Bold = true;

        watch.Stop();
        var elapsedMs = watch.ElapsedMilliseconds;
        ws.Cells["A4"].LoadFromText(name + " Generation Time: " + elapsedMs.ToString());
    }
}
我有一个
REnder
方法,它实际上负责从
aspx
页面生成excel电子表格:

protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
    Response.AddHeader("content-disposition", "inline;filename=" + ReportName + ".xls");
    Response.ContentType = "application/vnd.ms-excel";
    //Response.BinaryWrite(pck.GetAsByteArray());
    base.Render(writer);
}
当运行应用程序并使用带循环的旧方法生成报告时,经过的时间是355

但使用EPPlus时,经过的时间是1676

看起来EPPlus的执行时间要长得多

根据我的研究,我认为ePlus是有效的


有什么方法可以改进代码吗?

您的第一种方法使用的是什么技术?它似乎试图用HTML而不是Excel创建表。如果是这样的话,你的比较就不是一个苹果对一个苹果了。我希望看到原始方法的Excel互操作代码,但我没有看到这一部分。另外,什么类型的对象是
tblReport
?tblReport是用代码构建的html表的id。然后我还有
Render
方法,该方法将页面的内容类型设置为execel。查看按钮中的代码修改也查看ClosedXML库,您可以从NuGet获得它,它使用OpenXML生成Excel工作簿(与COM相反)。我认为这似乎相当有效(尽管我没有任何指标来支持这一说法)…@NeilHibbert EPPlus也使用OpenXML,而不是COM。事实上,它可能是最流行的库。第一种方法是假的,它根本不会生成Excel工作表。你无法比较这两种方法。您还将注意到,第一种方法生成的HTML页面远远大于EPPlus生成的实际(压缩)xlsx文件