EPPlus, применение формулы к несмежному диапазону

Я работаю на С# с 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 на прошлой неделе, но, похоже, это исчезнет. .

Спасибо!


person Emilio    schedule 31.05.2017    source источник
comment
Это лучше, чем Open-XML-SDK?   -  person Alex78191    schedule 01.06.2017
comment
Я этим не пользовался, поэтому не могу сказать. Но спасибо за предложение.   -  person Emilio    schedule 01.06.2017


Ответы (1)


Я думаю, что вы правы. Если вы посмотрите на код на 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:

else
{
    _changePropMethod(this, _setValueDelegate, value);
}

Но НЕ установщиком свойств Formula:

else if (_fromRow == _toRow && _fromCol == _toCol)
{
    Set_Formula(this, value, _fromRow, _fromCol);
}

По какой-то причине он делает прямой вызов Set_Formula. Если это намеренно, то было бы очень странно. Скорее всего, это ошибка, как вы сказали. Надеюсь, они ответят. Или, если вы чувствуете себя смелым, вы можете найти репо и попытаться исправить это самостоятельно :). (надеюсь, они переместят репозиторий codeplex на github или что-то в этом роде, поскольку они все еще делают коммиты еще неделю назад).

person Ernie S    schedule 01.06.2017