我使用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网站上也发现了posted,但这似乎已经消失了。
谢谢!
答案 0 :(得分:0)
我认为你是对的。如果您查看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
。如果这是故意的,那将是非常奇怪的。你提到的更可能是一个bug。希望他们会回应。或者,如果你感觉很勇敢,你可以把回购利用,并尝试自己解决:)。 (希望他们会将codeplex repo移动到github或者其他东西,因为他们似乎仍然在最近一周前做出提交)。