我为什么会这样做,"无法隐式转换类型' void'对象'"使用此代码(EPPlus)?

时间:2016-09-09 18:05:50

标签: 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.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;
}

...我从here获得,然后尝试重构原始代码以调用该辅助函数,如下所示:

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'对象' "

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

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

footerMonth1Cell.Value = ReportRunnerConstsAndUtils.SetValueIntOrStr(footerMonth1Cell, object(monthsTruncatedYears[0]));

...但是,用#34;无效的表达式术语'对象'""

也不会计算

......和这种类似的尝试:

footerMonth1Cell.Value = ReportRunnerConstsAndUtils.SetValueDoubleOrIntOrStr(footerMonth1Cell, monthsTruncatedYears[0] as object);

...引发,"无法隐式转换类型' void'对象'"

请注意,辅助方法实际上是在借用的代码中命名错误;而不是" SetValueIntOrStr"它应该是" SetValueDoubleOrIntOrStr"

1 个答案:

答案 0 :(得分:1)

问题在于

footerMonth1Cell.Value = SetValueIntOrStr(footerMonth1Cell, monthsTruncatedYears[0]);

SetValueIntOrStr不会返回任何值(void),因此无法用于为footerMonth1Cell.Value分配值。

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

SetValueIntOrStr(footerMonth1Cell, monthsTruncatedYears[0]);