Skip to content

Text like numeric incorrectly (differently) handled. #47

Closed
@WesolyPierozek

Description

@WesolyPierozek

I have in excel cell value "0682".

ExcelOpenXmlReader in function ReadSheetRow converts value to double on beginning. Is it correct approach? I though value returned by reader should be same as visible in excel workbook. For solving that issue i changed my code a bit:

if (_xmlReader.NodeType == XmlNodeType.Text && hasValue)
                    {
                        object o = _xmlReader.Value;

                        var style = NumberStyles.Any;
                        var culture = CultureInfo.InvariantCulture;

                        bool is_string = false;

                        if (null != a_t && a_t == XlsxWorksheet.N_inlineStr)
                        {
                            o = Helpers.ConvertEscapeChars(o.ToString());
                            if (_xmlReader.XmlSpace == XmlSpace.Preserve)
                            {
                                is_string = true;
                            }
                        }
                        else if (null != a_t && a_t == XlsxWorksheet.A_s) //if string
                        {
                            o = Helpers.ConvertEscapeChars(_workbook.SST[int.Parse(o.ToString())]);
                            is_string = true;
                        } // Requested change 4: missing (it appears that if should be else if)                        
                        else if (a_t == "b") //boolean
                        {
                            o = _xmlReader.Value == "1";                            
                        }

                        if (!is_string && a_s != null && !string.IsNullOrEmpty(o.ToString()))
                        {
                            XlsxXf xf = _workbook.Styles.CellXfs[int.Parse(a_s)];
                            double number;
                            long l_number;
                            int i_number;
                            if (IsDateTimeStyle(xf.NumFmtId) && double.TryParse(o.ToString(), out number))
                            {
                                o = Helpers.ConvertFromOATime(number);
                            }
                            else if (!xf.ApplyNumberFormat || xf.NumFmtId == 49)
                            {
                                o = o.ToString();
                            }
                            else if (int.TryParse(o.ToString(), NumberStyles.Integer, culture, out i_number))
                            {
                                o = i_number;
                            }
                            else if (long.TryParse(o.ToString(), NumberStyles.Integer, culture, out l_number))
                            {
                                o = l_number;
                            }
                            else if (double.TryParse(o.ToString(), NumberStyles.Any, culture ,out number))
                            {
                                o = number;
                            }                            
                        }



                        if (col - 1 < _cellsValues.Length)
                            _cellsValues[col - 1] = o;
                    }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions