1

我正在使用 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 网站上发布了这个,但这似乎正在消失。

谢谢!

4

1 回答 1

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属性的设置器使用:

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

但不是由Formula属性设置器:

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

出于某种原因,它直接调用Set_Formula. 如果这是故意的,那就太奇怪了。更有可能是您提到的错误。希望他们会做出回应。或者,如果你觉得很勇敢,你可以提交 repo 并尝试自己修复它:)。(希望他们将 codeplex repo 移动到 github 或其他地方,因为他们似乎在一周前仍在进行提交)。

于 2017-06-01T00:33:30.110 回答