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); }