始终使用ExcelDataReader从Excel文件中获取数据作为字符串

时间:2018-05-31 09:30:10

标签: c# types exceldatareader

我的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吗?

3 个答案:

答案 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("####");
}