Чтение числа из листа Excel меняет значение - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть программа на C #, которая читает книгу Excel и затем создает файл XML, который может быть запущен для XSLT.Проблема, которая возникла, состоит в том, что одно из полей является числом, и при чтении его из таблицы Excel значение изменяется.Вот пример:

Электронная таблица Excel считывается, и данные загружаются в таблицу данных.Один из способов сделать это - взять созданный мной документ электронной таблицы и передать ссылку на ячейку в этот метод здесь:

dataRow[columnIndex] = GetCellValue(spreadSheetDocument, cell);

private static string GetCellValue(SpreadsheetDocument document, Cell cell)
    {
        //This process uses the OpenXML SDK to get individual cells values to populate the DataTable
        SharedStringTablePart stringTablePart = document.WorkbookPart.SharedStringTablePart;
        string value = "";
        //One of the things that needed to be accounted for was empty cells
        try
        {
            value = cell.CellValue.InnerXml;
        }
        catch (Exception)
        {
            value = "";
        }
        //Setting cell data type right now just sets everything to strings
        //Later, the better option will be to work on the Date Conversions and Data Types here
        if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
        {
            return stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText;
        }
        else
        {
            return value;
        }
    }

Так, например, если ячейка, в которой она читает, равна 115, тогда вывод выглядит так:

114.99999999999999

Затем в других случаях, если значение равно 125, вывод выглядит так:

125.00000000000001

несоответствие в выводе немногоозадачивает.Я надеялся, что, возможно, мне удастся лучше понять причину этого, чем просто исправить это позже в XSLT.

1 Ответ

0 голосов
/ 13 февраля 2019

Итак, я нашел обходной путь, более чем реальное решение.По-видимому, это ошибка в OpenXML SDK.Я нашел исходную документацию, которая указала мне в этом направлении здесь

Что я нашел, как способ обойти это было следующее:

private static string GetCellValue(SpreadsheetDocument document, Cell cell)
    {
        //This process uses the OpenXML SDK to get individual cells values to populate the DataTable
        SharedStringTablePart stringTablePart = document.WorkbookPart.SharedStringTablePart;
        string value = "";
        //One of the things that needed to be accounted for was empty cells
        try
        {
            value = cell.CellValue.InnerXml;
        }
        catch (Exception)
        {
            value = "";
        }
        //Checking to see if this string contains a decimal with values on either side
        if (Regex.IsMatch(value, regexpattern))
        {
            value = Math.Round(Double.Parse(value), 0, MidpointRounding.AwayFromZero).ToString();
        }
        //Setting cell data type right now just sets everything to strings
        //Later, the better option will be to work on the Date Conversions and Data Types here
        if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
        {
            return stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText;
        }
        else
        {
            return value;
        }
    }

Я использую Regexопределить, встречается ли эта ошибка, а затем компенсировать ее с помощью некоторого округления.Интересно отметить, что это происходит только с целыми числами.

Спасибо!

...