我必须上传excel文件,我有正确格式的excel文件,我有一个包含大数字的列,所以在excel中它显示带有Exponent的数字,例如我有这个值8.99681E + 18( 8996812351321100000)
我通过在运行时读取它来创建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;
}
}
有没有办法可以在创建DataTable之前在运行时更改SIMNo的数据类型?我该怎么做?
答案 0 :(得分:1)
将8996812351321100000.0
投射到Int64
会产生精确舍入误差。
(Int64)8996812351321100000.0 // == 8996812351321100288
相反,请使用decimal
数据类型,因为它旨在表示十进制数而不会出现舍入问题。或者,因为它是一个不会应用任何算术的数字,只需使用string
。
答案 1 :(得分:1)
我认为,BigInt应该是一个帮助。
http://www.carljohansen.co.uk/bigint/.