/// <summary> /// Returns false if more records are needed to parse the value. The caller is expected to retry after parsing a record into additionalRecords. /// </summary> private bool PushCellValue(object[] cellValues, XlsBiffBlankCell cell, ushort xFormat, List <XlsBiffRecord> additionalRecords) { double doubleValue; int intValue; LogManager.Log(this).Debug("PushCellValue {0}", cell.Id); switch (cell.Id) { case BIFFRECORDTYPE.BOOLERR: if (cell.ReadByte(7) == 0) { cellValues[cell.ColumnIndex] = cell.ReadByte(6) != 0; } break; case BIFFRECORDTYPE.BOOLERR_OLD: if (cell.ReadByte(8) == 0) { cellValues[cell.ColumnIndex] = cell.ReadByte(7) != 0; } break; case BIFFRECORDTYPE.INTEGER: case BIFFRECORDTYPE.INTEGER_OLD: intValue = ((XlsBiffIntegerCell)cell).Value; cellValues[cell.ColumnIndex] = TryConvertOADateTime(intValue, xFormat); break; case BIFFRECORDTYPE.NUMBER: case BIFFRECORDTYPE.NUMBER_OLD: doubleValue = ((XlsBiffNumberCell)cell).Value; cellValues[cell.ColumnIndex] = TryConvertOADateTime(doubleValue, xFormat); LogManager.Log(this).Debug("VALUE: {0}", doubleValue); break; case BIFFRECORDTYPE.LABEL: case BIFFRECORDTYPE.LABEL_OLD: case BIFFRECORDTYPE.RSTRING: cellValues[cell.ColumnIndex] = ((XlsBiffLabelCell)cell).GetValue(Encoding); LogManager.Log(this).Debug("VALUE: {0}", cellValues[cell.ColumnIndex]); break; case BIFFRECORDTYPE.LABELSST: string tmp = Workbook.SST.GetString(((XlsBiffLabelSSTCell)cell).SSTIndex, Encoding); LogManager.Log(this).Debug("VALUE: {0}", tmp); cellValues[cell.ColumnIndex] = tmp; break; case BIFFRECORDTYPE.RK: doubleValue = ((XlsBiffRKCell)cell).Value; cellValues[cell.ColumnIndex] = TryConvertOADateTime(doubleValue, xFormat); LogManager.Log(this).Debug("VALUE: {0}", doubleValue); break; case BIFFRECORDTYPE.MULRK: XlsBiffMulRKCell rkCell = (XlsBiffMulRKCell)cell; ushort lastColumnIndex = rkCell.LastColumnIndex; for (ushort j = cell.ColumnIndex; j <= lastColumnIndex; j++) { doubleValue = rkCell.GetValue(j); LogManager.Log(this).Debug("VALUE[{1}]: {0}", doubleValue, j); cellValues[j] = TryConvertOADateTime(doubleValue, rkCell.GetXF(j)); } break; case BIFFRECORDTYPE.BLANK: case BIFFRECORDTYPE.BLANK_OLD: case BIFFRECORDTYPE.MULBLANK: // Skip blank cells break; case BIFFRECORDTYPE.FORMULA: case BIFFRECORDTYPE.FORMULA_V3: case BIFFRECORDTYPE.FORMULA_V4: if (!TryGetFormulaValue((XlsBiffFormulaCell)cell, xFormat, additionalRecords, out object objectValue)) { // want additional records return(false); } cellValues[cell.ColumnIndex] = objectValue; LogManager.Log(this).Debug("VALUE: {0}", objectValue); break; } return(true); }
/// <summary> /// Reads additional records if needed: a string record might follow a formula result /// </summary> private Cell ReadSingleCell(XlsBiffStream biffStream, XlsBiffBlankCell cell, ushort xFormat) { LogManager.Log(this).Debug("ReadSingleCell {0}", cell.Id); double doubleValue; int intValue; object objectValue; var result = new Cell() { ColumnIndex = cell.ColumnIndex }; switch (cell.Id) { case BIFFRECORDTYPE.BOOLERR: if (cell.ReadByte(7) == 0) { result.Value = cell.ReadByte(6) != 0; } break; case BIFFRECORDTYPE.BOOLERR_OLD: if (cell.ReadByte(8) == 0) { result.Value = cell.ReadByte(7) != 0; } break; case BIFFRECORDTYPE.INTEGER: case BIFFRECORDTYPE.INTEGER_OLD: intValue = ((XlsBiffIntegerCell)cell).Value; result.Value = TryConvertOADateTime(intValue, xFormat); break; case BIFFRECORDTYPE.NUMBER: case BIFFRECORDTYPE.NUMBER_OLD: doubleValue = ((XlsBiffNumberCell)cell).Value; result.Value = TryConvertOADateTime(doubleValue, xFormat); break; case BIFFRECORDTYPE.LABEL: case BIFFRECORDTYPE.LABEL_OLD: case BIFFRECORDTYPE.RSTRING: result.Value = ((XlsBiffLabelCell)cell).GetValue(Encoding); break; case BIFFRECORDTYPE.LABELSST: result.Value = Workbook.SST.GetString(((XlsBiffLabelSSTCell)cell).SSTIndex, Encoding); break; case BIFFRECORDTYPE.RK: doubleValue = ((XlsBiffRKCell)cell).Value; result.Value = TryConvertOADateTime(doubleValue, xFormat); break; case BIFFRECORDTYPE.BLANK: case BIFFRECORDTYPE.BLANK_OLD: case BIFFRECORDTYPE.MULBLANK: // Skip blank cells break; case BIFFRECORDTYPE.FORMULA: case BIFFRECORDTYPE.FORMULA_V3: case BIFFRECORDTYPE.FORMULA_V4: objectValue = TryGetFormulaValue(biffStream, (XlsBiffFormulaCell)cell, xFormat); result.Value = objectValue; break; } LogManager.Log(this).Debug("VALUE: {0}", result.Value); return(result); }
/// <summary> /// Reads additional records if needed: a string record might follow a formula result /// </summary> private Cell ReadSingleCell(XlsBiffStream biffStream, XlsBiffBlankCell cell, int xfIndex) { LogManager.Log(this).Debug("ReadSingleCell {0}", cell.Id); var effectiveStyle = Workbook.GetEffectiveCellStyle(xfIndex, cell.Format); var numberFormatIndex = effectiveStyle.NumberFormatIndex; object value = null; switch (cell.Id) { case BIFFRECORDTYPE.BOOLERR: if (cell.ReadByte(7) == 0) { value = cell.ReadByte(6) != 0; } break; case BIFFRECORDTYPE.BOOLERR_OLD: if (cell.ReadByte(8) == 0) { value = cell.ReadByte(7) != 0; } break; case BIFFRECORDTYPE.INTEGER: case BIFFRECORDTYPE.INTEGER_OLD: value = TryConvertOADateTime(((XlsBiffIntegerCell)cell).Value, numberFormatIndex); break; case BIFFRECORDTYPE.NUMBER: case BIFFRECORDTYPE.NUMBER_OLD: value = TryConvertOADateTime(((XlsBiffNumberCell)cell).Value, numberFormatIndex); break; case BIFFRECORDTYPE.LABEL: case BIFFRECORDTYPE.LABEL_OLD: case BIFFRECORDTYPE.RSTRING: value = GetLabelString((XlsBiffLabelCell)cell, effectiveStyle); break; case BIFFRECORDTYPE.LABELSST: value = Workbook.SST.GetString(((XlsBiffLabelSSTCell)cell).SSTIndex, Encoding); break; case BIFFRECORDTYPE.RK: value = TryConvertOADateTime(((XlsBiffRKCell)cell).Value, numberFormatIndex); break; case BIFFRECORDTYPE.BLANK: case BIFFRECORDTYPE.BLANK_OLD: case BIFFRECORDTYPE.MULBLANK: // Skip blank cells break; case BIFFRECORDTYPE.FORMULA: case BIFFRECORDTYPE.FORMULA_V3: case BIFFRECORDTYPE.FORMULA_V4: value = TryGetFormulaValue(biffStream, (XlsBiffFormulaCell)cell, effectiveStyle); break; } return(new Cell(cell.ColumnIndex, value, effectiveStyle)); }