OpenXML 2.0 получает неправильное значение ячейки - PullRequest
2 голосов
/ 04 января 2012

У меня возникли некоторые проблемы при чтении значения из листа Excel 2010.

На стандартном листе Excel 2010 у меня есть ячейка с форматом валюты с двумя десятичными знакамимест и значение 1270,14 €.

Когда я читаю это значение в OpenXML 2.0 (код C #), я получаю 1270.1400000000001 вместо исходного 1270.14.

То же самое происходит с другимизначения в любой ячейке с одинаковым форматированием.

Получение значения из кода OpenXML ячейки:

private string GetCellValue(string column, int row)
{
    column = column.ToUpper();
    var targetCell = cells.Where(p => p.CellReference == (column + row)).SingleOrDefault();

    var value = String.Empty;

    if (targetCell.DataType != null && targetCell.DataType.Value == CellValues.SharedString)
    {
        var index = int.Parse(targetCell.CellValue.Text);
        value = cellValues[index].InnerText.Trim();
    }
    else
    {
        if (targetCell.CellValue != null)
        {
            value = targetCell.CellValue.Text.Trim();
        }
        else
        {
            value = null;
        }
    }

    return value;
}

Конкретное значение передается через тип данных if, если оно не является нулевым условием, и получает значениестрока:

value = targetCell.CellValue.Text.Trim();

Как это можно исправить?

Почему эта ошибка вообще возможна?

Ответы [ 2 ]

2 голосов
/ 06 сентября 2016

Поскольку число хранится как двойное в Excel, вы можете сначала проанализировать строку как двойное, а затем преобразовать обратно в строку, чтобы получить значение для отображения:

    string s = Convert.ToDouble(value).ToString();

Пусть Microsoft решит свою собственную проблему.

1 голос
/ 05 января 2012

Хотя это может не соответствовать вашему приложению, самым простым решением было бы просто округлить полученное вами значение и присвоить его или вернуть, где это применимо.somevarhere=Math.Round(Convert.ToDouble(value), 2)

...