Чтение длинной последовательности цифр в виде строки - PullRequest
1 голос
/ 23 сентября 2019

Я использую 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"

1 Ответ

0 голосов
/ 24 сентября 2019

То, что вы видите, имеет смысл, так как Excel будет хранить значение как double, как любое другое числовое значение.

Похоже, вы экспортируете из базы данных в Excel.Я бы предположил, что при экспорте форматирование не установлено в Excel, и в этом случае, используя значение .Text объекта ячейки, просто вернитесь к «General» в Excel.

Скажем, у вас есть это:

enter image description here

Итак, в итоге вы получите следующее:

[TestMethod]
public void Cell_Digits_As_String()
{
    ///12787989/chtenie-dlinnoi-posledovatelnosti-tsifr-v-vide-stroki

    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...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...