注意:此示例仅适用于包含多个单元格的范围。如果范围只有一个单元格(1x1),Excel将以特殊方式处理它,且range.Value2不会返回二维数组,而是单个值。这些特殊情况会让你感到非常困惑,还有零和非零数组下限:
原始答案:最初的回答
using Excel = Microsoft.Office.Interop.Excel;
private static void Test()
{
Excel.Range range = Application.ActiveWorkbook.ActiveSheet.Range["A1:B2"];
range.Cells[1, 2] = "Foo";
dynamic[,] excelArray = range.Value2 as dynamic[,];
Console.Out.WriteLine(excelArray[1, 2]);
excelArray[1, 2] = "Bar";
range.Value2 = excelArray;
Console.Out.WriteLine(range.Cells[1, 2]);
请注意,
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];
newArray[0, 1] = "Foobar";
range.Value2 = newArray;
Console.Out.WriteLine(range.Cells[1, 2]);
将该值从范围中提取出来,将给您带来原始数组,其下限为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可能会让人望而生畏,因为代码库中存在许多特殊情况,但我希望这可以至少澄清其中一个。
"Original Answer"翻译成中文是"最初的回答"。
Range.Cells.Value
一样大写。但是关于您的问题没有足够的信息,请澄清一下。 - Soner Gönül