Всегда получать данные в виде строки из файла 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);
я не знаю, столкнусь ли я позже с проблемой.
Я все еще жду лучшего решения. Любой совет будет оценен.