0

ここで説明されているように、Excelはフォーマットを制御していました

Excelのサンプルデータ(英数字)では: -

  • P000213590-A
  • 312700133751-- > 3.127E+11 として表示

    私のサンプルコードでは: -

    DataTable dt = new DataTable("PartUpload");
    
    DataColumn column;
    
    column = new DataColumn();
    column.DataType = System.Type.GetType("System.String");
    column.AllowDBNull = true;
    column.ColumnName = "Part Original";
    dt.Columns.Add(column);
    
    column = new DataColumn();
    column.DataType = System.Type.GetType("System.String");
    column.AllowDBNull = true;
    column.ColumnName = "Part_ToString";
    dt.Columns.Add(column);
    
    column = new DataColumn();
    column.DataType = System.Type.GetType("System.String");
    column.AllowDBNull = true;
    column.ColumnName = "Part_TryParse";
    dt.Columns.Add(column);
    
    string connStr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\seahc1\Desktop\test1.xls;Extended Properties=ImportMixedTypes=Text;Excel 8.0;HDR=Yes;IMEX=1";
    
    OleDbConnection objConn = new OleDbConnection(connStr);
    objConn.Open();
    
    OleDbDataAdapter adap = new OleDbDataAdapter(@"SELECT Part as [Part Original]FROM [Sheet1$]", connStr);
    
    adap.Fill(dt);
    
    foreach (DataRow row in dt.Rows)
    {
        row["Part_ToString"] = row["Part Original"].ToString();
    
        double doubleConverResult;
        bool result = double.TryParse(row["Part Original"].ToString(), NumberStyles.Any, CultureInfo.InvariantCulture, out doubleConverResult);
        if (result)
        {
            row["Part_TryParse"] = doubleConverResult.ToString();
        }
    }
    

    Part_ToString = with exponential = "3.1270013375e+011"
    Part_TryParse = round tonearest=312700133750

    デバッグしたところadap.Fill(dt)、データテーブルに指数関数のデータが入力されていることがわかりました。

    エンド ユーザーに Excel スプレッドシートの書式を設定させたくないので、C# プログラムから正確な値を取得するにはどうすればよいですか。

    アドバイスをください、ありがとう。

  • 4

    1 に答える 1

    0

    クリスタルの意味がわかります。

    Excel ドキュメントを作成し、312700133751 の数値をセルに入力します。セルの書式設定は「一般」である必要があります。

    Excel では、312700133751 ではなく 3.127E+11 が表示されます。

    問題は、OleDbConnection ドライバーでファイルを読み取ると、DataTable に "3.1270013505e+011" 文字列値が入力されることです (Excel の書式が "General" の場合でも)。

    問題は、3.1270013505e+011 が 312700133751 ではなく 312700133750 に等しいことです (最後の桁が 1 ではなくゼロであることに注意してください)。これが問題です!OleDbConnection が数値の小数点以下を最大 10 桁まで「切り捨て」ているため、変換から余分な桁が 1 桁残ります。

    私も解決策を見つけていません...

    于 2011-09-23T17:25:56.927 に答える