Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        /// <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));
        }