C#系统对象[,]

C#系统对象[,],c#,excel,C#,Excel,我编写了一个小C#程序,它打开一个Excel工作簿和一个工作表,迭代工作表中的所有单元格,并打印出每个单元格中的值 我遇到的问题是控制台正在打印System.Object[,]而不是实际的单元格值,这似乎是一个无限循环 有人知道为什么不打印实际值吗 这是我的节目: using System; using System.IO; using System.Text; using System.Windows; using System.Windows.Forms; using NetOffice.E

我编写了一个小C#程序,它打开一个Excel工作簿和一个工作表,迭代工作表中的所有单元格,并打印出每个单元格中的值

我遇到的问题是控制台正在打印
System.Object[,]
而不是实际的单元格值,这似乎是一个无限循环

有人知道为什么不打印实际值吗

这是我的节目:

using System;
using System.IO;
using System.Text;
using System.Windows;
using System.Windows.Forms;
using NetOffice.ExcelApi;
using NetOffice.ExcelApi.Enums;
using Excel = NetOffice.ExcelApi.Application;


namespace excelApp
{
    class Program
    {

        Excel excelApplication;
        Workbook workbook;
        Worksheet sheet;


        [STAThreadAttribute]
        public static void Main(string[] args)
        {
            Program p = new Program();
            p.openWorkSheet(@"C:\Users\HP\Desktop\Book1.xlsx", 2);
            p.printValues();
            Console.ReadKey(true);
        }


        private void openWorkSheet(string path, int worksheet)
        {

            excelApplication = new Excel
            {
                Visible = true,
                ScreenUpdating = true
            };

            try
            {
                workbook = excelApplication.Workbooks.Open(path);
                sheet = (Worksheet)workbook.Worksheets[worksheet];
            }
            catch
            {
                Console.WriteLine("File does not exist");
            }
        }



        private void printValues()
        {

                Range range = sheet.Cells[2, 2];
                Range rngLastCell = range.get_End(XlDirection.xlToRight)
                                          .get_End(XlDirection.xlDown);


            // holds the range of cells in the worksheet
            Range tableRange = sheet.Range(range, rngLastCell);

            try
            {

               foreach(var cell in tableRange.Rows)
               {
                   Console.Write(cell.Value.ToString());
               }

            }

            catch(Exception e)
            {

                Console.WriteLine("Something went wrong" + e.StackTrace);

            }

      }
    }
  }
以下是控制台输出:

您的问题在于:

foreach(var cell in tableRange.Rows)
{
    Console.Write(cell.Value.ToString());
}
这是在范围的行中循环,每个行本身就是一个范围,因此“值”是一个数组。数组的
ToString
的默认实现是只打印类型的名称,即
System.Object[,]

这应该可以工作,因为
Range.Value
将是一个对象数组:

foreach(object cell in ((object[,])tableRange.Value))
{
    Console.Write(cell.ToString());
}
请注意,它还节省了在每个单元上调用
.Value
的开销,这是一项昂贵的操作。将整个范围的值放入一个数组并在其上循环更有效。

您的问题在于:

foreach(var cell in tableRange.Rows)
{
    Console.Write(cell.Value.ToString());
}
这是在范围的行中循环,每个行本身就是一个范围,因此“值”是一个数组。数组的
ToString
的默认实现是只打印类型的名称,即
System.Object[,]

这应该可以工作,因为
Range.Value
将是一个对象数组:

foreach(object cell in ((object[,])tableRange.Value))
{
    Console.Write(cell.ToString());
}

请注意,它还节省了在每个单元上调用
.Value
的开销,这是一项昂贵的操作。将整个范围的值放入一个数组并在其上循环更有效。

看起来像单元格。值是一个多维对象数组。在调试器中运行时,foreach循环中存储在cell.Value中的内容?看起来您是通过行对象而不是单元格本身进行循环(即使变量名为
cell
)@xDaevax我实际上看不到,因为输出是
System.Object[,]
但是
单元格。Value
应该保存单元格中的实际数据,就像单元格一样。Value是一个多维对象数组。在调试器中运行时,foreach循环中存储在cell.Value中的内容?看起来您是通过行对象而不是单元格本身进行循环(即使变量名为
cell
)@xDaevax我实际上看不到,因为输出是
System.Object[,]
但是
单元格。Value
应该保存单元格中的实际数据,这是
var
的危险。您没有意识到对象类型与您的视觉不匹配。@Speing True,尽管在本例中,
将是一个
对象[,]
,因此
foreach(tableRange.Rows中的对象单元格)
也不会识别问题。更好地了解每个属性返回的内容,而不是依赖返回类型(尤其是基于COM的办公自动化)@DStanley根据您的回答,我得到以下错误
foreach语句无法对object类型的变量进行操作,因为object不包含GetEnumerator的公共定义
var
,这是
var
的危险所在。您没有意识到对象类型与您的视觉不匹配。@Speing True,尽管在本例中,
将是一个
对象[,]
,因此
foreach(tableRange.Rows中的对象单元格)
也不会识别问题。更好地理解每个属性返回的内容,而不是依赖返回类型(尤其是基于COM的Office automation)@DStanley根据您的回答,我得到以下错误
foreach语句无法对object类型的变量进行操作,因为object不包含GetEnumerator的公共定义