使用C#将excel范围转换为数组

use*_*843 8 c# arrays excel

我想使用C#将excel范围转换为数组

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
    }
}
Run Code Online (Sandbox Code Playgroud)

如何迭代循环但这段代码不起作用并调用错误:

"无法将'System.String'类型的对象强制转换为'System.Array'."

ja7*_*a72 7

基于我在这里提供的帮助,这就是我在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();
Run Code Online (Sandbox Code Playgroud)

调试 高强


Bal*_*age 6

原帖中的错误信息出现在范围正好由一个单元格组成时,因为结果值的类型是变体,实际上可以是数组、双精度、字符串、日期和空值。

一种解决方案可能是您检查细胞计数并在恰好一个细胞的情况下采取不同的行动。

我的解决方案创建了一组单元格。即使一个或多个单元格为空,这也有效,这可能导致空对象。(当范围的所有单元格都为空时,Range.Cells.Value 为空。)

System.Array cellArray = range.Cells.Cast<Excel.Range>().ToArray<Excel.Range>();
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢列表而不是数组(就像我一样),您可以使用以下代码:

List<Excel.Range> listOfCells = range.Cells.Cast<Excel.Range>().ToList<Excel.Range>();
Run Code Online (Sandbox Code Playgroud)

范围可以是一维或二维的。

最后,如果你确实需要一个字符串数组,这里是:

string[] strArray = range.Cells.Cast<Excel.Range>().Select(Selector).ToArray<string>();
Run Code Online (Sandbox Code Playgroud)

其中 Selector 函数如下所示:

public string Selector(Excel.Range cell)
{
    if (cell.Value2 == null)
        return "";
    if (cell.Value2.GetType().ToString() == "System.Double")
        return ((double)cell.Value2).ToString();
    else if (cell.Value2.GetType().ToString() == "System.String")
        return ((string)cell.Value2);
    else if (cell.Value2.GetType().ToString() == "System.Boolean")
        return ((bool)cell.Value2).ToString();
    else
        return "unknown";
}
Run Code Online (Sandbox Code Playgroud)

对于我不记得 Value2 可以返回的所有数据类型的情况,我包含了“未知”。如果您发现任何其他类型,请改进此功能。


Sha*_*ard 1

该错误意味着该值是一个字符串,因此不能将其直接转换为数组。

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

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

还修复了你的循环,你会得到索引越界错误。