Excel已根据here
中的说明控制了格式在excel的示例数据(字母数字)中: -
在我的示例代码中: -
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 to nearest = 312700133750
我调试并发现adap.Fill(dt)
用指数数据填充数据表。
如何通过C#程序获取确切的值,因为我不希望最终用户格式化他们的Excel电子表格。
请指教,谢谢。
答案 0 :(得分:0)
我看到了Crystal意味着什么。
创建Excel文档并将312700133751编号放入单元格中。单元格的格式必须为“常规”。
Excel将显示3.127E + 11而不是312700133751。
问题是,当您使用OleDbConnection驱动程序读取文件时,DataTable将填充“3.1270013505e + 011”字符串值(即使Excel具有“常规”格式)。
问题是3.1270013505e + 011等于312700133750,而不是312700133751(注意最后一位数,是零而不是一位)。这是问题! OleDbConnection正在“截断”最多10位数字的小数位数,这会在转换中留下一个额外的数字。
我还没有找到解决方案......