Всегда получать данные в виде строки из файла Excel, используя 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 ответа

Я могу предложить вам использовать 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("####");
}

Рассмотрим этот код:

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

Выход:

5.89210110201299E+15
5892101102012990

Ваши результаты звучат как неявное поведение object.ToString(), так что это может быть проблемой форматирования. Если вы хотите получить тот же вывод, что и в Excel, вам может быть интересно отформатировать значение с помощью библиотеки ExcelNumberFormat.

Кажется, что я должен ответить на свой вопрос здесь после 14 просмотров.

я просто пытался преобразовать 5.89210110201299E+15 на обычный номер, используя это:

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

я не знаю, столкнусь ли я позже с проблемой.

Я все еще жду лучшего решения. Любой совет будет оценен.

Другие вопросы по тегам