【问题标题】:Always Get Data as String from Excel file using ExcelDataReader始终使用 ExcelDataReader 从 Excel 文件中以字符串形式获取数据
【发布时间】:2018-10-20 16:11:29
【问题描述】:

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

【问题讨论】:

  • 有没有办法将 FileStream 的单元格即时转换为字符串,然后将其提供给 ExcelDataReader 以解决问题?

标签: c# types exceldatareader


【解决方案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("####");
}

【讨论】:

    【解决方案2】:

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

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

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

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

    我仍然期待更好的解决方案。 任何建议将不胜感激。

    【讨论】:

      【解决方案3】:

      考虑这段代码:

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

      输出:

      5.89210110201299E+15
      5892101102012990
      

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-18
      相关资源
      最近更新 更多