2016-11-07 9 views
0

私はC#アプリケーションを書いて、セルの値を読み込んで自分のアプリケーションに表示しました。 decimalSeperatorの領域設定が.で、groupSeperatorが,の場合はうまく動作しますが、decimalSeperatorとgroupseperatorの設定が.,から変更された場合は、値が間違っています。Excel番号国際的な設定問題の書式設定

以下のreadValuesでは、読み取るセル値は23.14です。国際設定はヨーロッパの国のため、値は23,14です。しかし、私がstrNumberCellに入れている値は2314です。どうしてこれなの?

private DataSet _ds = new DataSet(); 

public Form1() 
{ 
    InitializeComponent(); 
    LoadExcel(); 
    ReadValues(); 
} 

private void ReadValues() 
{ 
    //The cell value to be read is 23.14 
    //Since the International setting for Europe country its value is 23,14 
    //Value i am getting in strNumberCell is 2314 
    string strNumberCell = _ds.Tables[1].Rows[1].ItemArray[2].ToString(); 
} 

private void LoadExcel() 
{ 
    try 
    { 
     // XLSX - Excel 2007, 2010, 2012, 2013 
     using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" + 
                  "Data Source=" + System.Windows.Forms.Application.StartupPath + "\\Test.xlsx;" + 
                  "Extended Properties=Excel 12.0 Xml;")) 
     { 
      conn.Open(); 
      OleDbCommand cmd = new OleDbCommand(); 
      cmd.Connection = conn; 

      // Get all Sheets in Excel File 
      System.Data.DataTable dtSheet = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 

      // Loop through all Sheets to get data 
      foreach (DataRow dr in dtSheet.Rows) 
      { 
       string sheetName = dr["TABLE_NAME"].ToString(); 

       if (!sheetName.EndsWith("$")) 
        continue; 

       // Get all rows from the Sheet 
       cmd.CommandText = "SELECT * FROM [" + sheetName + "]"; 

       System.Data.DataTable dt = new System.Data.DataTable(); 
       dt.TableName = sheetName; 

       OleDbDataAdapter da = new OleDbDataAdapter(cmd); 
       da.Fill(dt); 
       _ds.Tables.Add(dt); 


      } 

      cmd = null; 
      conn.Close(); 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message + " at LoadExcel function.", "Exception", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
    } 
} 
+0

タブ全体のセルプロパティを一般的なテキストに設定してから値をコピーすることはできますか?それは最も簡単な方法になります –

+0

オブジェクト 'ItemArray [2]'が何であるか分かりませんが、なぜ '.ToString()'を使用していますか?代わりに 'double'または' decimal'を得ることができるかもしれませんか? – JOG

答えて

0

私は、エクセル自体を推測Excelでそれを表示したとき、あなたはパラメータを指定せずにデフォルトToStringとなっているよりも、別のフォーマット方法で文字列にその値をフォーマットします。

CultureInfoのフォーマッタを投げ込んでみてください。ここにはMSDN on ToStringの例があります。

using System; 
using System.Globalization; 

public class Example 
{ 
    public static void Main() 
    { 
     String[] cultureNames = { "en-US", "en-GB", "fr-FR", 
           "hr-HR", "ja-JP" }; 
     Decimal value = 1603.49m; 
     foreach (var cultureName in cultureNames) { 
     CultureInfo culture = new CultureInfo(cultureName); 
     Console.WriteLine("{0}: {1}", culture.Name, 
          value.ToString("C2", culture)); 
     } 
    } 
} 
// The example displays the following output: 
//  en-US: $1,603.49 
//  en-GB: £1,603.49 
//  fr-FR: 1 603,49 € 
//  hr-HR: 1.603,49 kn 
//  ja-JP: ¥1,603.49 

私はItemArray[2]が正確であるオブジェクトの種類を知りませんが、あなたがその特定の細胞の培養情報が必要な場合は、多分あなたはあまりにも、そこからそれを得ることができます。

+0

こんにちはジョグ、ItemArrayは、配列のExcelの行のすべての値を取得します。私の場合、インデックス2の各行の値は読んでいます。 – user2427616

+0

私は今までこれを解決することができなかった答えを試しました – user2427616

+0

私は理解しますが、どのタイプまたはクラスがItemArrayにありますか? – JOG