我正在使用 EPPlus v 4.1 的 C# 工作,并且没有运气将公式应用于不连续的单元格块。
我能够使用以下代码将公式应用于一系列连续的选定单元格。
Worksheet.Select(new ExcelAddress("T2:T10"));
Worksheet.SelectedRange.Formula = "=if(A2="","empty","not empty")";
这很好用,因为它更改了公式,以便对于单元格 T2,检查的单元格为 A2,对于单元格 T3,检查的单元格为 A3,依此类推。
但是,当我有一个不连续的单元格块时,公式的应用似乎失败,只有所选范围内的第一个单元格才能收到公式。下面的代码导致只有单元格 T2 接收公式。
Worksheet.Select(new ExcelAddress("T2,T5,T8,T10"));
Worksheet.SelectedRange.Formula = "=if(A2="","empty","not empty")";
当我使用 Cells 属性时也是如此。
// awesome
Worksheet.Cells["T2:T10"].Formula = "=if(A2="","empty","not empty")";
// not so awesome
Worksheet.Cells["T2,T5,T8,T10"].Formula = "=if(A2="","empty","not empty")";
这听起来像是一个错误(已知或未知),还是这更像是我的错误?
我上周也在codeplex网站上发布了这个,但这似乎正在消失。
谢谢!
我认为你是对的。 如果您查看代码 https://epplus.codeplex.com/SourceControl/changeset/view/643d411b032b#EPPlus/ExcelRangeBase.cs 它会设置构造函数调用的_changePropMethod
委托SetDelegate()
:
private void SetDelegate()
{
if (_fromRow == -1)
{
_changePropMethod = SetUnknown;
}
//Single cell
else if (_fromRow == _toRow && _fromCol == _toCol && Addresses == null)
{
_changePropMethod = SetSingle;
}
//Range (ex A1:A2)
else if (Addresses == null)
{
_changePropMethod = SetRange;
}
//Multi Range (ex A1:A2,C1:C2)
else
{
_changePropMethod = SetMultiRange;
}
}
设置为SetMultiRange
包含通过所有地址和每个地址Set_Value
的循环。 这最终由Value
属性的 setter 使用:
else
{
_changePropMethod(this, _setValueDelegate, value);
}
但不是由Formula
属性设置者:
else if (_fromRow == _toRow && _fromCol == _toCol)
{
Set_Formula(this, value, _fromRow, _fromCol);
}
出于某种原因,它直接调用Set_Formula
。 如果这是故意的,那就很奇怪了。 正如您提到的,它更有可能是一个错误。 希望他们能做出回应。 或者,如果您感到勇敢,则可以使用存储库并尝试自己修复它:)。 (希望他们将Codeplex存储库移动到GitHub或其他东西,因为他们似乎还在一周前进行提交)。