2

我主要使用 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;
}

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

当我尝试使用包含空单元格的范围运行此函数时,它会出现可怕的错误,目前我只是尝试/捕获一条错误消息,通知用户在任何空单元格中输入 N/A。

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

4

3 回答 3

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;

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

于 2011-11-08T10:55:07.380 回答
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 数组函数

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

 tempList.Add( oneObj is ExcelEmpty ? "!EMPTY" : oneObj.ToString() ); 
于 2011-11-08T19:24:33.920 回答
0
tempList.Add( oneObj.Value == null ? "!EMPTY" : oneObj.ToString() ); 
于 2019-04-03T07:47:47.577 回答