2015-04-14 9 views
0

Мне нужно загрузить файлы excel, у меня есть файлы excel с правильным форматом, у меня есть столбец, который содержит большие числа, поэтому в excel он отображает числа с помощью Exponent, например, у меня есть это значение 8.99681E + 18 (8996812351321100000)Загрузка файла Excel Изменение типа данных

Я делаю DataTable, читая его во время выполнения, после создания Datatable это значение изменилось с (8996812351321100288). Это, как я делаю

var conn = new OleDbConnection(); 
if (fileExtension == ".xls") 
     //4.0 Connection String 
if (fileExtension == ".xlsx") 
       //12.0 Connection String 

      conn.Open(); 
      DataTable dtSheets = conn.GetSchema("Tables"); 
      string firstSheet = dtSheets.Rows[0]["TABLE_NAME"].ToString(); 
      using (var comm = new OleDbCommand()) 
      { 
       comm.CommandText = "select * from [" + firstSheet + "]"; 
       comm.Connection = conn;     
       using (var da = new OleDbDataAdapter()) 
       { 
        da.SelectCommand = comm; 
        da.Fill(dt); 
        if (dt.Columns.Contains("SIMNo")) 
        { 
         DataTable dtCloned = dt.Clone(); 
         dtCloned.Columns["SIMNo"].DataType = typeof(Int64); 
         foreach (DataRow row in dt.Rows) 
         { 
          dtCloned.ImportRow(row); 
         } 
         return dtCloned; 
        } 
        return dt; 
       } 
      } 

Есть ли способ, что я могу изменить тип данных SIMNo во время выполнения, прежде чем creaating DataTable? И как я могу это сделать?

+0

литья 8996812351321100000 к двойному из длинной урожайности 8,9968123513211E + 18, является то, что вы хотите вместо того, что когда-либо вы пытаетесь сделать здесь? –

+0

В чем проблема? Это в 'dt' или в' dtCloned'? –

+0

@TimRogers его в dtCloned –

ответ

1

Отливка 8996812351321100000.0 на Int64 дает точность округления.

(Int64)8996812351321100000.0 // == 8996812351321100288 

Вместо этого используйте decimal тип данных, как он предназначен для представления десятичных чисел без округления проблем. Или, поскольку это число, которое не будет иметь арифметики, применяемой к нему, просто используйте string.

+0

, поэтому я должен использовать десятичную или строку вместо Int64? –

+0

@SyedSalmanRazaZaidi Да –

+0

Кастинг в строке принимает число, как оно есть с Exponent, я хочу его без экспоненты, как (8996812351321100000) (без десятичной) –

1

Я думаю, BigInt должен помочь.

http://www.carljohansen.co.uk/bigint/. 
Смежные вопросы