Всегда получать данные в виде строки из файла Excel, используя ExcelDataReader - PullRequest
0 голосов
/ 31 мая 2018

В моем файле 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 ]

0 голосов
/ 31 мая 2018

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

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

Вывод:

5.89210110201299E+15
5892101102012990

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

0 голосов
/ 20 октября 2018

Я могу предложить вам использовать функцию 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);
}

И если вы хотите использовать строку формата перед добавлением ее в свой список, используйте код, подобный этому:

var valueString1 = value1?.TsString();
if (value1 != null && fieldType1 == typeof(double))
{
    valueString1 = ((double)value1).ToString("####");
}
0 голосов
/ 31 мая 2018

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...