c# - 从 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;
}
}
}
解决方案
对的,这是可能的。为了更好地查看重复,我们可以引入额外的代码,这些代码什么都不做。这就像数学:你总是可以加 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 循环提取为方法。
推荐阅读
- android - 强制用户首先登录还是在他想付款时登录?
- python - Keras:ValueError:检查输入时出错
- angular - 在 Angular 中将数组项绑定到 [(value)]
- javascript - JS 如何在不知道名字的情况下使用 Object 变量?
- powershell - 使用 Powershell 的嵌套哈希表中的 Foreach 循环与 if/elseif
- sql - XML 到 SQL 问题
- python-3.x - 如何在 python 中转换纪元日期时间?
- c - 列表矢量打印不起作用
- javascript - 用JS在html div中写一个循环
- powershell - 如何从 Powershell 中的 Active Directory 导出用户及其所有者?