private void ReadSheetGlobals(XlsxWorksheet sheet)
		{
			_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)
				{
					var dimValue = _xmlReader.GetAttribute(XlsxWorksheet.A_ref);

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

					break;
				}
			}
		}
		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];

				var rowIndex = int.Parse(_xmlReader.GetAttribute(XlsxWorksheet.A_r));
				if (rowIndex != (_depth + 1))
				{
					_emptyRowCount = rowIndex - _depth - 1;
				}
				var hasValue = false;
				var a_s = String.Empty;
				var a_t = String.Empty;
				var a_r = String.Empty;
				var col = 0;
				var 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)
					{
						object o = _xmlReader.Value;
 
 						if (null != a_t && a_t == XlsxWorksheet.A_s)
 						{
							o = _workbook.SST[Convert.ToInt32(o)];
						}
						else if (null != a_s)
						{
							var xf = _workbook.Styles.CellXfs[int.Parse(a_s)];

							if (xf.ApplyNumberFormat && IsDateTimeStyle(xf.NumFmtId) && o != null && o.ToString() != string.Empty)
							{
							    try {
                                    o = DateTime.FromOADate(Convert.ToDouble(o, CultureInfo.InvariantCulture));    
							    } catch {
							        // just don't try and convert it then
							    }
								
							}
						}

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

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

				return true;
			}

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

			return false;
		}