【发布时间】:2018-08-09 06:29:34
【问题描述】:
我将减慢进程的代码确定为以下代码(我正在填充单元格):
我在这里所做的基本上是使用 DataSet 从数据库中加载一些数据。
Microsoft.Office.Interop.Excel.Range range1 = null;
Microsoft.Office.Interop.Excel.Range cell1 = null;
Microsoft.Office.Interop.Excel.Borders border1 = null;
for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
{
int s = i + 1;
for (j = 0; j <= ds.Tables[0].Columns.Count - 1; j++)
{
data = ds.Tables[0].Rows[i].ItemArray[j].ToString();
xlWorkSheet.Cells[s + 1, j + 1] = data;
range1 = xlWorkSheet.UsedRange;
cell1 = range1.Cells[s + 1, j + 1];
border1 = cell1.Borders;
if (((IList)terms).Contains(xlWorkSheet.Cells[1, j + 1].Value.ToString()))
{
cell1.Interior.Color = System.Drawing.Color.Red;
}
range1.Columns.AutoFit();
range1.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
border1.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;
border1.Weight = 2d;
}
}
加载整个内容有时需要超过 1 分钟。有没有可以优化的地方?
【问题讨论】:
-
你有没有试过移动代码:range1.Columns.AutoFit(); range1.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;到两个 for 循环之外?
-
逐个单元格是使用互操作与 Excel 交互的最慢的方式 - 了解如何在一个操作中将数据从数组添加到工作表。例如。 stackoverflow.com/questions/536636/write-array-to-excel-range
-
Lucian 有一个很好的观点,您将所有单元格格式化为创建一个范围并在该范围内进行格式化。你甚至可以为你的边界做这件事。所以在循环之前做所有常见的格式化,然后在你需要的高亮中覆盖。
-
@Lucian 这让它快了 10 秒。谢谢!我正在研究 TimWilliams 的建议,我相信这是关键。
-
@TimWilliams 随意将其发布为答案,以便我标记它。它奏效了。