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 を入力するようにユーザーに通知するエラー メッセージが表示された try/catch があります。

私が本当にやりたいことは、おそらくこの関数で、「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

おそらくエラーが発生している理由である null を見つけている場合、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 に答える