Logo Search packages:      
Sourcecode: jexcelapi version File versions  Download package

final void jxl::read::biff::SheetReader::read (  )  [inline, package]

Reads in the contents of this sheet

Definition at line 331 of file SheetReader.java.

References jxl::biff::drawing::DrawingGroup::add(), jxl::biff::DataValidation::add(), jxl::biff::AutoFilter::add(), addCell(), addCellComment(), addCellValidation(), jxl::biff::ConditionalFormat::addCondition(), jxl::biff::drawing::DrawingData::addRawData(), addToSharedFormulas(), jxl::biff::Type::ARRAY, autoFilter, jxl::biff::Type::AUTOFILTER, jxl::biff::Type::AUTOFILTERINFO, jxl::biff::Type::BLANK, jxl::biff::Type::BOF, jxl::biff::Type::BOOLERR, jxl::biff::Type::BOTTOMMARGIN, buttonPropertySet, jxl::biff::Type::BUTTONPROPERTYSET, jxl::biff::Type::CALCMODE, cells, jxl::biff::Type::CF, charts, jxl::biff::Type::COLINFO, columnBreaks, columnInfosArray, jxl::biff::Type::CONDFMT, conditionalFormats, jxl::biff::Type::CONTINUE, dataValidation, jxl::biff::Type::DEFAULTROWHEIGHT, jxl::biff::Type::DEFCOLWIDTH, jxl::biff::Type::DIMENSION, drawingData, drawings, jxl::biff::Type::DV, jxl::biff::Type::DVAL, jxl::biff::Type::EOF, excelFile, jxl::biff::Type::FILTERMODE, jxl::biff::Type::FOOTER, formattingRecords, jxl::biff::Type::FORMULA, jxl::biff::Type::FORMULA2, jxl::WorkbookSettings::getAutoFilterDisabled(), jxl::WorkbookSettings::getCellValidationDisabled(), jxl::read::biff::Record::getCode(), jxl::Cell::getColumn(), jxl::biff::drawing::Comment::getColumn(), jxl::read::biff::VerticalPageBreaksRecord::getColumnBreaks(), jxl::read::biff::GuttersRecord::getColumnOutlineLevel(), jxl::read::biff::PaneRecord::getColumnsVisible(), jxl::read::biff::SetupRecord::getCopies(), jxl::biff::drawing::MsoDrawingRecord::getData(), jxl::read::biff::Window2Record::getDisplayZeroValues(), jxl::read::biff::WorkbookParser::getDrawingGroup(), jxl::WorkbookSettings::getDrawingsDisabled(), jxl::biff::DataValiditySettingsRecord::getFirstColumn(), jxl::read::biff::MulBlankRecord::getFirstColumn(), jxl::read::biff::MulRKRecord::getFirstColumn(), jxl::biff::DataValiditySettingsRecord::getFirstRow(), jxl::read::biff::SetupRecord::getFitHeight(), jxl::biff::WorkspaceInformationRecord::getFitToPages(), jxl::read::biff::SetupRecord::getFitWidth(), jxl::read::biff::FooterRecord::getFooter(), jxl::read::biff::SetupRecord::getFooterMargin(), jxl::read::biff::FormulaRecord::getFormula(), jxl::read::biff::SharedFormulaRecord::getFormulas(), jxl::read::biff::Window2Record::getFrozen(), jxl::read::biff::HeaderRecord::getHeader(), jxl::read::biff::SetupRecord::getHeaderMargin(), jxl::read::biff::DefaultRowHeightRecord::getHeight(), jxl::biff::drawing::Comment::getHeight(), jxl::read::biff::SetupRecord::getHorizontalPrintResolution(), jxl::WorkbookSettings::getIgnoreBlanks(), jxl::read::biff::SetupRecord::getInitialized(), jxl::biff::DataValiditySettingsRecord::getLastColumn(), jxl::biff::DataValiditySettingsRecord::getLastRow(), jxl::read::biff::Record::getLength(), jxl::read::biff::MarginRecord::getMargin(), jxl::biff::FormattingRecords::getNumberFormat(), jxl::read::biff::MulBlankRecord::getNumberOfColumns(), jxl::read::biff::MulRKRecord::getNumberOfColumns(), jxl::read::biff::DimensionRecord::getNumberOfColumns(), jxl::read::biff::DimensionRecord::getNumberOfRows(), jxl::biff::drawing::ObjRecord::getObjectId(), jxl::biff::DataValidityListRecord::getObjectId(), jxl::biff::drawing::NoteRecord::getObjectId(), jxl::read::biff::RowRecord::getOutlineLevel(), jxl::read::biff::SetupRecord::getPageStart(), jxl::read::biff::SetupRecord::getPaperSize(), jxl::read::biff::PasswordRecord::getPasswordHash(), jxl::read::biff::File::getPos(), jxl::read::biff::PrintGridLinesRecord::getPrintGridLines(), jxl::read::biff::PrintHeadersRecord::getPrintHeaders(), jxl::read::biff::MergedCellsRecord::getRanges(), jxl::read::biff::SaveRecalcRecord::getRecalculateOnSave(), jxl::biff::ContinueRecord::getRecord(), jxl::read::biff::BooleanRecord::getRecord(), jxl::read::biff::MulRKRecord::getRKNumber(), jxl::read::biff::MulBlankRecord::getRow(), jxl::Cell::getRow(), jxl::biff::drawing::Comment::getRow(), jxl::read::biff::MulRKRecord::getRow(), jxl::read::biff::HorizontalPageBreaksRecord::getRowBreaks(), jxl::read::biff::GuttersRecord::getRowOutlineLevel(), jxl::read::biff::PaneRecord::getRowsVisible(), jxl::read::biff::SetupRecord::getScaleFactor(), jxl::read::biff::WorkbookParser::getSettings(), jxl::read::biff::Window2Record::getShowGridLines(), jxl::read::biff::SharedFormulaRecord::getTemplateFormula(), jxl::biff::drawing::Comment::getText(), jxl::biff::drawing::ObjRecord::getType(), jxl::Cell::getType(), jxl::read::biff::Record::getType(), jxl::read::biff::SetupRecord::getVerticalPrintResolution(), jxl::read::biff::DefaultColumnWidthRecord::getWidth(), jxl::biff::drawing::Comment::getWidth(), jxl::read::biff::WorkbookParser::getWorkbookBof(), jxl::read::biff::MulBlankRecord::getXFIndex(), jxl::read::biff::MulRKRecord::getXFIndex(), jxl::read::biff::CellValue::getXFIndex(), jxl::read::biff::SCLRecord::getZoomFactor(), jxl::biff::Type::GUTS, handleObjectRecord(), handleOutOfBoundsCells(), jxl::read::biff::RowRecord::hasDefaultFormat(), jxl::biff::Type::HCENTER, jxl::biff::Type::HEADER, jxl::biff::Type::HLINK, jxl::biff::Type::HORIZONTALPAGEBREAKS, hyperlinks, jxl::read::biff::CalcModeRecord::isAutomatic(), jxl::read::biff::BOFRecord::isBiff8(), jxl::read::biff::CentreRecord::isCentre(), jxl::read::biff::BOFRecord::isChart(), jxl::read::biff::RowRecord::isCollapsed(), jxl::biff::FormattingRecords::isDate(), jxl::read::biff::RowRecord::isDefaultHeight(), jxl::read::biff::BooleanRecord::isError(), jxl::read::biff::Window2Record::isPageBreakPreview(), jxl::read::biff::SetupRecord::isPortrait(), jxl::read::biff::ProtectRecord::isProtected(), jxl::read::biff::SetupRecord::isRightDown(), jxl::read::biff::FormulaRecord::isShared(), jxl::read::biff::BOFRecord::isWorksheet(), jxl::biff::Type::LABEL, jxl::biff::Type::LABELSST, jxl::biff::Type::LEFTMARGIN, logger, jxl::read::biff::RowRecord::matchesDefaultFontHeight(), maxColumnOutlineLevel, maxRowOutlineLevel, mergedCells, jxl::biff::Type::MERGEDCELLS, jxl::biff::Type::MSODRAWING, jxl::biff::Type::MULBLANK, jxl::biff::Type::MULRK, jxl::biff::Type::NAME, jxl::read::biff::File::next(), nineteenFour, jxl::biff::Type::NOTE, jxl::biff::Type::NUMBER, jxl::CellType::NUMBER_FORMULA, numCols, numRows, jxl::biff::Type::OBJ, outOfBoundsCells, jxl::biff::Type::PANE, jxl::biff::Type::PASSWORD, jxl::biff::Type::PLS, plsRecord, jxl::biff::Type::PRINTGRIDLINES, jxl::biff::Type::PRINTHEADERS, jxl::biff::Type::PROTECT, jxl::read::biff::File::restorePos(), revertSharedFormula(), jxl::biff::Type::RIGHTMARGIN, jxl::biff::Type::RK, jxl::biff::Type::RK2, jxl::biff::Type::ROW, rowBreaks, rowProperties, jxl::biff::Type::RSTRING, jxl::biff::Type::SAVERECALC, jxl::biff::Type::SCL, jxl::SheetSettings::setAutomaticFormulaCalculation(), jxl::SheetSettings::setBottomMargin(), jxl::SheetSettings::setCopies(), jxl::SheetSettings::setDefaultColumnWidth(), jxl::SheetSettings::setDefaultRowHeight(), jxl::SheetSettings::setDisplayZeroValues(), jxl::biff::drawing::DrawingGroup::setDrawingsOmitted(), jxl::biff::drawing::MsoDrawingRecord::setFirst(), jxl::SheetSettings::setFitHeight(), jxl::SheetSettings::setFitToPages(), jxl::SheetSettings::setFitWidth(), jxl::SheetSettings::setFooter(), jxl::SheetSettings::setFooterMargin(), jxl::SheetSettings::setHeader(), jxl::SheetSettings::setHeaderMargin(), jxl::SheetSettings::setHorizontalCentre(), jxl::SheetSettings::setHorizontalFreeze(), jxl::SheetSettings::setHorizontalPrintResolution(), jxl::SheetSettings::setLeftMargin(), jxl::biff::drawing::Comment::setNote(), jxl::read::biff::NumberValue::setNumberFormat(), jxl::SheetSettings::setOrientation(), jxl::SheetSettings::setPageBreakPreviewMode(), jxl::SheetSettings::setPageOrder(), jxl::SheetSettings::setPageStart(), jxl::SheetSettings::setPaperSize(), jxl::SheetSettings::setPasswordHash(), jxl::read::biff::File::setPos(), jxl::SheetSettings::setPrintGridLines(), jxl::SheetSettings::setPrintHeaders(), jxl::SheetSettings::setProtected(), jxl::SheetSettings::setRecalculateFormulasBeforeSave(), jxl::SheetSettings::setRightMargin(), jxl::SheetSettings::setScaleFactor(), jxl::SheetSettings::setSelected(), jxl::SheetSettings::setShowGridLines(), settings, jxl::SheetSettings::setTopMargin(), jxl::read::biff::Record::setType(), jxl::biff::Type::SETUP, jxl::SheetSettings::setVerticalCentre(), jxl::SheetSettings::setVerticalFreeze(), jxl::SheetSettings::setVerticalPrintResolution(), jxl::SheetSettings::setZoomFactor(), jxl::biff::Type::SHAREDFORMULA, sharedFormulas, sharedStrings, sheet, sheetBof, startPosition, jxl::biff::Type::TOPMARGIN, jxl::biff::Type::UNKNOWN, jxl::biff::Type::VCENTER, jxl::biff::Type::VERTICALPAGEBREAKS, jxl::common::Logger::warn(), jxl::biff::Type::WINDOW2, workbook, workbookBof, workbookSettings, workspaceOptions, and jxl::biff::Type::WSBOOL.

