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

C# EPPlus,将公式应用于非连续范围,c#,epplus-4,C#,Epplus 4,我在使用EPPlus V4.1的C#中工作,但没有将公式应用于非连续的单元格块 我可以使用下面的代码将公式应用于一系列连续的选定单元格 Worksheet.Select(new ExcelAddress("T2:T10")); Worksheet.SelectedRange.Formula = "=if(A2=\"\",\"empty\",\"not empty\")"; 这非常有效,因为它改变了公式,因此对于T2单元,被检查的单元是A2,对于T3单元,被检查的单元是A3,等等 但是,当我有一

我在使用EPPlus V4.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\")";
这听起来像是一个bug(已知或未知),还是这更像是我的一个错误

上周我在codeplex网站上也看到了这一点,但这似乎正在消失


谢谢

我认为你是对的。如果您查看此处的代码,它将在构造函数调用的
SetDelegate()
中设置
\u 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\u Value
。这最终由
值的setter使用
属性:

else
{
    _changePropMethod(this, _setValueDelegate, value);
}
但不是通过
公式
属性设置器:

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

出于某种原因,它直接调用
Set\u Formula
。如果这是故意的,那就很奇怪了。更可能是你提到的一个bug。希望他们会作出回应。或者,如果你感到勇敢,你可以选择回购协议,并尝试自己解决:)。(希望他们能将codeplex repo迁移到github或其他地方,因为他们一周前似乎还在进行提交)。

我想你是对的。如果您查看此处的代码,它将在构造函数调用的
SetDelegate()
中设置
\u 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\u Value
。这最终由
值的setter使用
属性:

else
{
    _changePropMethod(this, _setValueDelegate, value);
}
但不是通过
公式
属性设置器:

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

出于某种原因,它直接调用
Set\u Formula
。如果这是故意的,那就很奇怪了。更可能是你提到的一个bug。希望他们会作出回应。或者,如果你感到勇敢,你可以选择回购协议,并尝试自己解决:)。(希望他们能将codeplex repo迁移到github或其他地方,因为一周前他们似乎还在进行提交)。

这比以前好吗?我还没有用过,所以我不能说。但是谢谢你的建议。它比吗?我没有用过,所以我不能说。但是谢谢你的建议。