gpt4 book ai didi

c# - 如何使用 C# 优化 Excel 中每一行的循环?

转载 作者:行者123 更新时间:2023-11-30 23:03:56 24 4
gpt4 key购买 nike

我的 Excel 工作表中大约有 6000 行和 600 列。有一个 ID 列,如果 ID 相等,我会在所有单元格中突出显示不同的值。但是我的代码循环遍历每一行并突出显示的时间太长。如何优化我的代码?

 private void worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
for (r = 2; r <= totalRow; r++)
{
Duplicate();
int percentage = (r + 1) * 100 / totalRow;
worker.ReportProgress(percentage);
}
}

private void Duplicate()
{
if (xlWorksheet.Cells[r, ssid].Value == xlWorksheet.Cells[r + 1, ssid].Value)
{
for (int c = 1; c <= columnCount; c++)
{
if (Convert.ToString(xlWorksheet.Cells[r, c].Value) != Convert.ToString(xlWorksheet.Cells[r + 1, c].Value))
{
Excel.Range cellRange = (Excel.Range)xlWorksheet.Cells[r + 1, c];
cellRange.Interior.Color = Excel.XlRgbColor.rgbRed;
}
}
}
}

最佳答案

读取和写入 excel 会使程序变慢很多。尽量避免阅读和不必要的写作:

  • 读取 Excel 文件一次并将其值写入二维矩阵,维度为行和列;
  • 遍历矩阵并检查值。对于 3.6M,它会很快;
  • 将结果记录在另一个二维 bool 矩阵中。
  • 遍历 bool 矩阵,只在需要写入的单元格上写入;
  • 您甚至可以做得更好 - 遍历 bool 矩阵并使用 Union() 将相应的单元格分配到一个范围。最后只更改一次范围的颜色。

按照以上几点(没有最后一点),这是一个基本的开始:

enter image description here

这是一个基本的结束,考虑到我们的任务是为每一行的相同单元格着色(这个任务可以很容易地改变):

enter image description here

这是代码:

using System;
using Excel = Microsoft.Office.Interop.Excel;

class StartUp
{
static void Main()
{
string filePath = @"C:\Sample.xlsx";

int rowsCount = 5;
int colsCount = 6;

Excel.Application excel = new Excel.Application();
excel.Visible = false;
excel.EnableAnimations = false;

Excel.Workbook wkb = Open(excel, filePath);
Excel.Worksheet wk = (Excel.Worksheet)excel.Worksheets.get_Item(1);

Excel.Range startCell = wk.Cells[1, 1];
Excel.Range endCell = wk.Cells[rowsCount, colsCount];
Excel.Range currentRange = wk.get_Range(startCell, endCell).Cells;
currentRange.Interior.Color = Excel.XlRgbColor.rgbWhite;

object[,] matrixRead = (object[,])currentRange.Value;
bool[,] matrixResult = new bool[rowsCount+1,colsCount+1];

for (int rows = 1; rows <= rowsCount; rows++)
{
for (int cols = 1; cols < colsCount; cols++)
{
if (matrixRead[rows,cols].ToString()==matrixRead[rows,cols+1].ToString())
{
matrixResult[rows, cols] = true;
matrixResult[rows, cols + 1] = true;
}
}
}

for (int rows = 1; rows <= rowsCount; rows++)
{
for (int cols = 1; cols <= colsCount; cols++)
{
if (matrixResult[rows, cols])
{
currentRange.Cells[rows, cols].interior.color =
Excel.XlRgbColor.rgbRed;
}
}
}

excel.EnableAnimations = true;
wkb.Close(true);
excel.Quit();
Console.WriteLine("Finished!");
}

private static Excel.Workbook Open(Excel.Application excelInstance,
string fileName, bool readOnly = false,
bool editable = true, bool updateLinks = true)
{
Excel.Workbook book = excelInstance.Workbooks.Open(
fileName, updateLinks, readOnly,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, editable, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing);
return book;
}
}

大约 95% 的速度(或更多的 3.6M 单元)可能来自这两条线:

excel.Visible = false; 
excel.EnableAnimations = false;

一般来说,两对嵌套循环可以避免并很容易地变成一对 - 就像这样:

for (int rows = 1; rows <= rowsCount; rows++)
{
for (int cols = 1; cols < colsCount; cols++)
{
if (matrixRead[rows,cols].ToString()==matrixRead[rows,cols+1].ToString())
{
currentRange.Cells[rows, cols].interior.color = Excel.XlRgbColor.rgbRed;
currentRange.Cells[rows, cols+1].interior.color = Excel.XlRgbColor.rgbRed;
}
}
}

但当时的想法是通过 Union() 将 matrixResult 呈现为一个范围,并一次性更新整个范围的背景。因此,第二对嵌套循环不应该存在,而应该是这样的:currentRange.Interior.Color = Excel.XlRgbColor.rgbRed

关于c# - 如何使用 C# 优化 Excel 中每一行的循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49651258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com