Referenced by jxl::read::biff::SheetImpl::getDrawingData(), and jxl::read::biff::SheetImpl::readSheet().

  {
    Record r = null;
    BaseSharedFormulaRecord sharedFormula = null;
    boolean sharedFormulaAdded = false;

    boolean cont = true;

    // Set the position within the file
    excelFile.setPos(startPosition);

    // Handles to the last drawing and obj records
    MsoDrawingRecord msoRecord = null;
    ObjRecord objRecord = null;
    boolean firstMsoRecord = true;
    
    // Handle to the last conditional format record
    ConditionalFormat condFormat = null;

    // Handle to the autofilter records
    FilterModeRecord filterMode = null;
    AutoFilterInfoRecord autoFilterInfo = null;

    // A handle to window2 record
    Window2Record window2Record = null;

    // A handle to printgridlines record
    PrintGridLinesRecord printGridLinesRecord = null;

    // A handle to printheaders record
    PrintHeadersRecord printHeadersRecord = null;

    // Hash map of comments, indexed on objectId.  As each corresponding
    // note record is encountered, these are removed from the array
    HashMap comments = new HashMap();

    // A list of object ids - used for cross referencing
    ArrayList objectIds = new ArrayList();

    // A handle to a continue record read in
    ContinueRecord continueRecord = null;

    while (cont)
    {
      r = excelFile.next();
      Type type = r.getType();

      if (type == Type.UNKNOWN && r.getCode() == 0)
      {
        logger.warn("Biff code zero found");

        // Try a dimension record
        if (r.getLength() == 0xa)
        {
          logger.warn("Biff code zero found - trying a dimension record.");
          r.setType(Type.DIMENSION);
        }
        else
        {
          logger.warn("Biff code zero found - Ignoring.");
        }
      }

      if (type == Type.DIMENSION)
      {
        DimensionRecord dr = null;

        if (workbookBof.isBiff8())
        {
          dr = new DimensionRecord(r);
        }
        else
        {
          dr = new DimensionRecord(r, DimensionRecord.biff7);
        }
        numRows = dr.getNumberOfRows();
        numCols = dr.getNumberOfColumns();
        cells = new Cell[numRows][numCols];
      }
      else if (type == Type.LABELSST)
      {
        LabelSSTRecord label = new LabelSSTRecord(r,
                                                  sharedStrings,
                                                  formattingRecords,
                                                  sheet);
        addCell(label);
      }
      else if (type == Type.RK || type == Type.RK2)
      {
        RKRecord rkr = new RKRecord(r, formattingRecords, sheet);

        if (formattingRecords.isDate(rkr.getXFIndex()))
        {
          DateCell dc = new DateRecord
            (rkr, rkr.getXFIndex(), formattingRecords, nineteenFour, sheet);
          addCell(dc);
        }
        else
        {
          addCell(rkr);
        }
      }
      else if (type == Type.HLINK)
      {
        HyperlinkRecord hr = new HyperlinkRecord(r, sheet, workbookSettings);
        hyperlinks.add(hr);
      }
      else if (type == Type.MERGEDCELLS)
      {
        MergedCellsRecord  mc = new MergedCellsRecord(r, sheet);
        if (mergedCells == null)
        {
          mergedCells = mc.getRanges();
        }
        else
        {
          Range[] newMergedCells =
            new Range[mergedCells.length + mc.getRanges().length];
          System.arraycopy(mergedCells, 0, newMergedCells, 0,
                           mergedCells.length);
          System.arraycopy(mc.getRanges(),
                           0,
                           newMergedCells, mergedCells.length,
                           mc.getRanges().length);
          mergedCells = newMergedCells;
        }
      }
      else if (type == Type.MULRK)
      {
        MulRKRecord mulrk = new MulRKRecord(r);

        // Get the individual cell records from the multiple record
        int num = mulrk.getNumberOfColumns();
        int ixf = 0;
        for (int i = 0; i < num; i++)
        {
          ixf = mulrk.getXFIndex(i);

          NumberValue nv = new NumberValue
            (mulrk.getRow(),
             mulrk.getFirstColumn() + i,
             RKHelper.getDouble(mulrk.getRKNumber(i)),
             ixf,
             formattingRecords,
             sheet);


          if (formattingRecords.isDate(ixf))
          {
            DateCell dc = new DateRecord(nv, 
                                         ixf, 
                                         formattingRecords,
                                         nineteenFour, 
                                         sheet);
            addCell(dc);
          }
          else
          {
            nv.setNumberFormat(formattingRecords.getNumberFormat(ixf));
            addCell(nv);
          }
        }
      }
      else if (type == Type.NUMBER)
      {
        NumberRecord nr = new NumberRecord(r, formattingRecords, sheet);

        if (formattingRecords.isDate(nr.getXFIndex()))
        {
          DateCell dc = new DateRecord(nr,
                                       nr.getXFIndex(),
                                       formattingRecords,
                                       nineteenFour, sheet);
          addCell(dc);
        }
        else
        {
          addCell(nr);
        }
      }
      else if (type == Type.BOOLERR)
      {
        BooleanRecord br = new BooleanRecord(r, formattingRecords, sheet);

        if (br.isError())
        {
          ErrorRecord er = new ErrorRecord(br.getRecord(), formattingRecords,
                                           sheet);
          addCell(er);
        }
        else
        {
          addCell(br);
        }
      }
      else if (type == Type.PRINTGRIDLINES)
      {
        printGridLinesRecord = new PrintGridLinesRecord(r);
        settings.setPrintGridLines(printGridLinesRecord.getPrintGridLines());
      }
      else if (type == Type.PRINTHEADERS)
      {
        printHeadersRecord = new PrintHeadersRecord(r);
        settings.setPrintHeaders(printHeadersRecord.getPrintHeaders());
      }
      else if (type == Type.WINDOW2)
      {
        window2Record = null;

        if (workbookBof.isBiff8())
        {
          window2Record = new Window2Record(r);
        }
        else
        {
          window2Record = new Window2Record(r, Window2Record.biff7);
        }

        settings.setShowGridLines(window2Record.getShowGridLines());
        settings.setDisplayZeroValues(window2Record.getDisplayZeroValues());
        settings.setSelected(true);
        settings.setPageBreakPreviewMode(window2Record.isPageBreakPreview());
      }
      else if (type == Type.PANE)
      {
        PaneRecord pr = new PaneRecord(r);

        if (window2Record != null &&
            window2Record.getFrozen())
        {
          settings.setVerticalFreeze(pr.getRowsVisible());
          settings.setHorizontalFreeze(pr.getColumnsVisible());
        }
      }
      else if (type == Type.CONTINUE)
      {
        // don't know what this is for, but keep hold of it anyway
        continueRecord = new ContinueRecord(r);
      }
      else if (type == Type.NOTE)
      {
        if (!workbookSettings.getDrawingsDisabled())
        {
          NoteRecord nr = new NoteRecord(r);

          // Get the comment for the object id
          Comment comment = (Comment) comments.remove
            (new Integer(nr.getObjectId()));

          if (comment == null)
          {
            logger.warn(" cannot find comment for note id " +
                        nr.getObjectId() + "...ignoring");
          }
          else
          {
            comment.setNote(nr);

            drawings.add(comment);

            addCellComment(comment.getColumn(),
                           comment.getRow(),
                           comment.getText(),
                           comment.getWidth(),
                           comment.getHeight());
          }
        }
      }
      else if (type == Type.ARRAY)
      {
        ;
      }
      else if (type == Type.PROTECT)
      {
        ProtectRecord pr = new ProtectRecord(r);
        settings.setProtected(pr.isProtected());
      }
      else if (type == Type.SHAREDFORMULA)
      {
        if (sharedFormula == null)
        {
          logger.warn("Shared template formula is null - " +
                      "trying most recent formula template");
          SharedFormulaRecord lastSharedFormula =
            (SharedFormulaRecord) sharedFormulas.get(sharedFormulas.size() - 1);

          if (lastSharedFormula != null)
          {
            sharedFormula = lastSharedFormula.getTemplateFormula();
          }
        }

        SharedFormulaRecord sfr = new SharedFormulaRecord
          (r, sharedFormula, workbook, workbook, sheet);
        sharedFormulas.add(sfr);
        sharedFormula = null;
      }
      else if (type == Type.FORMULA || type == Type.FORMULA2)
      {
        FormulaRecord fr = new FormulaRecord(r,
                                             excelFile,
                                             formattingRecords,
                                             workbook,
                                             workbook,
                                             sheet,
                                             workbookSettings);

        if (fr.isShared())
        {
          BaseSharedFormulaRecord prevSharedFormula = sharedFormula;
          sharedFormula = (BaseSharedFormulaRecord) fr.getFormula();

          // See if it fits in any of the shared formulas
          sharedFormulaAdded = addToSharedFormulas(sharedFormula);

          if (sharedFormulaAdded)
          {
            sharedFormula = prevSharedFormula;
          }

          // If we still haven't added the previous base shared formula,
          // revert it to an ordinary formula and add it to the cell
          if (!sharedFormulaAdded && prevSharedFormula != null)
          {
            // Do nothing.  It's possible for the biff file to contain the
            // record sequence
            // FORMULA-SHRFMLA-FORMULA-SHRFMLA-FORMULA-FORMULA-FORMULA
            // ie. it first lists all the formula templates, then it
            // lists all the individual formulas
            addCell(revertSharedFormula(prevSharedFormula));
          }
        }
        else
        {
          Cell cell = fr.getFormula();
          try
          {
            // See if the formula evaluates to date
            if (fr.getFormula().getType() == CellType.NUMBER_FORMULA)
            {
              NumberFormulaRecord nfr = (NumberFormulaRecord) fr.getFormula();
              if (formattingRecords.isDate(nfr.getXFIndex()))
              {
                cell = new DateFormulaRecord(nfr,
                                             formattingRecords,
                                             workbook,
                                             workbook,
                                             nineteenFour,
                                             sheet);
              }
            }
            
            addCell(cell);
          }
          catch (FormulaException e)
          {
            // Something has gone wrong trying to read the formula data eg. it
            // might be unsupported biff7 data
            logger.warn
              (CellReferenceHelper.getCellReference
               (cell.getColumn(), cell.getRow()) + " " + e.getMessage());
          }
        }
      }
      else if (type == Type.LABEL)
      {
        LabelRecord lr = null;

        if (workbookBof.isBiff8())
        {
          lr = new LabelRecord(r, formattingRecords, sheet, workbookSettings);
        }
        else
        {
          lr = new LabelRecord(r, formattingRecords, sheet, workbookSettings,
                               LabelRecord.biff7);
        }
        addCell(lr);
      }
      else if (type == Type.RSTRING)
      {
        RStringRecord lr = null;

        // RString records are obsolete in biff 8
        Assert.verify(!workbookBof.isBiff8());
        lr = new RStringRecord(r, formattingRecords,
                               sheet, workbookSettings,
                               RStringRecord.biff7);
        addCell(lr);
      }
      else if (type == Type.NAME)
      {
        ;
      }
      else if (type == Type.PASSWORD)
      {
        PasswordRecord pr = new PasswordRecord(r);
        settings.setPasswordHash(pr.getPasswordHash());
      }
      else if (type == Type.ROW)
      {
        RowRecord rr = new RowRecord(r);

        // See if the row has anything funny about it
        if (!rr.isDefaultHeight() ||
            !rr.matchesDefaultFontHeight() ||
            rr.isCollapsed() ||
            rr.hasDefaultFormat() || 
            rr.getOutlineLevel() != 0)
        {
          rowProperties.add(rr);
        }
      }
      else if (type == Type.BLANK)
      {
        if (!workbookSettings.getIgnoreBlanks())
        {
          BlankCell bc = new BlankCell(r, formattingRecords, sheet);
          addCell(bc);
        }
      }
      else if (type == Type.MULBLANK)
      {
        if (!workbookSettings.getIgnoreBlanks())
        {
          MulBlankRecord mulblank = new MulBlankRecord(r);

          // Get the individual cell records from the multiple record
          int num = mulblank.getNumberOfColumns();

          for (int i = 0; i < num; i++)
          {
            int ixf = mulblank.getXFIndex(i);

            MulBlankCell mbc = new MulBlankCell
              (mulblank.getRow(),
               mulblank.getFirstColumn() + i,
               ixf,
               formattingRecords,
               sheet);
            
            addCell(mbc);
          }
        }
      }
      else if (type == Type.SCL)
      {
        SCLRecord scl = new SCLRecord(r);
        settings.setZoomFactor(scl.getZoomFactor());
      }
      else if (type == Type.COLINFO)
      {
        ColumnInfoRecord cir = new ColumnInfoRecord(r);
        columnInfosArray.add(cir);
      }
      else if (type == Type.HEADER)
      {
        HeaderRecord hr = null;
        if (workbookBof.isBiff8())
        {
          hr = new HeaderRecord(r, workbookSettings);
        }
        else
        {
          hr = new HeaderRecord(r, workbookSettings, HeaderRecord.biff7);
        }

        HeaderFooter header = new HeaderFooter(hr.getHeader());
        settings.setHeader(header);
      }
      else if (type == Type.FOOTER)
      {
        FooterRecord fr = null;
        if (workbookBof.isBiff8())
        {
          fr = new FooterRecord(r, workbookSettings);
        }
        else
        {
          fr = new FooterRecord(r, workbookSettings, FooterRecord.biff7);
        }

        HeaderFooter footer = new HeaderFooter(fr.getFooter());
        settings.setFooter(footer);
      }
      else if (type == Type.SETUP)
      {
        SetupRecord sr = new SetupRecord(r);
        
        // If the setup record has its not initialized bit set, then
        // use the sheet settings default values
        if (sr.getInitialized())
        {
          if (sr.isPortrait())
          {
            settings.setOrientation(PageOrientation.PORTRAIT);
          }
          else
          {
            settings.setOrientation(PageOrientation.LANDSCAPE);
          }
          if (sr.isRightDown())
          {
              settings.setPageOrder(PageOrder.RIGHT_THEN_DOWN);
          }
          else
          {
              settings.setPageOrder(PageOrder.DOWN_THEN_RIGHT);
          }
          settings.setPaperSize(PaperSize.getPaperSize(sr.getPaperSize()));
          settings.setHeaderMargin(sr.getHeaderMargin());
          settings.setFooterMargin(sr.getFooterMargin());
          settings.setScaleFactor(sr.getScaleFactor());
          settings.setPageStart(sr.getPageStart());
          settings.setFitWidth(sr.getFitWidth());
          settings.setFitHeight(sr.getFitHeight());
          settings.setHorizontalPrintResolution
            (sr.getHorizontalPrintResolution());
          settings.setVerticalPrintResolution(sr.getVerticalPrintResolution());
          settings.setCopies(sr.getCopies());

          if (workspaceOptions != null)
          {
            settings.setFitToPages(workspaceOptions.getFitToPages());
          }
        }
      }
      else if (type == Type.WSBOOL)
      {
        workspaceOptions = new WorkspaceInformationRecord(r);
      }
      else if (type == Type.DEFCOLWIDTH)
      {
        DefaultColumnWidthRecord dcwr = new DefaultColumnWidthRecord(r);
        settings.setDefaultColumnWidth(dcwr.getWidth());
      }
      else if (type == Type.DEFAULTROWHEIGHT)
      {
        DefaultRowHeightRecord drhr = new DefaultRowHeightRecord(r);
        if (drhr.getHeight() != 0)
        {
          settings.setDefaultRowHeight(drhr.getHeight());
        }
      }
      else if (type == Type.CONDFMT)
      {
        ConditionalFormatRangeRecord cfrr = 
          new ConditionalFormatRangeRecord(r);
        condFormat = new ConditionalFormat(cfrr);
        conditionalFormats.add(condFormat);
      }
      else if (type == Type.CF)
      {
        ConditionalFormatRecord cfr = new ConditionalFormatRecord(r);
        condFormat.addCondition(cfr);
      }
      else if (type == Type.FILTERMODE)
      {
        filterMode = new FilterModeRecord(r);
      }
      else if (type == Type.AUTOFILTERINFO)
      {
        autoFilterInfo = new AutoFilterInfoRecord(r);
      } 
      else if (type == Type.AUTOFILTER)
      {
        if (!workbookSettings.getAutoFilterDisabled())
        {
          AutoFilterRecord af = new AutoFilterRecord(r);

          if (autoFilter == null)
          {
            autoFilter = new AutoFilter(filterMode, autoFilterInfo);
            filterMode = null;
            autoFilterInfo = null;
          }

          autoFilter.add(af);
        }
      }
      else if (type == Type.LEFTMARGIN)
      {
        MarginRecord m = new LeftMarginRecord(r);
        settings.setLeftMargin(m.getMargin());
      }
      else if (type == Type.RIGHTMARGIN)
      {
        MarginRecord m = new RightMarginRecord(r);
        settings.setRightMargin(m.getMargin());
      }
      else if (type == Type.TOPMARGIN)
      {
        MarginRecord m = new TopMarginRecord(r);
        settings.setTopMargin(m.getMargin());
      }
      else if (type == Type.BOTTOMMARGIN)
      {
        MarginRecord m = new BottomMarginRecord(r);
        settings.setBottomMargin(m.getMargin());
      }
      else if (type == Type.HORIZONTALPAGEBREAKS)
      {
        HorizontalPageBreaksRecord dr = null;

        if (workbookBof.isBiff8())
        {
          dr = new HorizontalPageBreaksRecord(r);
        }
        else
        {
          dr = new HorizontalPageBreaksRecord
            (r, HorizontalPageBreaksRecord.biff7);
        }
        rowBreaks = dr.getRowBreaks();
      }
      else if (type == Type.VERTICALPAGEBREAKS)
      {
        VerticalPageBreaksRecord dr = null;

        if (workbookBof.isBiff8())
        {
          dr = new VerticalPageBreaksRecord(r);
        }
        else
        {
          dr = new VerticalPageBreaksRecord
            (r, VerticalPageBreaksRecord.biff7);
        }
        columnBreaks = dr.getColumnBreaks();
      }
      else if (type == Type.PLS)
      {
        plsRecord = new PLSRecord(r);
      }
      else if (type == Type.DVAL)
      {
        if (!workbookSettings.getCellValidationDisabled())
        {
          DataValidityListRecord dvlr = new DataValidityListRecord(r);
          if (dvlr.getObjectId() == -1)
          {
            if (msoRecord != null && objRecord == null)
            {
              // there is a drop down associated with this data validation
              if (drawingData == null)
              {
                drawingData = new DrawingData();
              }

              Drawing2 d2 = new Drawing2(msoRecord, drawingData, 
                                         workbook.getDrawingGroup());
              drawings.add(d2);
              msoRecord = null;

              dataValidation = new DataValidation(dvlr);
            }
            else
            {
              // no drop down
              dataValidation = new DataValidation(dvlr);
            }
          }
          else if (objectIds.contains(new Integer(dvlr.getObjectId())))
          {
            dataValidation = new DataValidation(dvlr);
          }
          else
          {
            logger.warn("object id " + dvlr.getObjectId() + " referenced " +
                        " by data validity list record not found - ignoring");
          }
        }
      }
      else if (type == Type.HCENTER)
      {
            CentreRecord hr = new CentreRecord(r);
            settings.setHorizontalCentre(hr.isCentre());
      } 
      else if (type == Type.VCENTER)
      {
            CentreRecord vc = new CentreRecord(r);
            settings.setVerticalCentre(vc.isCentre());
      }
      else if (type == Type.DV)
      {
        if (!workbookSettings.getCellValidationDisabled())
        {
          DataValiditySettingsRecord dvsr = 
            new DataValiditySettingsRecord(r, 
                                           workbook, 
                                           workbook,
                                           workbook.getSettings());
          if (dataValidation != null)
          {
            dataValidation.add(dvsr);
            addCellValidation(dvsr.getFirstColumn(),
                              dvsr.getFirstRow(),
                              dvsr.getLastColumn(),
                              dvsr.getLastRow(), 
                              dvsr);
          }
          else
          {
            logger.warn("cannot add data validity settings");
          }
        }
      }
      else if (type == Type.OBJ)
      {
        objRecord = new ObjRecord(r);

        if (!workbookSettings.getDrawingsDisabled())
        {
          // sometimes excel writes out continue records instead of drawing
          // records, so forcibly hack the stashed continue record into
          // a drawing record
          if (msoRecord == null && continueRecord != null)
          {
            logger.warn("Cannot find drawing record - using continue record");
            msoRecord = new MsoDrawingRecord(continueRecord.getRecord());
            continueRecord = null;
          }
          handleObjectRecord(objRecord, msoRecord, comments);
          objectIds.add(new Integer(objRecord.getObjectId()));
        }

        // Save chart handling until the chart BOF record appears
        if (objRecord.getType() != ObjRecord.CHART)
        {
          objRecord = null;
          msoRecord = null;
        }
      }
      else if (type == Type.MSODRAWING)
      {
        if (!workbookSettings.getDrawingsDisabled())
        {
          if (msoRecord != null)
          {
            // For form controls, a rogue MSODRAWING record can crop up
            // after the main one.  Add these into the drawing data
            drawingData.addRawData(msoRecord.getData());
          }
          msoRecord = new MsoDrawingRecord(r);

          if (firstMsoRecord)
          {
            msoRecord.setFirst();
            firstMsoRecord = false;
          }
        }
      }
      else if (type == Type.BUTTONPROPERTYSET)
      {
        buttonPropertySet = new ButtonPropertySetRecord(r);
      }
      else if (type == Type.CALCMODE)
      {
        CalcModeRecord cmr = new CalcModeRecord(r);
        settings.setAutomaticFormulaCalculation(cmr.isAutomatic());
      }
      else if (type == Type.SAVERECALC)
      {
        SaveRecalcRecord cmr = new SaveRecalcRecord(r);
        settings.setRecalculateFormulasBeforeSave(cmr.getRecalculateOnSave());
      }
      else if (type == Type.GUTS)
      {
        GuttersRecord gr = new GuttersRecord(r);
        maxRowOutlineLevel = 
          gr.getRowOutlineLevel() > 0 ? gr.getRowOutlineLevel() - 1 : 0;
        maxColumnOutlineLevel = 
          gr.getColumnOutlineLevel() > 0 ? gr.getRowOutlineLevel() - 1 : 0;
      }
      else if (type == Type.BOF)
      {
        BOFRecord br = new BOFRecord(r);
        Assert.verify(!br.isWorksheet());

        int startpos = excelFile.getPos() - r.getLength() - 4;

        // Skip to the end of the nested bof
        // Thanks to Rohit for spotting this
        Record r2 = excelFile.next();
        while (r2.getCode() != Type.EOF.value)
        {
          r2 = excelFile.next();
        }

        if (br.isChart())
        {
          if (!workbook.getWorkbookBof().isBiff8())
          {
            logger.warn("only biff8 charts are supported");
          }
          else
          {
            if (drawingData == null)
            {
              drawingData = new DrawingData();
            }
          
            if (!workbookSettings.getDrawingsDisabled())
            {
              Chart chart = new Chart(msoRecord, objRecord, drawingData,
                                      startpos, excelFile.getPos(),
                                      excelFile, workbookSettings);
              charts.add(chart);

              if (workbook.getDrawingGroup() != null)
              {
                workbook.getDrawingGroup().add(chart);
              }
            }
          }

          // Reset the drawing records
          msoRecord = null;
          objRecord = null;
        }

        // If this worksheet is just a chart, then the EOF reached
        // represents the end of the sheet as well as the end of the chart
        if (sheetBof.isChart())
        {
          cont = false;
        }
      }
      else if (type == Type.EOF)
      {
        cont = false;
      }
    }

    // Restore the file to its accurate position
    excelFile.restorePos();

    // Add any out of bounds cells
    if (outOfBoundsCells.size() > 0)
    {
      handleOutOfBoundsCells();
    }

    // Add all the shared formulas to the sheet as individual formulas
    Iterator i = sharedFormulas.iterator();

    while (i.hasNext())
    {
      SharedFormulaRecord sfr = (SharedFormulaRecord) i.next();

      Cell[] sfnr = sfr.getFormulas(formattingRecords, nineteenFour);

      for (int sf = 0; sf < sfnr.length; sf++)
      {
        addCell(sfnr[sf]);
      }
    }

    // If the last base shared formula wasn't added to the sheet, then
    // revert it to an ordinary formula and add it
    if (!sharedFormulaAdded && sharedFormula != null)
    {
      addCell(revertSharedFormula(sharedFormula));
    }

    // If there is a stray msoDrawing record, then flag to the drawing group
    // that one has been omitted
    if (msoRecord != null && workbook.getDrawingGroup() != null)
    {
      workbook.getDrawingGroup().setDrawingsOmitted(msoRecord, objRecord);
    }
      
    // Check that the comments hash is empty
    if (!comments.isEmpty())
    {
      logger.warn("Not all comments have a corresponding Note record");
    }
  }


Generated by  Doxygen 1.6.0   Back to index