用x和y中的不同值填充矩阵的最简单方法



我有一个3x3矩阵,我想填充它(可以增长到3x4或3x5,但不能更大(。除了每一行都有一个唯一的公式,每一列在公式中都有一列之外,使用对偶for循环非常简单。

我开始尝试创建for循环、case语句,但最终只是强行更新每个单元格。

然后我想也许某个工艺大师有一些想法。有什么方法可以让这更简单吗:

myWorksheet.Cells[1, 1].Formula = "=ROUND(AVERAGE(B$2:B$" + counter + "), 3)";
myWorksheet.Cells[1, 2].Formula = "=ROUND(AVERAGE(C$2:C$" + counter + "), 3)";
myWorksheet.Cells[1, 3].Formula = "=ROUND(AVERAGE(D$2:D$" + counter + "), 3)";
myWorksheet.Cells[2, 1].Formula = "=MAX(B$2:B$" + counter + ")";
myWorksheet.Cells[2, 2].Formula = "=MAX(C$2:C$" + counter + ")";
myWorksheet.Cells[2, 3].Formula = "=MAX(D$2:D$" + counter + ")";
myWorksheet.Cells[3, 1].Formula = "=STDEV(B$2:B$" + counter + ")";
myWorksheet.Cells[3, 2].Formula = "=STDEV(C$2:C$" + counter + ")";
myWorksheet.Cells[3, 3].Formula = "=STDEV(D$2:D$" + counter + ")";

您的公式有三个部分,函数名、参数和闭包。您可以创建一个方法,根据单元格的行和列坐标创建要插入的公式。

public static string RenderFormula(int row, int column, int counter)
{
var stringBuilder = new StringBuilder();
stringBuilder.Append("=");

// part 1 - the function name
var methodName = row switch
{
1 => "ROUND(AVERAGE(",
2 => "MAX(",
3 => "STDEV(",
_ => throw new ArgumentException(nameof(row))
};
stringBuilder.Append(methodName);

// part 2 - the argument
char rangeColumnLetter = (char)('A' + column);
var range = $"{rangeColumnLetter}$2:{rangeColumnLetter}${counter}";
stringBuilder.Append(range);

// part 3 - the closing
var methodEnding = row switch
{
1 => "), 3)",
2 or 3 => ")",
_ => throw new ArgumentException(nameof(row))
};
stringBuilder.Append(methodEnding);

return stringBuilder.ToString();
}
  1. 在第一部分中,您知道根据行号使用哪个excel函数
  2. 在第二部分中,您将列编号添加到大写";A";以获取新的范围列字母。这意味着(列1+"A"="B"(。将counter的值添加到其中
  3. 在第三部分中,您需要关闭函数的括号。第1行公式有两个右括号,中间有另一个参数,所以要考虑它

这使用StringBuilder来避免大量浪费的串联。

然后只需调用该方法来找出要插入的公式。

Console.WriteLine(RenderFormula(1, 1, 50));
Console.WriteLine(RenderFormula(2, 2, 50));
Console.WriteLine(RenderFormula(3, 3, 50));
// =ROUND(AVERAGE(B$2:B$50), 3)
// =MAX(C$2:C$50)
// =STDEV(D$2:D$50)

最新更新