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 或其他东西,因为他们似乎最近一周前还在提交)。