【问题标题】:(object[,])range.get_Value(XL.XlRangeValueDataType.xlRangeValueDefault) causes a conversion error(object[,])range.get_Value(XL.XlRangeValueDataType.xlRangeValueDefault) 导致转换错误
【发布时间】:2011-09-12 04:24:18
【问题描述】:

错误:

Cannot convert type 'string' to 'object[*,*]'

这就是我遇到的错误。有人可以给我一些指示,以便我可以避免它吗?谢谢。

注意:

有趣的是,(object[,])range.get_Value(XL.XlRangeValueDataType.xlRangeValueDefault)

只有在range.Count == 1 时才会产生这个错误。当 count 等于或大于 2 时,它工作正常。

示例代码:

object[,] arrValue;  //global variable

private string[] createFormulaCollection()
        {
            ArrayList s = new ArrayList();
            try
            {
                //look at the currently active excel sheet
                //iterate through cells (not Null) and find the one contains IES(...)
                //save it into the arraylist
                //use dictionary to save position and value (position as key)
                workbook = Globals.ThisAddIn.Application.ActiveWorkbook;
                worksheet = Globals.ThisAddIn.Application.ActiveSheet;
                range = worksheet.UsedRange;

                MessageBox.Show(range.Count.ToString());


                if (range.Count > 1)
                {
                    //need to make sure there are at least 2 "ies" cells before converting to object[,]
                    arrValue = (object[,])range.get_Value(XL.XlRangeValueDataType.xlRangeValueDefault); 
                }
                else
                {
                    arrValue[1,1] = range.get_Value(XL.XlRangeValueDataType.xlRangeValueDefault); //my try here. seems still got problem though.
                }


            catch (Exception ex)
            {

            }
            return (string[])s.ToArray(typeof(string));
        }

【问题讨论】:

  • 只有在 range.Count == 1 时才会发生错误是有道理的,因为 Range 指的是特定的单元格,而 get_Value 返回该单元格的值。
  • 但是,您提到的错误不应该出现在您发布的代码中,因为您正在专门处理 range.Count == 1 的情况。
  • 是的,这只是我的尝试。我想捕获 range.Count == 1 的特定情况,这样它就不会无意中抛出异常。但是我上面的方法不太正确,因为您正在进行字符串 -> 对象数组转换。
  • 我不关注。如果在您分配给 arrValue[1,1] 时已实例化 arrValue,那么我可以从您发布的代码中收集到的内容应该没有问题。那么您到底遇到了什么问题?
  • 不,如果 range.Count == 1 是不正确的。但是您已经处理了这种情况。由于它是一个对象数组,因此您可以在其中放置任何值,即 arrValue[1,1] = range.get_Value(...) 不应失败。看来您已经解决了您要求我们帮助您解决的问题...?

标签: c# .net excel interop excel-interop


【解决方案1】:

发现:

range.get_Value(XL.XlRangeValueDataType.xlRangeValueDefault); 将在 range.Count == 1 时返回一个字符串 这意味着它不能转换为 object[,] 类型。

然而,当 range.Count > 1 时它可以。

我的解决方法:

单独处理即可。所以在我的情况下,我必须先计算范围对象的数量并相应地处理它们。

if(range.Count > 1)
{
    //code...
}
else
{
    string singleStrValue = range.get_Value(XL.XlRangeValueDataType.xlRangeValueDefault);
    int iRow, iCol;
    iRow = range.Row;
    iCol = range.Column;
    if (!string.IsNullOrEmpty(singleStrValue))
    {
        //code...
    }
}

【讨论】:

    【解决方案2】:

    它是否适用于

    (object[,])range.get_Value(System.Reflection.Missing.Value);
    

    【讨论】:

    • 对于什么 arrValue 是全局的?范围在哪里定义?为什么要在 else 范围内访问索引为 1,1 而不是 0,0 的数组?你做了一步一步的调试吗?如果是,它在哪一行崩溃?
    • 索引不能从 0,0 开始,因为 range.get_Value() 返回其值的方式。再加上这个类真的很大,我不可能在这里发布所有的代码。
    • range.count == 1 时,代码会崩溃,正如问题帖子中明确指出的那样。所以它在 else 块中失败了。本来我什至没有放 if...else...,这只是为了调试和尝试一些可能的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 2013-05-14
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    相关资源
    最近更新 更多