EPPlus,将公式应用于非连续范围



我正在使用 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或其他东西,因为他们似乎还在一周前进行提交)。

相关内容

  • 没有找到相关文章

最新更新