2016-11-07 83 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()'?也许你可以得到一个“双”或“十进制”,如果它呢? – JOG

回答

0

我猜的Excel本身,当你在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

Hello Jog,ItemArray获取数组中excel行的所有值,在我的情况下,我正在阅读索引为2的每一行中的值。 – user2427616

+0

我试着用我得到的答案直到现在还无法解决这个问题 – user2427616

+0

我明白,但是ItemArray中的类型或类是什么? – JOG