private void ReadWorkbookRels(Stream xmlFileStream)
        {
            using (XmlReader reader = XmlReader.Create(xmlFileStream))
            {
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element && reader.Name == N_rel)
                    {
                        string rid = reader.GetAttribute(A_id);

                        for (int i = 0; i < sheets.Count; i++)
                        {
                            XlsxWorksheet tempSheet = sheets[i];

                            if (tempSheet.RID == rid)
                            {
                                tempSheet.Path = reader.GetAttribute(A_target);
                                sheets[i]      = tempSheet;
                                break;
                            }
                        }
                    }
                }

                xmlFileStream.Close();
            }
        }
        private void ReadSheetGlobals(XlsxWorksheet sheet)
        {
            if (_xmlReader != null)
            {
                _xmlReader.Close();
            }
            if (_sheetStream != null)
            {
                _sheetStream.Close();
            }

            _sheetStream = _zipWorker.GetWorksheetStream(sheet.Path);

            if (null == _sheetStream)
            {
                return;
            }

            _xmlReader = XmlReader.Create(_sheetStream);

            while (_xmlReader.Read())
            {
                if (_xmlReader.NodeType == XmlNodeType.Element && _xmlReader.Name == XlsxWorksheet.N_dimension)
                {
                    string dimValue = _xmlReader.GetAttribute(XlsxWorksheet.A_ref);

//					if (dimValue.IndexOf(':') > 0)
//					{
                    sheet.Dimension = new XlsxDimension(dimValue);
//					}
//					else
//					{
//						_xmlReader.Close();
//						_sheetStream.Close();
//					}

                    break;
                }
            }

            //read up to the sheetData element. if this element is empty then there aren't any rows and we need to null out dimension
            _xmlReader.ReadToFollowing(XlsxWorksheet.N_sheetData);
            if (_xmlReader.IsEmptyElement)
            {
                sheet.IsEmpty = true;
            }
        }
        private bool ReadSheetRow(XlsxWorksheet sheet)
        {
            if (null == _xmlReader)
            {
                return(false);
            }

            if (_emptyRowCount != 0)
            {
                _cellsValues = new object[sheet.ColumnsCount];
                _emptyRowCount--;
                _depth++;

                return(true);
            }

            if (_savedCellsValues != null)
            {
                _cellsValues      = _savedCellsValues;
                _savedCellsValues = null;
                _depth++;

                return(true);
            }

            if ((_xmlReader.NodeType == XmlNodeType.Element && _xmlReader.Name == XlsxWorksheet.N_row) ||
                _xmlReader.ReadToFollowing(XlsxWorksheet.N_row))
            {
                _cellsValues = new object[sheet.ColumnsCount];

                int rowIndex = int.Parse(_xmlReader.GetAttribute(XlsxWorksheet.A_r));
                if (rowIndex != (_depth + 1))
                {
                    _emptyRowCount = rowIndex - _depth - 1;
                }
                bool   hasValue = false;
                string a_s      = String.Empty;
                string a_t      = String.Empty;
                string a_r      = String.Empty;
                int    col      = 0;
                int    row      = 0;

                while (_xmlReader.Read())
                {
                    if (_xmlReader.Depth == 2)
                    {
                        break;
                    }

                    if (_xmlReader.NodeType == XmlNodeType.Element)
                    {
                        hasValue = false;

                        if (_xmlReader.Name == XlsxWorksheet.N_c)
                        {
                            a_s = _xmlReader.GetAttribute(XlsxWorksheet.A_s);
                            a_t = _xmlReader.GetAttribute(XlsxWorksheet.A_t);
                            a_r = _xmlReader.GetAttribute(XlsxWorksheet.A_r);
                            XlsxDimension.XlsxDim(a_r, out col, out row);
                        }
                        else if (_xmlReader.Name == XlsxWorksheet.N_v)
                        {
                            hasValue = true;
                        }
                    }

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

                        if (double.TryParse(o.ToString(), out number))
                        {
                            o = number;
                        }

                        if (null != a_t && a_t == XlsxWorksheet.A_s) //if string
                        {
                            o = Helpers.ConvertEscapeChars(_workbook.SST[int.Parse(o.ToString())]);
                        }
                        else if (a_t == "b")                         //boolean
                        {
                            o = _xmlReader.Value == "1";
                        }
                        else if (null != a_s) //if something else
                        {
                            XlsxXf xf = _workbook.Styles.CellXfs[int.Parse(a_s)];
                            if (xf.ApplyNumberFormat && o != null && o.ToString() != string.Empty && IsDateTimeStyle(xf.NumFmtId))
                            {
                                o = Helpers.ConvertFromOATime(number);
                            }
                            else if (xf.NumFmtId == 49)
                            {
                                o = o.ToString();
                            }
                        }



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

                if (_emptyRowCount > 0)
                {
                    _savedCellsValues = _cellsValues;
                    return(ReadSheetRow(sheet));
                }
                _depth++;

                return(true);
            }

            _xmlReader.Close();
            if (_sheetStream != null)
            {
                _sheetStream.Close();
            }

            return(false);
        }