3

我的 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 假定它是一个邮政编码),它将返回确切的数字,但编辑 Excel 文件是没有选项的。

我知道我可以使用数据来获取数据,reader.GetDouble(intt);但由于内容混合,这会带来更多麻烦。

关于某种选项的任何建议告诉ExcelDataReader不要转换5892101102012990为这个5.89210110201299E+15

4

3 回答 3

1

我可以建议你使用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("####");
}
于 2018-10-20T07:55:07.350 回答
0

考虑这段代码:

var number = 5892101102012990D;
Console.WriteLine(number.ToString());
Console.WriteLine(number.ToString("F0"));

输出:

5.89210110201299E+15
5892101102012990

您的结果听起来像是 的隐含行为object.ToString(),因此这可能是格式问题。如果您想要与 Excel 中显示的相同输出,您可能有兴趣使用ExcelNumberFormat库格式化值

于 2018-05-31T12:06:49.490 回答
0

看来我必须在 14 次观看后在这里回答我自己的问题。

我只是尝试5.89210110201299E+15使用以下方法将其转换为普通数字:

Decimal.Parse("5.89210110201299E+15", NumberStyles.AllowExponent | NumberStyles.AllowDecimalPoint);

我不知道我以后会不会遇到问题。

我仍然期待更好的解决方案。任何建议将被认真考虑。

于 2018-05-31T10:55:07.843 回答