首页 > 解决方案 > 从 C# 项目写入 Excel 是否有更高效的方法

问题描述

我有从 C7 到 Q21 的代码,当它完全移动到 V7 到 AJ21 时。我的代码现在有两个 for 循环。第一个从 C7 写入 Q21,如果写满,第二个移动到下一个范围。代码几乎相同,似乎效率低下。这是我所拥有的示例:

bool found = false;
for (int rowNum = 8; rowNum < 21; rowNum++)
{
    if (string.IsNullOrEmpty(Convert.ToString(summarySheet.Cells[rowNum, 3].Value)))
    {
       summarySheet.Cells[rowNum, 3].Value = runNumber;
       summarySheet.Cells[rowNum, 4].Value = DateTime.Today.ToString("MM/dd/yyyy");
       found = true;
    }
}
if (found == false)
{
    for (int rowNum = 8; rowNum < 21; rowNum++)
    {
       if (string.IsNullOrEmpty(Convert.ToString(summarySheet.Cells[rowNum, 22].Value)))
       {
          summarySheet.Cells[rowNum, 22].Value = runNumber;
          summarySheet.Cells[rowNum, 23].Value = DateTime.Today.ToString("MM/dd/yyyy");
          found = true;
       }
    }
}

标签: c#excel

解决方案


对的,这是可能的。为了更好地查看重复,我们可以引入额外的代码,这些代码什么都不做。这就像数学:你总是可以加 0 或乘以 1 而不改变任何东西。

bool found == false;
if (found == false)       //  <-- always true, does nothing

    for (int rowNum = 8; rowNum < 21; rowNum++)
    {
        if (string.IsNullOrEmpty(Convert.ToString(summarySheet.Cells[rowNum, 3].Value)))
        {
           summarySheet.Cells[rowNum, 3].Value = runNumber;
           summarySheet.Cells[rowNum, 4].Value = DateTime.Today.ToString("MM/dd/yyyy");
           found = true;
        }
    }

}
if (found == false)
{
    for (int rowNum = 8; rowNum < 21; rowNum++)
    {
       if (true)  // <-- always true, does nothing
       {
           summarySheet.Cells[rowNum, 22].Value = runNumber;
           summarySheet.Cells[rowNum, 23].Value = DateTime.Today.ToString("MM/dd/yyyy");
           found = true;
       }
    }
}

现在您可以进行一些重构。从最内层开始并引入变量:

int column = 3;
summarySheet.Cells[rowNum, column].Value = runNumber;
summarySheet.Cells[rowNum, column+1].Value = DateTime.Today.ToString("MM/dd/yyyy");
found = true;

[...]

int column = 22;
summarySheet.Cells[rowNum, column].Value = runNumber;
summarySheet.Cells[rowNum, column+1].Value = DateTime.Today.ToString("MM/dd/yyyy");
found = true;

现在您有 3 行相同的行,您可以将它们提取到一个方法中。用相同的方法替换相同的代码。

接下来,内联临时引入的变量。

found = SetCells(summarySheet, rowNum, 3, runNumber);
[...]
found = SetCells(summarySheet, rowNum, 22, runNumber);
[...]
bool SetCells(summarySheet, rowNum, column, runNumber) 
{
    summarySheet.Cells[rowNum, column].Value = runNumber;
    summarySheet.Cells[rowNum, column+1].Value = DateTime.Today.ToString("MM/dd/yyyy");
    return true;
}

将 if 条件提取为局部变量。

将 if 语句提取为方法。

将 for 循环提取为方法。


推荐阅读