Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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
将Excel范围转换为C#数组_C#_Arrays_Excel - Fatal编程技术网

将Excel范围转换为C#数组

将Excel范围转换为C#数组,c#,arrays,excel,C#,Arrays,Excel,我想用以下代码将Excel范围转换为C#数组: System.Array MyRange = (System.Array)range.cells.value; for (int k = 0; k <= MyRange.Length; k++) { List<service_name> _ml = new List<service_name>(); for (int j = 1; j < dataitems.Count; j++) {

我想用以下代码将Excel范围转换为C#数组:

System.Array MyRange = (System.Array)range.cells.value;

for (int k = 0; k <= MyRange.Length; k++)
{
    List<service_name> _ml = new List<service_name>();
    for (int j = 1; j < dataitems.Count; j++)
    {
        // enter code here
    }
}
List<Excel.Range> listOfCells = range.Cells.Cast<Excel.Range>().ToList<Excel.Range>();
System.Array MyRange=(System.Array)range.cells.value;

对于(int k=0;k而言,该错误意味着该值是一个字符串,因此无法将其直接转换为数组

如果该值是例如逗号分隔字符串,则可以使用Split获取数组:

string[] MyRange = (range.Cells.Value + "").Split(',');
for (int k = 0; k < MyRange.Length; k++)
{
    //...loop here...
}
string[]MyRange=(range.Cells.Value+).Split(',');
for(int k=0;k

还修复了循环,您将获得索引越界错误。

根据Microsoft提供的帮助,我在Excel中读取和写入数组的方式如下

var xlApp=new Microsoft.Office.Interop.Excel.Application();
var wb=xlApp.Workbooks.Open(fn, ReadOnly: false);
xlApp.Visible=true;
var ws=wb.Worksheets[1] as Worksheet;
var r=ws.Range["A2"].Resize[100, 1];
var array=r.Value;
// array is object[1..100,1..1]
for(int i=1; i<=100; i++)
{
    var text=array[i, 1] as string;
    Debug.Print(text);
}
// to create an [1..100,1..1] array use
var array2=Array.CreateInstance(
    typeof(object), 
    new int[] {100, 1}, 
    new int[] {1, 1}) as object[,];

// fill array2
for(int i=1; i<=100; i++)
{
    array2[i, 1] = string.Format("Text{0}",i);
}
r.Value2=array2;

wb.Close(SaveChanges: true);
xlApp.Quit();
var xlApp=new Microsoft.Office.Interop.Excel.Application();
var wb=xlApp.Workbooks.Open(fn,只读:false);
xlApp.Visible=true;
var ws=wb.工作表[1]作为工作表;
var r=ws.Range[“A2”]。调整大小[100,1];
var数组=r.Value;
//数组是对象[1..100,1..1]

对于(int i=1;i对话延迟,但有一种方法可以做到这一点:

static string[][] GetStringArray(Object rangeValues)
{
    string[][] stringArray = null;

    Array array = rangeValues as Array;
    if (null != array)
    {
        int rank = array.Rank;
        if (rank > 1)
        {
            int rowCount = array.GetLength(0);
            int columnCount = array.GetUpperBound(1);

            stringArray = new string[rowCount][];

            for (int index = 0; index < rowCount; index++)
            {
                stringArray[index] = new string[columnCount-1];

                for (int index2 = 0; index2 < columnCount; index2++)
                {
                    Object obj = array.GetValue(index + 1, index2 + 1);
                    if (null != obj)
                    {
                        string value = obj.ToString();

                        stringArray[index][index2] = value;
                    }
                }
            }
        }
    }

    return stringArray;
}

当范围正好由一个单元格组成时,会出现原始post中的错误消息,因为结果值的类型是variant,实际上可以是array、double、string、date和null

一种解决方案是检查单元格计数,如果只有一个单元格,则采取不同的操作

我的解决方案创建一个单元格数组。即使一个或多个单元格为空,这也会起作用,这可能会导致空对象。(当该范围的所有单元格为空时,range.cells.Value为空。)


我包含了“未知”,因为我不记得Value2可以返回的所有数据类型。如果您找到任何其他类型,请改进此函数。

注意:此示例仅适用于多个单元格的范围。如果范围仅为单个单元格(1x1),Excel将以特殊的方式处理它,range.Value2将不会返回二维数组,而是一个值。正是这些类型的特殊情况,以及零和非零数组的下限,让您抓狂:

using Excel = Microsoft.Office.Interop.Excel;

private static void Test()
{
    Excel.Range range = Application.ActiveWorkbook.ActiveSheet.Range["A1:B2"]; // 2x2 array

    range.Cells[1, 2] = "Foo"; // Sets Cell A2 to "Foo"
    dynamic[,] excelArray = range.Value2 as dynamic[,]; // This is a very fast operation
    Console.Out.WriteLine(excelArray[1, 2]); // => Foo

    excelArray[1, 2] = "Bar";
    range.Value2 = excelArray; // Sets Cell A2 to "Bar", again a fast operation even for large arrays
    Console.Out.WriteLine(range.Cells[1, 2]); // => Bar
请注意,
excelArray
的行和列下限为1:

    Console.Out.WriteLine("RowLB: " + excelArray.GetLowerBound(0)); // => RowLB: 1
    Console.Out.WriteLine("ColLB: " + excelArray.GetLowerBound(1)); // => ColLB: 1
但是,如果在C#中声明一个
newArray
,并将其赋值,则下限将为0,但它仍然有效:

    dynamic[,] newArray = new dynamic[2, 2]; // Same dimensions as "A1:B2" (2x2)
    newArray[0, 1] = "Foobar";
    range.Value2 = newArray; // Sets Cell A2 to "Foobar"
    Console.Out.WriteLine(range.Cells[1, 2]); // => Foobar
从范围中取出此值将得到下限为0的原始数组:

    range.Cells[1, 2] = "Fubar";

    dynamic[,] lastArray = range.Value2 as dynamic[,];
    Console.Out.WriteLine(lastArray[0, 1]); // => Fubar

    Console.Out.WriteLine("RowLB: " + lastArray.GetLowerBound(0)); // => RowLB: 0
    Console.Out.WriteLine("ColLB: " + lastArray.GetLowerBound(1)); // => ColLB: 0
}

使用Excel Interop可能会让人望而生畏,因为在代码库中有许多这样的特殊情况,但我希望这至少有助于澄清这一点。

问题在于,当范围变成单个单元格时,“range.value”/“range.cell.value”表示字符串值,该字符串不能放入对象数组中。
因此,请检查您的区域是否只有一个或多个单元格,并根据此进行操作,它们至少应该是大写的
range.Cells.Value
。但是关于您的问题没有足够的信息。请澄清它。@SHINJaeGuk-从这里开始:
using Excel = Microsoft.Office.Interop.Excel;

private static void Test()
{
    Excel.Range range = Application.ActiveWorkbook.ActiveSheet.Range["A1:B2"]; // 2x2 array

    range.Cells[1, 2] = "Foo"; // Sets Cell A2 to "Foo"
    dynamic[,] excelArray = range.Value2 as dynamic[,]; // This is a very fast operation
    Console.Out.WriteLine(excelArray[1, 2]); // => Foo

    excelArray[1, 2] = "Bar";
    range.Value2 = excelArray; // Sets Cell A2 to "Bar", again a fast operation even for large arrays
    Console.Out.WriteLine(range.Cells[1, 2]); // => Bar
    Console.Out.WriteLine("RowLB: " + excelArray.GetLowerBound(0)); // => RowLB: 1
    Console.Out.WriteLine("ColLB: " + excelArray.GetLowerBound(1)); // => ColLB: 1
    dynamic[,] newArray = new dynamic[2, 2]; // Same dimensions as "A1:B2" (2x2)
    newArray[0, 1] = "Foobar";
    range.Value2 = newArray; // Sets Cell A2 to "Foobar"
    Console.Out.WriteLine(range.Cells[1, 2]); // => Foobar
    range.Cells[1, 2] = "Fubar";

    dynamic[,] lastArray = range.Value2 as dynamic[,];
    Console.Out.WriteLine(lastArray[0, 1]); // => Fubar

    Console.Out.WriteLine("RowLB: " + lastArray.GetLowerBound(0)); // => RowLB: 0
    Console.Out.WriteLine("ColLB: " + lastArray.GetLowerBound(1)); // => ColLB: 0
}