【解決方法】文字列から double にキャストできません

プログラミングQA


現在、C# winform で GemBox を使用して、DGV のデータを Excel に送信しています。 データは渡されていますが、数値は文字列として渡されています。

私が試したこと:

-GemBox のドキュメントに基づいて数値の書式設定を使用してみましたが、何もしないようです。 おそらく、Excelで文字列を検出するためです。 次に例を示します。

C#
worksheet.Cells["B" + current_line_number].Style.NumberFormat = NumberFormatBuilder.Number(2, useThousandsSeparator: true);

worksheet.Cells["B" + current_line_number].Value = data_holder.Rows[i].Cells[0].Value;    //Rotor Speed

-dgv 行を次のようにキャストしてみました:

C#
for (int i = 0; i <= data_holder.Rows.Count - 2; i++)
     {

          //Adding Data
          worksheet.Cells["B" + current_line_number].Value = (double)data_holder.Rows[i].Cells[0].Value;
                
          //Moving to next line
          current_line_number++;

     }

.GetType の有無にかかわらず、次のようにします。

for (int i = 0; i <= data_holder.Rows.Count - 2; i++)
     {

          //Adding Data
          worksheet.Cells["B" + current_line_number].Value = data_holder.Rows[i].Cells[0].Value.ToDouble;
                
          //Moving to next line
          current_line_number++;

     }

-一種の必死の試みで、別のダブルも作成し、それにdgv行を割り当ててから、ダブルをセルに割り当てました。

-私もDGVの設定をいじり、セル形式をN4に設定しましたが、もう一度変更はありません

ありがとう!

解決策 1

エラーは、 Value プロパティは string. それが正しければ、コードを次のように変更します。

C#
worksheet.Cells["B" + current_line_number].Value = data_holder.Rows[i].Cells[0].Value?.ToString();

注意: null 条件演算子 (?.) は、セル値に含まれる可能性がある場合に必要です null.
メンバー アクセス演算子と式 | マイクロソフト ラーン[^]

解決策 2

文字列に “1234.56” のような値が含まれていても、文字列を double にキャストすることはできません。 キャストは、キャストされるオブジェクトのクラスと「宛先」クラスが関連している場合、またはその特定のクラスのペアの明示的なキャスト演算子が作成されている場合にのみ許可されます (これにより、宛先クラスの新しいオブジェクトが作成され、ソース – 宛先への変更はソースには反映されません)。
たとえば、からキャストできます intdouble およびその逆、またはから FormControl 前者は後者から派生しているため – ただし、他の方向にキャストしようとするとエラーが発生する場合があります Button たとえば、クラスは直接関連していません Form

あなたがしなければならないことは、を使用してデータを変換することです double.TryParse メソッド[^]:

C#
string str = "123.45";
double d;
if (!double.TryParse(str, out d))
   {
   ... report problem or log it ...
   return;
   }
Console.WriteLine(d);

あなたは使用することができます double.Parse メソッド[^] ただし、ソースが有効な double 値でない場合は例外がスローされ、アプリがクラッシュする可能性があります。

解決策 3

C# 側では、DGV 列に TextBox 列の種類を使用する必要があります。Excel セルに double を保持する場合は、Double に変換する必要があります。

Excel VBA では、https://www.exceldemy.com/excel-vba-convert-string-to-double/ を参照してください。

fyi: C# の場合は、Double.Parse() メソッドと Double.TryParse() メソッドを調べてください。

GemBox の無料 (サポートなし) バージョンでさえ、優れた例があります。

コメント

タイトルとURLをコピーしました