读取一长串数字作为字符串

Reading long sequence of digit as string

我正在使用 EPPlus 读取客户数据库。 有时在我读作字符串的文本单元格中,客户写了一长串数字 我的代码以指数格式读取它。

有没有办法强制读取字符串?

这是我正在使用的代码片段

using (ExcelPackage xlPackage = new ExcelPackage(new FileInfo(xlsFile))) {
var myWorksheet = xlPackage.Workbook.Worksheets.First();

    while (!string.IsNullOrEmpty(myWorksheet.Cells[rowNum, 1].GetValue<string>())) 
    {
        var cell = myWorksheet.Cells[rowNum, 20];
        var idDoc =  cell.GetValue<string>(),

        // do something with idDoc

        rowNum += 1;
    }
}

当单元格包含 1790002099190700 时,idDoc 为“1,7900020991907E+15”

您所看到的是有道理的,因为 excel 会将值存储为 double,就像任何其他数值一样。

您似乎正在从数据库导出到 excel。我会假设导出时 Excel 中没有设置格式,在这种情况下,使用单元格对象的 .Text 值只是退回到 excel 中的 "General"。

假设你有这个:

所以,你最终得到的是:

[TestMethod]
public void Cell_Digits_As_String()
{
    //

    var fi = new FileInfo(@"c:\temp\Cell_Digits_As_String.xlsx");

    using (var package = new ExcelPackage(fi))
    {
        var workbook = package.Workbook;
        var worksheet = workbook.Worksheets.First();
        var valCell = worksheet.Cells[1, 1];

        var valText = valCell.Text; //Applies "General" unless otherwise specified
        var valValue = valCell.Value; //As a BOXED double
        var valString = valCell.GetValue<string>(); //Falls back to ChangeType

        Console.WriteLine($"Value as text: {valText} ({valText.GetType()})");
        Console.WriteLine($"      Same as: {((double)valValue).ToString("0.#####", new CultureInfo("es-US"))}");

        Console.WriteLine($"Value as value: {valValue} ({valValue.GetType()})");
        Console.WriteLine($"       Same as: {valValue.ToString()}");

        Console.WriteLine($"Value as string: {valString} ({valString.GetType()})");
        Console.WriteLine($"        Same as: {Convert.ChangeType(valValue, typeof(double)).ToString()}");
    }
}

这在外面显示:

Value as text: 1790002099190700 (System.String)
      Same as: 1790002099190700
Value as value: 1.7900020991907E+15 (System.Double)
       Same as: 1.7900020991907E+15
Value as string: 1.7900020991907E+15 (System.String)
        Same as: 1.7900020991907E+15

所以,似乎使用.Text是最方便的。但是,如果您担心格式被以任何方式更改或只是想绝对确定,请执行以下操作:

try
{           
    ((double)valCell.Value).ToString("0.#");
}
catch (Exception ex)
{
    //Handle it...
}