我的Excel文件中有一个包含此编号的单元格:5892101102012990
和包含混合数据的其他单元格(也是字符串)
我得到这个单元格的数据:
var filestream = File.Open(@"D:\111XLS\File.xlsx", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
var reader = ExcelReaderFactory.CreateReader(filestream);
while (reader.Read())
{
var intt = int.Parse(textBox1.Text);
var v1 = reader.GetValue(intt);
var v2 = reader.GetValue(intt + 3);
listBox1.Items.Add(v1 ?? "");
listBox2.Items.Add(v2 ?? "");
}
当它到达那个单元格时,我有这个:5.89210110201299E+15
如果我将Excel文件中的单元格格式更改为Special
(Excel假定它是一个Zip代码),它将返回确切的数字,但编辑Excel文件的选项不可用。
我知道我可以使用reader.GetDouble(intt);
获取数据,但由于内容混合,这会导致更多麻烦。
有关某种选项的建议告诉ExcelDataReader
不要将5892101102012990
转换为此5.89210110201299E+15
吗?
答案 0 :(得分:0)
似乎我必须在14次观看之后回答我自己的问题。
我只是尝试使用以下代码将5.89210110201299E+15
转换为正常数字:
Decimal.Parse("5.89210110201299E+15", NumberStyles.AllowExponent | NumberStyles.AllowDecimalPoint);
我不知道我以后是否会遇到问题。
我仍然期待着更好的解决方案。 任何建议将不胜感激。
答案 1 :(得分:0)
考虑以下代码:
var number = 5892101102012990D;
Console.WriteLine(number.ToString());
Console.WriteLine(number.ToString("F0"));
输出:
5.89210110201299E+15
5892101102012990
您的结果听起来像object.ToString()
的隐式行为,因此这可能是格式问题。如果您想要与Excel中显示的输出相同,您可能有兴趣使用ExcelNumberFormat库格式化值
答案 2 :(得分:0)
我建议您使用GetFieldType(int index)
这样的功能:
while (reader.Read())
{
var intt = int.Parse(textBox1.Text);
var v1 = reader.GetValue(intt);
var v2 = reader.GetValue(intt + 3);
var fieldType1 = reader.GetFieldType(intt);
var fieldType2 = reader.GetFieldType(intt + 3);
var value1 = v1 == null ? null: Convert.ChangeType(v1, fieldType1);
var value2 = v2 == null ? null: Convert.ChangeType(v2, fieldType2);
listBox1.Items.Add(value1?.ToString() ?? string.Empty);
listBox2.Items.Add(value2?.ToString() ?? string.Empty);
}
如果要在将Format-String添加到列表之前使用它,请使用如下代码:
var valueString1 = value1?.TsString();
if (value1 != null && fieldType1 == typeof(double))
{
valueString1 = ((double)value1).ToString("####");
}