EPPlus,将公式应用于非连续范围
EPPlus, applying formula to non-contiguous range
我在 C# 中使用 EPPlus v 4.1 工作,但没有运气将公式应用于非连续的单元格块。
我可以使用以下代码将公式应用于一系列选定的连续单元格。
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这个,但它似乎要消失了。
谢谢!
我认为你是对的。如果您查看 https://epplus.codeplex.com/SourceControl/changeset/view/643d411b032b#EPPlus/ExcelRangeBase.cs 处的代码,它会在构造函数调用的 SetDelegate()
中设置 _changePropMethod
委托:
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
属性 setter:
else if (_fromRow == _toRow && _fromCol == _toCol)
{
Set_Formula(this, value, _fromRow, _fromCol);
}
出于某种原因,它直接调用 Set_Formula
。如果这是故意的,那就太奇怪了。正如您提到的,它更有可能是一个错误。希望他们会回应。或者,如果您感到勇敢,您可以访问回购协议并尝试自己修复它 :)。 (希望他们将 codeplex 回购移动到 github 或其他东西,因为他们似乎最近一周前还在提交)。
我在 C# 中使用 EPPlus v 4.1 工作,但没有运气将公式应用于非连续的单元格块。
我可以使用以下代码将公式应用于一系列选定的连续单元格。
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这个,但它似乎要消失了。
谢谢!
我认为你是对的。如果您查看 https://epplus.codeplex.com/SourceControl/changeset/view/643d411b032b#EPPlus/ExcelRangeBase.cs 处的代码,它会在构造函数调用的 SetDelegate()
中设置 _changePropMethod
委托:
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
属性 setter:
else if (_fromRow == _toRow && _fromCol == _toCol)
{
Set_Formula(this, value, _fromRow, _fromCol);
}
出于某种原因,它直接调用 Set_Formula
。如果这是故意的,那就太奇怪了。正如您提到的,它更有可能是一个错误。希望他们会回应。或者,如果您感到勇敢,您可以访问回购协议并尝试自己修复它 :)。 (希望他们将 codeplex 回购移动到 github 或其他东西,因为他们似乎最近一周前还在提交)。