将多维数组转换为具有可空值的单个数组

时间:2011-11-08 10:51:25

标签: c# excel excel-dna

我主要使用ExcelDNA / C#/ Excel。我本来要做的是使用以下代码将多维数组(即一系列单元格)转换为奇异维数组:

private static string[] MultiToSingle(object[,] multiArray)
{
   List<string> tempList;
   string[] returnArray;
   tempList = new List<string>();

   //Add each element of the multi-dimensional Array to the list
   foreach (object oneObj in multiArray)
   {
      tempList.Add(oneObj.ToString());
   }
   //Convert the list to a single dimensional array
   returnArray = tempList.ToArray();
   return returnArray;
}

这是一种享受,在我的整个项目中使用了很多次,但是我想添加更多功能。

当我尝试使用包含空单元格的范围运行此函数时,它的错误非常可怕,此时我只有一个带有错误消息的try / catch,通知用户将N / A输入任何空单元格。

我真正想做的是,或许在这个函数中,将任何'null'或任何Excel存储空单元格转换为文本字符串“N / A”。

3 个答案:

答案 0 :(得分:5)

也许只是:

tempList.Add(oneObj == null ? "n/a" : oneObj.ToString());

如果你愿意,我也可以考虑如何提高效率:

string[] arr = new string[multiArray.Length];
int i = 0;
foreach (object oneObj in multiArray)
{
    arr[i++] = oneObj == null ? "n/a" : oneObj.ToString();
}
return arr;

这会删除中间列表和一些支持数组副本。

答案 1 :(得分:2)

如果您找到空值,这可能就是您收到错误的原因,Marc的回答是正确的。但您可能希望在另一个上下文中使用该函数 - 直接作为Excel-DNA公开的工作表函数。

Excel-DNA将Excel单元格清空到参数数组中,作为ExcelDna.Integration.ExcelEmpty类型的对象。因此,如果您的代码直接从Excel-DNA作为工作表函数调用,您将从ToString()获取类型名称,而不是错误。

所以你的函数返回类型改为object [](Excel-DNA不会直接注册你的string []函数)看起来像这样:

public static object[] MultiToSingle(object[,] multiArray)
{
   List<string> tempList;
   object[] returnArray;
   tempList = new List<string>();

   //Add each element of the multi-dimensional Array to the list
   foreach (object oneObj in multiArray)
   {
      tempList.Add(oneObj.ToString());
   }
   //Convert the list to a single dimensional array
   returnArray = tempList.ToArray();
   return returnArray;
}

并在直接作为工作表函数调用时在Excel中提供此输出: Excel-DNA array function

对于这种情况,您可以添加一个数组项类型的检查来处理空单元格:

 tempList.Add( oneObj is ExcelEmpty ? "!EMPTY" : oneObj.ToString() ); 

答案 2 :(得分:0)

tempList.Add( oneObj.Value == null ? "!EMPTY" : oneObj.ToString() );