Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Excel.Interop'中可能存在的错误;s工作表。UsedRange属性?_C#_Excel - Fatal编程技术网

C# Excel.Interop'中可能存在的错误;s工作表。UsedRange属性?

C# Excel.Interop'中可能存在的错误;s工作表。UsedRange属性?,c#,excel,C#,Excel,看看下面的代码。基本上,这是一个被调用的函数,用于标识工作表的使用范围、循环该范围并散列社会保险号 问题出在这里。如果我创建一个电子表格并填充一个单元格,则函数不会对该单元格进行散列。但是,如果我填充了多个,它就会工作 这可能是UsedRange属性中的错误吗?还是我遗漏了什么 多谢 伍迪 试试看 { foreach(Excel工作表中的Excel.Worksheet ws) { //获取填充XLS的数字范围。 Excel.Range=ws.UsedRange; //在以下情况下,Value2返

看看下面的代码。基本上,这是一个被调用的函数,用于标识工作表的使用范围、循环该范围并散列社会保险号

问题出在这里。如果我创建一个电子表格并填充一个单元格,则函数不会对该单元格进行散列。但是,如果我填充了多个,它就会工作

这可能是UsedRange属性中的错误吗?还是我遗漏了什么

多谢

伍迪

试试看
{
foreach(Excel工作表中的Excel.Worksheet ws)
{
//获取填充XLS的数字范围。
Excel.Range=ws.UsedRange;
//在以下情况下,Value2返回不同的类型:
//
//1.范围变量指向单个单元格:
//Value2返回一个对象
//
//2.范围变量指向多个单元格:
//Value2返回对象[,]
对象[,]值=(对象[,])范围。值2;

对于代码注释中所述的(int row=1;row),Value2属性为单个单元格或对象[,]返回单个文本/数字/逻辑/错误值对于多个单元格。

您无法将double转换为二维对象数组,因为double只有一维。如果我告诉您一些您已经知道的事情,请道歉,但术语“double”表示双精度,与二维数组(由object[,]定义)无关

您可以简单地为这种情况添加一个检查,使前几行看起来像:

XLS.Excel.Range range = ws.UsedRange;
object[,] values;
if (range.Value2.GetType().IsArray)
{
    values = (object[,])range.Value2;
}
else
{
    values = new object[2,2];
    values[1,1] = range.Value2;
}
我在这台机器上没有VS,所以代码未经测试,但应该非常接近

编辑: 构建了一个快速测试应用程序后,我可以看到UsedRange.Value2在做什么-它返回一个包含所有工作表值的数组,这就是为什么如果有多个单元格,它就是一个数组,但是对于一个单元格,它只会返回该值(可以是任何类型)。但是,上面的代码会起作用。获取行数和列数的正确方法是使用:

range.Rows.Count


如果您将for循环更改为使用这两个值而不是数组边界,那么它将解决您的问题,并且当它是单个单元格时,将同时适用于单行和多行

,值是什么样子的?它是否确实正确地创建了正确的数组以便for循环进行迭代?当只填充了一个单元格…”无法将“System.Double”类型的对象强制转换为“System.object[,]”类型我不明白为什么会这样。我知道这个数字是双精度的…但int无论如何都应该起作用…至少这是我的理解。所以我很困惑。但那只是…也许我只是困惑,但它是双精度的,应该被转换为一个对象…那么为什么它不起作用呢???如果你有一个双精度的框作为一个对象并尝试将其强制转换为对象[,],预期的行为是InvalidCastException。强制转换前需要检查(range.Value2为对象[,]),或者使用(range.Value2为对象[,]),如果它不是对象[,],则会生成null。当然,您应该将range.Value2返回的值保存在局部变量中,以免分配两次。感谢宏…我想我已经得到了它…但是,当我运行代码时,我遇到一个错误,无法将!操作数应用于对象…我还可以如何编写它。我尝试了几种不同的方法,但随后遇到了更多问题…顺便说一句,我只是断断续续地写了一年的C#代码,很抱歉,如果这看起来很简单的话…我已经开发了一个快速测试应用程序,并进一步研究了它,请看编辑后的回答我错了…它不起作用…发生的事情是当它到达
values=newobject[2,2];调试时,值为null--0,0,1,1,0,1,1都为null…然后抛出错误…我再次编辑并将值赋给数组的位置1,1,它看起来像您正在检查的唯一位置?
range.Columns.Count