Excel “为什么我会这样?”;无法隐式转换类型';无效';至';对象'&引用;是否使用此代码(EPPlus)?

Excel “为什么我会这样?”;无法隐式转换类型';无效';至';对象'&引用;是否使用此代码(EPPlus)?,excel,epplus,epplus-4,Excel,Epplus,Epplus 4,我使用此代码使用EPPlus在电子表格中填充单元格: using (var footerMonth1Cell = prodUsageWorksheet.Cells[columnFooterRow, MONTH1_COL]) { footerMonth1Cell.Value = monthsTruncatedYears[0]; footerMonth1Cell.Style.Font.Size = DATA_FONT_SIZE; footerMonth1Cell.Style.

我使用此代码使用EPPlus在电子表格中填充单元格:

using (var footerMonth1Cell = prodUsageWorksheet.Cells[columnFooterRow, MONTH1_COL])
{
    footerMonth1Cell.Value = monthsTruncatedYears[0];
    footerMonth1Cell.Style.Font.Size = DATA_FONT_SIZE;
    footerMonth1Cell.Style.HorizontalAlignment = ExcelHorizontalAlignment.Right;
}
我认为它工作得很好,但一位用户抱怨说它在单元格中生成了“绿色三角形”。“monthsTruncatedYears”是字符串的通用列表

所以我添加了这个助手函数:

public static void SetValueIntOrStr(this ExcelRangeBase range, object value)
{
    string strVal = value.ToString();
    if (!String.IsNullOrEmpty(strVal))
    {
        double dVal;
        int iVal;

        if (double.TryParse(strVal, out dVal))
            range.Value = dVal;
        else if (Int32.TryParse(strVal, out iVal))
            range.Value = iVal;
        else
            range.Value = strVal;
    }
    else
        range.Value = null;
}
SetValueIntOrStr(footerMonth1Cell, monthsTruncatedYears[0]);
…我从中获得,然后尝试重构原始代码以调用该helper函数,如下所示:

using (var footerMonth1Cell = prodUsageWorksheet.Cells[columnFooterRow, MONTH1_COL])
{
    footerMonth1Cell.Value = SetValueIntOrStr(footerMonth1Cell, monthsTruncatedYears[0]);
    footerMonth1Cell.Style.Font.Size = DATA_FONT_SIZE;
    footerMonth1Cell.Style.HorizontalAlignment = ExcelHorizontalAlignment.Right;
}
但是,它不会编译,告诉我,“不能隐式地将类型'void'转换为'object'”

由于传递给SetValueIntOrStr()的第二个参数,即“value”,是object类型的,因此我认为这就是问题所在。那么,为什么编译器显然将MonthTruncatedYears[0]视为无效?在遗留代码中,我将其指定为单元格的值,当时它不是无效的,所以

我尝试将第二个arg转换为如下所示的对象:

footerMonth1Cell.Value = ReportRunnerConstsAndUtils.SetValueIntOrStr(footerMonth1Cell, object(monthsTruncatedYears[0]));
…但这也不能用“无效的表达式术语‘对象’”进行计算

…以及类似的尝试:

footerMonth1Cell.Value = ReportRunnerConstsAndUtils.SetValueDoubleOrIntOrStr(footerMonth1Cell, monthsTruncatedYears[0] as object);
…引出“无法将类型'void'隐式转换为'object'”


请注意,在借用的代码中,helper方法实际上命名错误;不是“SetValueIntOrStr”,而是“SetValueDoubleOrIntOrStr”

问题在于行

footerMonth1Cell.Value = SetValueIntOrStr(footerMonth1Cell, monthsTruncatedYears[0]);
SetValueIntOrStr
不返回任何值(void),因此不能用于为
footermonth1单元格赋值。value

这将是有效代码,因为Value属性已在函数中更改:

public static void SetValueIntOrStr(this ExcelRangeBase range, object value)
{
    string strVal = value.ToString();
    if (!String.IsNullOrEmpty(strVal))
    {
        double dVal;
        int iVal;

        if (double.TryParse(strVal, out dVal))
            range.Value = dVal;
        else if (Int32.TryParse(strVal, out iVal))
            range.Value = iVal;
        else
            range.Value = strVal;
    }
    else
        range.Value = null;
}
SetValueIntOrStr(footerMonth1Cell, monthsTruncatedYears[0]);

当然/我应该意识到这一点。