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

时间:2017-05-31 22:15:45

标签: c# epplus-4

我使用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,但这似乎已经消失了。

谢谢!

1 个答案:

答案 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或者其他东西,因为他们似乎仍然在最近一周前做出提交)。