/** * Gets the named range from this workbook. The Range object returns contains all the cells from * the top left to the bottom right of the range. If the named range comprises an adjacent range, * the Range[] will contain one object; for non-adjacent ranges, it is necessary to return an * array of length greater than one. If the named range contains a single cell, the top left and * bottom right cell will be the same cell * * @param name the name to find * @return the range of cells */ public Range[] findByName(String name) { NameRecord nr = (NameRecord) namedRecords.get(name); if (nr == null) { return null; } NameRecord.NameRange[] ranges = nr.getRanges(); Range[] cellRanges = new Range[ranges.length]; for (int i = 0; i < ranges.length; i++) { cellRanges[i] = new RangeImpl( this, getExternalSheetIndex(ranges[i].getExternalSheet()), ranges[i].getFirstColumn(), ranges[i].getFirstRow(), getLastExternalSheetIndex(ranges[i].getExternalSheet()), ranges[i].getLastColumn(), ranges[i].getLastRow()); } return cellRanges; }
public void testReserialize() { byte[] data = HexRead.readFromString( "" + "20 00 00 01 0B 00 00 00 01 00 00 00 00 00 00 06 3B 00 00 00 00 02 00 00 00 09 00]"); RecordInputStream in = TestcaseRecordInputStream.create(NameRecord.sid, data); NameRecord nr = new NameRecord(in); assertEquals(0x0020, nr.getOptionFlag()); byte[] data2 = nr.serialize(); TestcaseRecordInputStream.confirmRecordEncoding(NameRecord.sid, data, data2); }
private void assert_bug50244(NameRecord nr) { assertEquals("wDataGruppeSerie.", nr.getNameText()); Ptg[] ptg = nr.getNameDefinition(); assertEquals(1, ptg.length); ArrayPtg arr = (ArrayPtg) ptg[0]; assertEquals(696, arr.getRowCount()); assertEquals(1, arr.getColumnCount()); Object[][] vals = arr.getTokenArrayValues(); assertEquals("1.T20.001", vals[0][0]); assertEquals("1.T20.010", vals[vals.length - 1][0]); }
/** * Gets the named cell from this workbook. If the name refers to a range of cells, then the cell * on the top left is returned. If the name cannot be found, null is returned * * @param name the name of the cell/range to search for * @return the cell in the top left of the range if found, NULL otherwise */ public Cell findCellByName(String name) { NameRecord nr = (NameRecord) namedRecords.get(name); if (nr == null) { return null; } NameRecord.NameRange[] ranges = nr.getRanges(); // Go and retrieve the first cell in the first range Sheet s = getSheet(ranges[0].getExternalSheet()); Cell cell = s.getCell(ranges[0].getFirstColumn(), ranges[0].getFirstRow()); return cell; }
/** Makes sure that additional name information is parsed properly such as menu/description */ public void testFillExtras() { byte[] examples = HexRead.readFromString( "" + "88 03 67 06 07 00 00 00 00 00 00 23 00 00 00 4D " + "61 63 72 6F 31 3A 01 00 00 00 11 00 00 4D 61 63 " + "72 6F 20 72 65 63 6F 72 64 65 64 20 32 37 2D 53 " + "65 70 2D 39 33 20 62 79 20 41 4C 4C 57 4F 52"); NameRecord name = new NameRecord(TestcaseRecordInputStream.create(NameRecord.sid, examples)); String description = name.getDescriptionText(); assertNotNull(description); assertTrue(description.endsWith("Macro recorded 27-Sep-93 by ALLWOR")); }
public void testBug57923() { NameRecord record = new NameRecord(); assertEquals(0, record.getExternSheetNumber()); record.setNameDefinition(new Ptg[] {}); assertEquals(0, record.getExternSheetNumber()); record.setNameDefinition(new Ptg[] {new NamePtg(1)}); assertEquals(0, record.getExternSheetNumber()); record.setNameDefinition(new Ptg[] {new Area3DPtg("area", 1)}); assertEquals(1, record.getExternSheetNumber()); record.setNameDefinition(new Ptg[] {new Ref3DPtg("A1", 1)}); assertEquals(1, record.getExternSheetNumber()); }
/** * Sets the element name. * * @param name the new name. * @throws NameException if the element name is not allowed to change. */ public void setName(String name) throws NameException { name = StringUtil.trimString(name); // Ignore change to the current name. String oldName = element.getName(); if ((name == null && oldName == null) || (name != null && oldName != null && name.equals(oldName))) return; // ignore change to the dimension that refers a shared dimension Dimension sharedDimension = TabularDimensionPropSearchStrategy.getSharedDimension(module, element); if (sharedDimension != null && !sharedDimension.getName().equals(name)) return; checkName(name); DesignElement tmpElement = element; // if a contentElement is not local, need to make a local copy before changing the name if (tmpElement instanceof ContentElement && !((ContentElement) tmpElement).isLocal()) { eventTarget = ((ContentElement) tmpElement).getValueContainer(); tmpElement = copyTopCompositeValue(); } // Record the change. ActivityStack stack = getActivityStack(); NameRecord rename = new NameRecord(tmpElement, name); stack.startTrans(rename.getLabel()); // Drop the old name from the name space. // Change the name. stack.execute(rename); // Add the new name to the name space. renameSymbolFrom(oldName); // change the name of the dimension that shares this element if (element instanceof Dimension) { updateDimensions(stack); } stack.commit(); }
/** * Gets the named cell from this workbook. If the name refers to a range of cells, then the cell * on the top left is returned. If the name cannot be found, null is returned * * @param name the name of the cell/range to search for * @return the cell in the top left of the range if found, NULL otherwise */ public Cell findCellByName(String name) { NameRecord nr = (NameRecord) namedRecords.get(name); if (nr == null) { return null; } NameRecord.NameRange[] ranges = nr.getRanges(); // Go and retrieve the first cell in the first range Sheet s = getSheet(getExternalSheetIndex(ranges[0].getExternalSheet())); int col = ranges[0].getFirstColumn(); int row = ranges[0].getFirstRow(); // If the sheet boundaries fall short of the named cell, then return // an empty cell to stop an exception being thrown if (col > s.getColumns() || row > s.getRows()) { return new EmptyCell(col, row); } Cell cell = s.getCell(col, row); return cell; }
/** * Gets the index of the name record for the name * * @param name the name to search for * @return the index in the name table */ public int getNameIndex(String name) { NameRecord nr = (NameRecord) namedRecords.get(name); return nr != null ? nr.getIndex() : 0; }
/** * Does the hard work of building up the object graph from the excel bytes * * @exception BiffException * @exception PasswordException if the workbook is password protected */ protected void parse() throws BiffException, PasswordException { Record r = null; BOFRecord bof = new BOFRecord(excelFile.next()); workbookBof = bof; bofs++; if (!bof.isBiff8() && !bof.isBiff7()) { throw new BiffException(BiffException.unrecognizedBiffVersion); } if (!bof.isWorkbookGlobals()) { throw new BiffException(BiffException.expectedGlobals); } ArrayList continueRecords = new ArrayList(); nameTable = new ArrayList(); // Skip to the first worksheet while (bofs == 1) { r = excelFile.next(); if (r.getType() == Type.SST) { continueRecords.clear(); Record nextrec = excelFile.peek(); while (nextrec.getType() == Type.CONTINUE) { continueRecords.add(excelFile.next()); nextrec = excelFile.peek(); } // cast the array Object[] rec = continueRecords.toArray(); Record[] records = new Record[rec.length]; System.arraycopy(rec, 0, records, 0, rec.length); sharedStrings = new SSTRecord(r, records, settings); } else if (r.getType() == Type.FILEPASS) { throw new PasswordException(); } else if (r.getType() == Type.NAME) { NameRecord nr = null; if (bof.isBiff8()) { nr = new NameRecord(r, settings, namedRecords.size()); } else { nr = new NameRecord(r, settings, namedRecords.size(), NameRecord.biff7); } namedRecords.put(nr.getName(), nr); nameTable.add(nr); } else if (r.getType() == Type.FONT) { FontRecord fr = null; if (bof.isBiff8()) { fr = new FontRecord(r, settings); } else { fr = new FontRecord(r, settings, FontRecord.biff7); } fonts.addFont(fr); } else if (r.getType() == Type.PALETTE) { PaletteRecord palette = new PaletteRecord(r); formattingRecords.setPalette(palette); } else if (r.getType() == Type.NINETEENFOUR) { NineteenFourRecord nr = new NineteenFourRecord(r); nineteenFour = nr.is1904(); } else if (r.getType() == Type.FORMAT) { FormatRecord fr = null; if (bof.isBiff8()) { fr = new FormatRecord(r, settings, FormatRecord.biff8); } else { fr = new FormatRecord(r, settings, FormatRecord.biff7); } try { formattingRecords.addFormat(fr); } catch (NumFormatRecordsException e) { // This should not happen. Bomb out Assert.verify(false, e.getMessage()); } } else if (r.getType() == Type.XF) { XFRecord xfr = null; if (bof.isBiff8()) { xfr = new XFRecord(r, XFRecord.biff8); } else { xfr = new XFRecord(r, XFRecord.biff7); } try { formattingRecords.addStyle(xfr); } catch (NumFormatRecordsException e) { // This should not happen. Bomb out Assert.verify(false, e.getMessage()); } } else if (r.getType() == Type.BOUNDSHEET) { BoundsheetRecord br = null; if (bof.isBiff8()) { br = new BoundsheetRecord(r); } else { br = new BoundsheetRecord(r, BoundsheetRecord.biff7); } if (br.isSheet() || br.isChart()) { boundsheets.add(br); } } else if (r.getType() == Type.EXTERNSHEET) { if (bof.isBiff8()) { externSheet = new ExternalSheetRecord(r, settings); } else { externSheet = new ExternalSheetRecord(r, settings, ExternalSheetRecord.biff7); } } else if (r.getType() == Type.CODEPAGE) { CodepageRecord cr = new CodepageRecord(r); settings.setCharacterSet(cr.getCharacterSet()); } else if (r.getType() == Type.SUPBOOK) { SupbookRecord sr = new SupbookRecord(r, settings); supbooks.add(sr); } else if (r.getType() == Type.PROTECT) { ProtectRecord pr = new ProtectRecord(r); wbProtected = pr.isProtected(); } else if (r.getType() == Type.OBJPROJ) { containsMacros = true; } else if (r.getType() == Type.MSODRAWINGGROUP) { msoDrawingGroup = new MsoDrawingGroupRecord(r); if (drawingGroup == null) { drawingGroup = new DrawingGroup(DrawingGroup.READ); } drawingGroup.add(msoDrawingGroup); Record nextrec = excelFile.peek(); while (nextrec.getType() == Type.CONTINUE) { drawingGroup.add(excelFile.next()); nextrec = excelFile.peek(); } } else if (r.getType() == Type.BUTTONPROPERTYSET) { buttonPropertySet = new ButtonPropertySetRecord(r); } else if (r.getType() == Type.EOF) { bofs--; } } bof = null; if (excelFile.hasNext()) { r = excelFile.next(); if (r.getType() == Type.BOF) { bof = new BOFRecord(r); } } // Only get sheets for which there is a corresponding Boundsheet record while (bof != null && getNumberOfSheets() < boundsheets.size()) { if (!bof.isBiff8() && !bof.isBiff7()) { throw new BiffException(BiffException.unrecognizedBiffVersion); } if (bof.isWorksheet()) { // Read the sheet in SheetImpl s = new SheetImpl( excelFile, sharedStrings, formattingRecords, bof, workbookBof, nineteenFour, this); BoundsheetRecord br = (BoundsheetRecord) boundsheets.get(getNumberOfSheets()); s.setName(br.getName()); s.setHidden(br.isHidden()); addSheet(s); } else if (bof.isChart()) { // Read the sheet in SheetImpl s = new SheetImpl( excelFile, sharedStrings, formattingRecords, bof, workbookBof, nineteenFour, this); BoundsheetRecord br = (BoundsheetRecord) boundsheets.get(getNumberOfSheets()); s.setName(br.getName()); s.setHidden(br.isHidden()); addSheet(s); } else { logger.warn("BOF is unrecognized"); while (excelFile.hasNext() && r.getType() != Type.EOF) { r = excelFile.next(); } } // The next record will normally be a BOF or empty padding until // the end of the block is reached. In exceptionally unlucky cases, // the last EOF will coincide with a block division, so we have to // check there is more data to retrieve. // Thanks to liamg for spotting this bof = null; if (excelFile.hasNext()) { r = excelFile.next(); if (r.getType() == Type.BOF) { bof = new BOFRecord(r); } } } }
/** A NameRecord followed by a ContinueRecord. See Bugzilla 50244 */ public void test50244() { String record_0x0018 = " 18 00 " + "21 1E 00 00 00 11 08 00 00 00 03 00 00 00 00 00 " + "00 77 44 61 74 61 47 72 75 70 70 65 53 65 72 69 " + "65 2E 60 00 B7 02 0C 00 57 03 00 B7 02 02 09 00 " + "00 31 2E 54 32 30 2E 30 30 31 02 09 00 00 31 2E " + "54 32 30 2E 30 30 31 02 09 00 00 31 2E 54 32 30 " + "2E 30 30 31 02 09 00 00 31 2E 54 32 30 2E 30 30 " + "32 02 09 00 00 31 2E 54 32 30 2E 30 30 32 02 09 " + "00 00 31 2E 54 32 30 2E 30 30 32 02 09 00 00 31 " + "2E 54 32 30 2E 30 30 33 02 09 00 00 31 2E 54 32 " + "30 2E 30 30 33 02 09 00 00 31 2E 54 32 30 2E 30 " + "30 33 02 09 00 00 31 2E 54 32 30 2E 30 31 33 02 " + "09 00 00 31 2E 54 32 30 2E 30 31 33 02 09 00 00 " + "31 2E 54 32 30 2E 30 31 33 02 09 00 00 31 2E 54 " + "32 30 2E 30 31 34 02 09 00 00 31 2E 54 32 30 2E " + "30 31 34 02 09 00 00 31 2E 54 32 30 2E 30 31 34 " + "02 09 00 00 31 2E 54 32 30 2E 30 31 35 02 09 00 " + "00 31 2E 54 32 30 2E 30 31 35 02 09 00 00 31 2E " + "54 32 30 2E 30 31 35 02 09 00 00 31 2E 54 32 30 " + "2E 30 32 35 02 09 00 00 31 2E 54 32 30 2E 30 32 " + "35 02 09 00 00 31 2E 54 32 30 2E 30 32 35 02 09 " + "00 00 31 2E 54 32 30 2E 30 32 36 02 09 00 00 31 " + "2E 54 32 30 2E 30 32 36 02 09 00 00 31 2E 54 32 " + "30 2E 30 32 36 02 09 00 00 31 2E 54 32 30 2E 30 " + "32 37 02 09 00 00 31 2E 54 32 30 2E 30 32 37 02 " + "09 00 00 31 2E 54 32 30 2E 30 32 37 02 09 00 00 " + "31 2E 54 32 30 2E 30 33 37 02 09 00 00 31 2E 54 " + "32 30 2E 30 33 37 02 09 00 00 31 2E 54 32 30 2E " + "30 33 37 02 09 00 00 31 2E 54 32 30 2E 30 33 38 " + "02 09 00 00 31 2E 54 32 30 2E 30 33 38 02 09 00 " + "00 31 2E 54 32 30 2E 30 33 38 02 09 00 00 31 2E " + "54 32 30 2E 30 33 39 02 09 00 00 31 2E 54 32 30 " + "2E 30 33 39 02 09 00 00 31 2E 54 32 30 2E 30 33 " + "39 02 09 00 00 31 2E 54 32 30 2E 30 34 39 02 09 " + "00 00 31 2E 54 32 30 2E 30 34 39 02 09 00 00 31 " + "2E 54 32 30 2E 30 34 39 02 09 00 00 31 2E 54 32 " + "30 2E 30 35 30 02 09 00 00 31 2E 54 32 30 2E 30 " + "35 30 02 09 00 00 31 2E 54 32 30 2E 30 35 30 02 " + "09 00 00 31 2E 54 32 30 2E 30 35 31 02 09 00 00 " + "31 2E 54 32 30 2E 30 35 31 02 09 00 00 31 2E 54 " + "32 30 2E 30 35 31 02 09 00 00 31 2E 54 32 30 2E " + "30 36 31 02 09 00 00 31 2E 54 32 30 2E 30 36 31 " + "02 09 00 00 31 2E 54 32 30 2E 30 36 31 02 09 00 " + "00 31 2E 54 32 30 2E 30 36 32 02 09 00 00 31 2E " + "54 32 30 2E 30 36 32 02 09 00 00 31 2E 54 32 30 " + "2E 30 36 32 02 09 00 00 31 2E 54 32 30 2E 30 36 " + "33 02 09 00 00 31 2E 54 32 30 2E 30 36 33 02 09 " + "00 00 31 2E 54 32 30 2E 30 36 33 02 09 00 00 31 " + "2E 54 32 30 2E 30 37 33 02 09 00 00 31 2E 54 32 " + "30 2E 30 37 33 02 09 00 00 31 2E 54 32 30 2E 30 " + "37 33 02 09 00 00 31 2E 54 32 30 2E 30 37 34 02 " + "09 00 00 31 2E 54 32 30 2E 30 37 34 02 09 00 00 " + "31 2E 54 32 30 2E 30 37 34 02 09 00 00 31 2E 54 " + "32 30 2E 30 37 35 02 09 00 00 31 2E 54 32 30 2E " + "30 37 35 02 09 00 00 31 2E 54 32 30 2E 30 37 35 " + "02 09 00 00 31 2E 54 32 30 2E 30 38 35 02 09 00 " + "00 31 2E 54 32 30 2E 30 38 35 02 09 00 00 31 2E " + "54 32 30 2E 30 38 35 02 09 00 00 31 2E 54 32 30 " + "2E 30 38 36 02 09 00 00 31 2E 54 32 30 2E 30 38 " + "36 02 09 00 00 31 2E 54 32 30 2E 30 38 36 02 09 " + "00 00 31 2E 54 32 30 2E 30 38 37 02 09 00 00 31 " + "2E 54 32 30 2E 30 38 37 02 09 00 00 31 2E 54 32 " + "30 2E 30 38 37 02 09 00 00 31 2E 54 32 30 2E 30 " + "39 37 02 09 00 00 31 2E 54 32 30 2E 30 39 37 02 " + "09 00 00 31 2E 54 32 30 2E 30 39 37 02 09 00 00 " + "31 2E 54 32 30 2E 30 39 38 02 09 00 00 31 2E 54 " + "32 30 2E 30 39 38 02 09 00 00 31 2E 54 32 30 2E " + "30 39 38 02 09 00 00 31 2E 54 32 30 2E 30 39 39 " + "02 09 00 00 31 2E 54 32 30 2E 30 39 39 02 09 00 " + "00 31 2E 54 32 30 2E 30 39 39 02 09 00 00 31 2E " + "54 32 30 2E 31 30 39 02 09 00 00 31 2E 54 32 30 " + "2E 31 30 39 02 09 00 00 31 2E 54 32 30 2E 31 30 " + "39 02 09 00 00 31 2E 54 32 30 2E 31 31 30 02 09 " + "00 00 31 2E 54 32 30 2E 31 31 30 02 09 00 00 31 " + "2E 54 32 30 2E 31 31 30 02 09 00 00 31 2E 54 32 " + "30 2E 31 31 31 02 09 00 00 31 2E 54 32 30 2E 31 " + "31 31 02 09 00 00 31 2E 54 32 30 2E 31 31 31 02 " + "09 00 00 31 2E 54 32 30 2E 31 32 31 02 09 00 00 " + "31 2E 54 32 30 2E 31 32 31 02 09 00 00 31 2E 54 " + "32 30 2E 31 32 31 02 09 00 00 31 2E 54 32 30 2E " + "31 32 32 02 09 00 00 31 2E 54 32 30 2E 31 32 32 " + "02 09 00 00 31 2E 54 32 30 2E 31 32 32 02 09 00 " + "00 31 2E 54 32 30 2E 31 32 33 02 09 00 00 31 2E " + "54 32 30 2E 31 32 33 02 09 00 00 31 2E 54 32 30 " + "2E 31 32 33 02 09 00 00 31 2E 54 32 30 2E 31 33 " + "33 02 09 00 00 31 2E 54 32 30 2E 31 33 33 02 09 " + "00 00 31 2E 54 32 30 2E 31 33 33 02 09 00 00 31 " + "2E 54 32 30 2E 31 33 34 02 09 00 00 31 2E 54 32 " + "30 2E 31 33 34 02 09 00 00 31 2E 54 32 30 2E 31 " + "33 34 02 09 00 00 31 2E 54 32 30 2E 31 33 35 02 " + "09 00 00 31 2E 54 32 30 2E 31 33 35 02 09 00 00 " + "31 2E 54 32 30 2E 31 33 35 02 09 00 00 31 2E 54 " + "32 30 2E 31 34 35 02 09 00 00 31 2E 54 32 30 2E " + "31 34 35 02 09 00 00 31 2E 54 32 30 2E 31 34 35 " + "02 09 00 00 31 2E 54 32 30 2E 31 34 36 02 09 00 " + "00 31 2E 54 32 30 2E 31 34 36 02 09 00 00 31 2E " + "54 32 30 2E 31 34 36 02 09 00 00 31 2E 54 32 30 " + "2E 31 34 37 02 09 00 00 31 2E 54 32 30 2E 31 34 " + "37 02 09 00 00 31 2E 54 32 30 2E 31 34 37 02 09 " + "00 00 31 2E 54 32 30 2E 31 35 37 02 09 00 00 31 " + "2E 54 32 30 2E 31 35 37 02 09 00 00 31 2E 54 32 " + "30 2E 31 35 37 02 09 00 00 31 2E 54 32 30 2E 31 " + "35 38 02 09 00 00 31 2E 54 32 30 2E 31 35 38 02 " + "09 00 00 31 2E 54 32 30 2E 31 35 38 02 09 00 00 " + "31 2E 54 32 30 2E 31 35 39 02 09 00 00 31 2E 54 " + "32 30 2E 31 35 39 02 09 00 00 31 2E 54 32 30 2E " + "31 35 39 02 09 00 00 31 2E 54 32 30 2E 31 36 39 " + "02 09 00 00 31 2E 54 32 30 2E 31 36 39 02 09 00 " + "00 31 2E 54 32 30 2E 31 36 39 02 09 00 00 31 2E " + "54 32 30 2E 31 37 30 02 09 00 00 31 2E 54 32 30 " + "2E 31 37 30 02 09 00 00 31 2E 54 32 30 2E 31 37 " + "30 02 09 00 00 31 2E 54 32 30 2E 31 37 31 02 09 " + "00 00 31 2E 54 32 30 2E 31 37 31 02 09 00 00 31 " + "2E 54 32 30 2E 31 37 31 02 09 00 00 31 2E 54 36 " + "30 2E 30 30 39 02 09 00 00 31 2E 54 36 30 2E 30 " + "30 39 02 09 00 00 31 2E 54 36 30 2E 30 30 39 02 " + "09 00 00 31 2E 54 36 30 2E 30 31 30 02 09 00 00 " + "31 2E 54 36 30 2E 30 31 30 02 09 00 00 31 2E 54 " + "36 30 2E 30 31 30 02 09 00 00 31 2E 54 36 30 2E " + "30 31 31 02 09 00 00 31 2E 54 36 30 2E 30 31 31 " + "02 09 00 00 31 2E 54 36 30 2E 30 31 31 02 09 00 " + "00 31 2E 54 36 30 2E 30 32 31 02 09 00 00 31 2E " + "54 36 30 2E 30 32 31 02 09 00 00 31 2E 54 36 30 " + "2E 30 32 31 02 09 00 00 31 2E 54 36 30 2E 30 32 " + "32 02 09 00 00 31 2E 54 36 30 2E 30 32 32 02 09 " + "00 00 31 2E 54 36 30 2E 30 32 32 02 09 00 00 31 " + "2E 54 36 30 2E 30 32 33 02 09 00 00 31 2E 54 36 " + "30 2E 30 32 33 02 09 00 00 31 2E 54 36 30 2E 30 " + "32 33 02 09 00 00 31 2E 54 36 30 2E 30 33 33 02 " + "09 00 00 31 2E 54 36 30 2E 30 33 33 02 09 00 00 " + "31 2E 54 36 30 2E 30 33 33 02 09 00 00 31 2E 54 " + "36 30 2E 30 33 34 02 09 00 00 31 2E 54 36 30 2E " + "30 33 34 02 09 00 00 31 2E 54 36 30 2E 30 33 34 " + "02 09 00 00 31 2E 54 36 30 2E 30 33 35 02 09 00 " + "00 31 2E 54 36 30 2E 30 33 35 02 09 00 00 31 2E " + "54 36 30 2E 30 33 35 02 09 00 00 31 2E 54 36 30 " + "2E 30 34 35 02 09 00 00 31 2E 54 36 30 2E 30 34 " + "35 02 09 00 00 31 2E 54 36 30 2E 30 34 35 02 09 " + "00 00 31 2E 54 36 30 2E 30 34 36 02 09 00 00 31 " + "2E 54 36 30 2E 30 34 36 02 09 00 00 31 2E 54 36 " + "30 2E 30 34 36 02 09 00 00 31 2E 54 36 30 2E 30 " + "34 37 02 09 00 00 31 2E 54 36 30 2E 30 34 37 02 " + "09 00 00 31 2E 54 36 30 2E 30 34 37 02 09 00 00 " + "31 2E 54 36 30 2E 30 35 37 02 09 00 00 31 2E 54 " + "36 30 2E 30 35 37 02 09 00 00 31 2E 54 36 30 2E " + "30 35 37 02 09 00 00 31 2E 54 36 30 2E 30 35 38 " + "02 09 00 00 31 2E 54 36 30 2E 30 35 38 02 09 00 " + "00 31 2E 54 36 30 2E 30 35 38 02 09 00 00 31 2E " + "54 36 30 2E 30 35 39 02 09 00 00 31 2E 54 36 30 " + "2E 30 35 39 02 09 00 00 31 2E 54 36 30 2E 30 35 " + "39 02 09 00 00 31 2E 54 36 30 2E 30 36 30 02 09 " + "00 00 31 2E 54 36 30 2E 30 36 30 02 09 00 00 31 " + "2E 54 36 30 2E 30 36 30 02 09 00 00 31 2E 54 36 " + "30 2E 30 35 30 02 09 00 00 31 2E 54 36 30 2E 30 " + "35 30 02 09 00 00 31 2E 54 36 30 2E 30 35 30 02 " + "09 00 00 31 2E 54 36 30 2E 30 34 39 02 09 00 00 " + "31 2E 54 36 30 2E 30 34 39 02 09 00 00 31 2E 54 " + "36 30 2E 30 34 39 02 09 00 00 31 2E 54 36 30 2E " + "30 34 38 02 09 00 00 31 2E 54 36 30 2E 30 34 38 " + "02 09 00 00 31 2E 54 36 30 2E 30 34 38 02 09 00 " + "00 31 2E 54 36 30 2E 30 33 38 02 09 00 00 31 2E " + "54 36 30 2E 30 33 38 02 09 00 00 31 2E 54 36 30 " + "2E 30 33 38 02 09 00 00 31 2E 54 36 30 2E 30 33 " + "37 02 09 00 00 31 2E 54 36 30 2E 30 33 37 02 09 " + "00 00 31 2E 54 36 30 2E 30 33 37 02 09 00 00 31 " + "2E 54 36 30 2E 30 33 36 02 09 00 00 31 2E 54 36 " + "30 2E 30 33 36 02 09 00 00 31 2E 54 36 30 2E 30 " + "33 36 02 09 00 00 31 2E 54 36 30 2E 30 32 36 02 " + "09 00 00 31 2E 54 36 30 2E 30 32 36 02 09 00 00 " + "31 2E 54 36 30 2E 30 32 36 02 09 00 00 31 2E 54 " + "36 30 2E 30 32 35 02 09 00 00 31 2E 54 36 30 2E " + "30 32 35 02 09 00 00 31 2E 54 36 30 2E 30 32 35 " + "02 09 00 00 31 2E 54 36 30 2E 30 32 34 02 09 00 " + "00 31 2E 54 36 30 2E 30 32 34 02 09 00 00 31 2E " + "54 36 30 2E 30 32 34 02 09 00 00 31 2E 54 36 30 " + "2E 30 31 34 02 09 00 00 31 2E 54 36 30 2E 30 31 " + "34 02 09 00 00 31 2E 54 36 30 2E 30 31 34 02 09 " + "00 00 31 2E 54 36 30 2E 30 31 33 02 09 00 00 31 " + "2E 54 36 30 2E 30 31 33 02 09 00 00 31 2E 54 36 " + "30 2E 30 31 33 02 09 00 00 31 2E 54 36 30 2E 30 " + "31 32 02 09 00 00 31 2E 54 36 30 2E 30 31 32 02 " + "09 00 00 31 2E 54 36 30 2E 30 31 32 02 09 00 00 " + "31 2E 54 36 30 2E 30 30 32 02 09 00 00 31 2E 54 " + "36 30 2E 30 30 32 02 09 00 00 31 2E 54 36 30 2E " + "30 30 32 02 09 00 00 31 2E 54 36 30 2E 30 30 31 " + "02 09 00 00 31 2E 54 36 30 2E 30 30 31 02 09 00 " + "00 31 2E 54 36 30 2E 30 30 31 02 09 00 00 31 2E " + "54 32 30 2E 31 37 32 02 09 00 00 31 2E 54 32 30 " + "2E 31 37 32 02 09 00 00 31 2E 54 32 30 2E 31 37 " + "32 02 09 00 00 31 2E 54 32 30 2E 31 36 32 02 09 " + "00 00 31 2E 54 32 30 2E 31 36 32 02 09 00 00 31 " + "2E 54 32 30 2E 31 36 32 02 09 00 00 31 2E 54 32 " + "30 2E 31 36 31 02 09 00 00 31 2E 54 32 30 2E 31 " + "36 31 02 09 00 00 31 2E 54 32 30 2E 31 36 31 02 " + "09 00 00 31 2E 54 32 30 2E 31 36 30 02 09 00 00 " + "31 2E 54 32 30 2E 31 36 30 02 09 00 00 31 2E 54 " + "32 30 2E 31 36 30 02 09 00 00 31 2E 54 32 30 2E " + "31 35 30 02 09 00 00 31 2E 54 32 30 2E 31 35 30 " + "02 09 00 00 31 2E 54 32 30 2E 31 35 30 02 09 00 " + "00 31 2E 54 32 30 2E 31 34 39 02 09 00 00 31 2E " + "54 32 30 2E 31 34 39 02 09 00 00 31 2E 54 32 30 " + "2E 31 34 39 02 09 00 00 31 2E 54 32 30 2E 31 34 " + "38 02 09 00 00 31 2E 54 32 30 2E 31 34 38 02 09 " + "00 00 31 2E 54 32 30 2E 31 34 38 02 09 00 00 31 " + "2E 54 32 30 2E 31 33 38 02 09 00 00 31 2E 54 32 " + "30 2E 31 33 38 02 09 00 00 31 2E 54 32 30 2E 31 " + "33 38 02 09 00 00 31 2E 54 32 30 2E 31 33 37 02 " + "09 00 00 31 2E 54 32 30 2E 31 33 37 02 09 00 00 " + "31 2E 54 32 30 2E 31 33 37 02 09 00 00 31 2E 54 " + "32 30 2E 31 33 36 02 09 00 00 31 2E 54 32 30 2E " + "31 33 36 02 09 00 00 31 2E 54 32 30 2E 31 33 36 " + "02 09 00 00 31 2E 54 32 30 2E 31 32 36 02 09 00 " + "00 31 2E 54 32 30 2E 31 32 36 02 09 00 00 31 2E " + "54 32 30 2E 31 32 36 02 09 00 00 31 2E 54 32 30 " + "2E 31 32 35 02 09 00 00 31 2E 54 32 30 2E 31 32 " + "35 02 09 00 00 31 2E 54 32 30 2E 31 32 35 02 09 " + "00 00 31 2E 54 32 30 2E 31 32 34 02 09 00 00 31 " + "2E 54 32 30 2E 31 32 34 02 09 00 00 31 2E 54 32 " + "30 2E 31 32 34 02 09 00 00 31 2E 54 32 30 2E 31 " + "31 34 02 09 00 00 31 2E 54 32 30 2E 31 31 34 02 " + "09 00 00 31 2E 54 32 30 2E 31 31 34 02 09 00 00 " + "31 2E 54 32 30 2E 31 31 33 02 09 00 00 31 2E 54 " + "32 30 2E 31 31 33 02 09 00 00 31 2E 54 32 30 2E " + "31 31 33 02 09 00 00 31 2E 54 32 30 2E 31 31 32 " + "02 09 00 00 31 2E 54 32 30 2E 31 31 32 02 09 00 " + "00 31 2E 54 32 30 2E 31 31 32 02 09 00 00 31 2E " + "54 32 30 2E 31 30 32 02 09 00 00 31 2E 54 32 30 " + "2E 31 30 32 02 09 00 00 31 2E 54 32 30 2E 31 30 " + "32 02 09 00 00 31 2E 54 32 30 2E 31 30 31 02 09 " + "00 00 31 2E 54 32 30 2E 31 30 31 02 09 00 00 31 " + "2E 54 32 30 2E 31 30 31 02 09 00 00 31 2E 54 32 " + "30 2E 31 30 30 02 09 00 00 31 2E 54 32 30 2E 31 " + "30 30 02 09 00 00 31 2E 54 32 30 2E 31 30 30 02 " + "09 00 00 31 2E 54 32 30 2E 30 39 30 02 09 00 00 " + "31 2E 54 32 30 2E 30 39 30 02 09 00 00 31 2E 54 " + "32 30 2E 30 39 30 02 09 00 00 31 2E 54 32 30 2E " + "30 38 39 02 09 00 00 31 2E 54 32 30 2E 30 38 39 " + "02 09 00 00 31 2E 54 32 30 2E 30 38 39 02 09 00 " + "00 31 2E 54 32 30 2E 30 38 38 02 09 00 00 31 2E " + "54 32 30 2E 30 38 38 02 09 00 00 31 2E 54 32 30 " + "2E 30 38 38 02 09 00 00 31 2E 54 32 30 2E 30 37 " + "38 02 09 00 00 31 2E 54 32 30 2E 30 37 38 02 09 " + "00 00 31 2E 54 32 30 2E 30 37 38 02 09 00 00 31 " + "2E 54 32 30 2E 30 37 37 02 09 00 00 31 2E 54 32 " + "30 2E 30 37 37 02 09 00 00 31 2E 54 32 30 2E 30 " + "37 37 02 09 00 00 31 2E 54 32 30 2E 30 37 36 02 " + "09 00 00 31 2E 54 32 30 2E 30 37 36 02 09 00 00 " + "31 2E 54 32 30 2E 30 37 36 02 09 00 00 31 2E 54 " + "32 30 2E 30 36 36 02 09 00 00 31 2E 54 32 30 2E " + "30 36 36 02 09 00 00 31 2E 54 32 30 2E 30 36 36 " + "02 09 00 00 31 2E 54 32 30 2E 30 36 35 02 09 00 " + "00 31 2E 54 32 30 2E 30 36 35 02 09 00 00 31 2E " + "54 32 30 2E 30 36 35 02 09 00 00 31 2E 54 32 30 " + "2E 30 36 34 02 09 00 00 31 2E 54 32 30 2E 30 36 " + "34 02 09 00 00 31 2E 54 32 30 2E 30 36 34 02 09 " + "00 00 31 2E 54 32 30 2E 30 35 34 02 09 00 00 31 " + "2E 54 32 30 2E 30 35 34 02 09 00 00 31 2E 54 32 " + "30 2E 30 35 34 02 09 00 00 31 2E 54 32 30 2E 30 " + "35 33 02 09 00 00 31 2E 54 32 30 2E 30 35 33 02 " + "09 00 00 31 2E 54 32 30 2E 30 35 33 02 09 00 00 " + "31 2E 54 32 30 2E 30 35 32 02 09 00 00 31 2E 54 " + "32 30 2E 30 35 32 02 09 00 00 31 2E 54 32 30 2E " + "30 35 32 02 09 00 00 31 2E 54 32 30 2E 30 34 32 " + "02 09 00 00 31 2E 54 32 30 2E 30 34 32 02 09 00 " + "00 31 2E 54 32 30 2E 30 34 32 02 09 00 00 31 2E " + "54 32 30 2E 30 34 31 02 09 00 00 31 2E 54 32 30 " + "2E 30 34 31 02 09 00 00 31 2E 54 32 30 2E 30 34 " + "31 02 09 00 00 31 2E 54 32 30 2E 30 34 30 02 09 " + "00 00 31 2E 54 32 30 2E 30 34 30 02 09 00 00 31 " + "2E 54 32 30 2E 30 34 30 02 09 00 00 31 2E 54 32 " + "30 2E 30 33 30 02 09 00 00 31 2E 54 32 30 2E 30 " + "33 30 02 09 00 00 31 2E 54 32 30 2E 30 33 30 02 " + "09 00 00 31 2E 54 32 30 2E 30 32 39 02 09 00 00 " + "31 2E 54 32 30 2E 30 32 39 02 09 00 00 31 2E 54 " + "32 30 2E 30 32 39 02 09 00 00 31 2E 54 32 30 2E " + "30 32 38 02 09 00 00 31 2E 54 32 30 2E 30 32 38 " + "02 09 00 00 31 2E 54 32 30 2E 30 32 38 02 09 00 " + "00 31 2E 54 32 30 2E 30 31 38 02 09 00 00 31 2E " + "54 32 30 2E 30 31 38 02 09 00 00 31 2E 54 32 30 " + "2E 30 31 38 02 09 00 00 31 2E 54 32 30 2E 30 31 " + "37 02 09 00 00 31 2E 54 32 30 2E 30 31 37 02 09 " + "00 00 31 2E 54 32 30 2E 30 31 37 02 09 00 00 31 " + "2E 54 32 30 2E 30 31 36 02 09 00 00 31 2E 54 32 " + "30 2E 30 31 36 02 09 00 00 31 2E 54 32 30 2E 30 " + "31 36 02 09 00 00 31 2E 54 32 30 2E 30 30 36 02 " + "09 00 00 31 2E 54 32 30 2E 30 30 36 02 09 00 00 " + "31 2E 54 32 30 2E 30 30 36 02 09 00 00 31 2E 54 " + "32 30 2E 30 30 35 02 09 00 00 31 2E 54 32 30 2E " + "30 30 35 02 09 00 00 31 2E 54 32 30 2E 30 30 35 " + "02 09 00 00 31 2E 54 32 30 2E 30 30 34 02 09 00 " + "00 31 2E 54 32 30 2E 30 30 34 02 09 00 00 31 2E " + "54 32 30 2E 30 30 34 02 09 00 00 31 2E 54 32 30 " + "2E 30 30 37 02 09 00 00 31 2E 54 32 30 2E 30 30 " + "37 02 09 00 00 31 2E 54 32 30 2E 30 30 37 02 09 " + "00 00 31 2E 54 32 30 2E 30 30 38 02 09 00 00 31 " + "2E 54 32 30 2E 30 30 38 02 09 00 00 31 2E 54 32 " + "30 2E 30 30 38 02 09 00 00 31 2E 54 32 30 2E 30 " + "30 39 02 09 00 00 31 2E 54 32 30 2E 30 30 39 02 " + "09 00 00 31 2E 54 32 30 2E 30 30 39 02 09 00 00 " + "31 2E 54 32 30 2E 30 31 39 02 09 00 00 31 2E 54 " + "32 30 2E 30 31 39 02 09 00 00 31 2E 54 32 30 2E " + "30 31 39 02 09 00 00 31 2E 54 32 30 2E 30 32 30 " + "02 09 00 00 31 2E 54 32 30 2E 30 32 30 02 09 00 " + "00 31 2E 54 32 30 2E 30 32 30 02 09 00 00 31 2E " + "54 32 30 2E 30 32 31 02 09 00 00 31 2E 54 32 30 " + "2E 30 32 31 02 09 00 00 31 2E 54 32 30 2E 30 32 " + "31 02 09 00 00 31 2E 54 32 30 2E 30 33 31 02 09 " + "00 00 31 2E 54 32 30 2E 30 33 31 02 09 00 00 31 " + "2E 54 32 30 2E 30 33 31 02 09 00 00 31 2E 54 32 " + "30 2E 30 33 32 02 09 00 00 31 2E 54 32 30 2E 30 " + "33 32 02 09 00 00 31 2E 54 32 30 2E 30 33 32 02 " + "09 00 00 31 2E 54 32 30 2E 30 33 33 02 09 00 00 " + "31 2E 54 32 30 2E 30 33 33 02 09 00 00 31 2E 54 " + "32 30 2E 30 33 33 02 09 00 00 31 2E 54 32 30 2E " + "30 34 33 02 09 00 00 31 2E 54 32 30 2E 30 34 33 " + "02 09 00 00 31 2E 54 32 30 2E 30 34 33 02 09 00 " + "00 31 2E 54 32 30 2E 30 34 34 02 09 00 00 31 2E " + "54 32 30 2E 30 34 34 02 09 00 00 31 2E 54 32 30 " + "2E 30 34 34 02 09 00 00 31 2E 54 32 30 2E 30 34 " + "35 02 09 00 00 31 2E 54 32 30 2E 30 34 35 02 09 " + "00 00 31 2E 54 32 30 2E 30 34 35 02 09 00 00 31 " + "2E 54 32 30 2E 30 35 35 02 09 00 00 31 2E 54 32 " + "30 2E 30 35 35 02 09 00 00 31 2E 54 32 30 2E 30 " + "35 35 02 09 00 00 31 2E 54 32 30 2E 30 35 36 02 " + "09 00 00 31 2E 54 32 30 2E 30 35 36 02 09 00 00 " + "31 2E 54 32 30 2E 30 35 36 02 09 00 00 31 2E 54 " + "32 30 2E 30 35 37 02 09 00 00 31 2E 54 32 30 2E " + "30 35 37 02 09 00 00 31 2E 54 32 30 2E 30 35 37 " + "02 09 00 00 31 2E 54 32 30 2E 30 36 37 02 09 00 " + "00 31 2E 54 32 30 2E 30 36 37 02 09 00 00 31 2E " + "54 32 30 2E 30 36 37 02 09 00 00 31 2E 54 32 30 " + "2E 30 36 38 02 09 00 00 31 2E 54 32 30 2E 30 36 " + "38 02 09 00 00 31 2E 54 32 30 2E 30 36 38 02 09 " + "00 00 31 2E 54 32 30 2E 30 36 39 02 09 00 00 31 " + "2E 54 32 30 2E 30 36 39 02 09 00 00 31 2E 54 32 " + "30 2E 30 36 39 02 09 00 00 31 2E 54 32 30 2E 30 " + "37 39 02 09 00 00 31 2E 54 32 30 2E 30 37 39 02 " + "09 00 00 31 2E 54 32 30 2E 30 37 39 02 09 00 00 " + "31 2E 54 32 30 2E 30 38 30 02 09 00 00 31 2E 54 " + "32 30 2E 30 38 30 02 09 00 00 31 2E 54 32 30 2E " + "30 38 30 02 09 00 00 31 2E 54 32 30 2E 30 38 31 " + "02 09 00 00 31 2E 54 32 30 2E 30 38 31 02 09 00 " + "00 31 2E 54 32 30 2E 30 38 31 02 09 00 00 31 2E " + "54 32 30 2E 30 39 31 02 09 00 00 31 2E 54 32 30 " + "2E 30 39 31 02 09 00 00 31 2E 54 32 30 2E 30 39 " + "31 02 09 00 00 31 2E 54 32 30 2E 30 39 32 02 09 " + "00 00 31 2E 54 32 30 2E 30 39 32 02 09 00 00 31 " + "2E 54 32 30 2E 30 39 32 02 09 00 00 31 2E 54 32 " + "30 2E 30 39 33 02 09 00 00 31 2E 54 32 30 2E 30 " + "39 33 02 09 00 00 31 2E 54 32 30 2E 30 39 33 02 " + "09 00 00 31 2E 54 32 30 2E 31 30 33 02 09 00 00 " + "31 2E 54 32 30 2E 31 30 33 02 09 00 00 31 2E 54 " + "32 30 2E 31 30 33 02 09 00 00 31 2E 54 32 30 2E " + "31 30 34 02 09 00 00 31 2E 54 32 30 2E 31 30 34 " + "02 09 00 00 31 2E 54 32 30 2E 31 30 34 02 09 00 " + "00 31 2E 54 32 30 2E 31 30 35 02 09 00 00 31 2E " + "54 32 30 2E 31 30 35 02 09 00 00 31 2E 54 32 30 " + "2E 31 30 35 02 09 00 00 31 2E 54 32 30 2E 31 31 " + "35 02 09 00 00 31 2E 54 32 30 2E 31 31 35 02 09 " + "00 00 31 2E 54 32 30 2E 31 31 35 02 09 00 00 31 " + "2E 54 32 30 2E 31 31 36 02 09 00 00 31 2E 54 32 " + "30 2E 31 31 36 02 09 00 00 31 2E 54 32 30 2E 31 " + "31 36 02 09 00 00 31 2E 54 32 30 2E 31 31 37 02 " + "09 00 00 31 2E 54 32 30 2E 31 31 37 02 09 00 00 " + "31 2E 54 32 30 2E 31 31 37 02 09 00 00 31 2E 54 " + "32 30 2E 31 32 37 02 09 00 00 31 2E 54 32 30 2E " + "31 32 37 02 09 00 00 31 2E 54 32 30 2E 31 32 37 " + "02 09 00 00 31 2E 54 32 30 2E 31 32 38 02 09 00 " + "00 31 2E 54 32 30 2E 31 32 38 02 09 00 00 31 2E " + "54 32 30 2E 31 32 38 02 09 00 00 31 2E 54 32 30 " + "2E 31 32 39 02 09 00 00 31 2E 54 32 30 2E 31 32 " + "39 02 09 00 00 31 2E 54 32 30 2E 31 32 39 02 09 " + "00 00 31 2E 54 32 30 2E 31 33 39 02 09 00 00 31 " + "2E 54 32 30 2E 31 33 39 02 09 00 00 31 2E 54 32 " + "30 2E 31 33 39 02 09 00 00 31 2E 54 32 30 2E 31 " + "34 30 02 09 00 00 31 2E 54 32 30 2E 31 34 30 02 " + "09 00 00 31 2E 54 32 30 2E 31 34 30 02 09 00 00 " + "31 2E 54 32 30 2E 31 34 31 02 09 00 00 31 2E 54 " + "32 30 2E 31 34 31 02 09 00 00 31 2E 54 32 30 2E " + "31 34 31 02 09 00 00 31 2E 54 32 30 2E 31 35 31 " + "02 09 00 00 31 2E 54 32 30 2E 31 35 31 02 09 00 " + "00 31 2E 54 32 30 2E 31 35 31 02 09 00 00 31 2E " + "54 32 30 2E 31 35 32 02 09 00 00 31 2E 54 32 30 " + "2E 31 35 32 02 09 00 00 31 2E 54 32 30 2E 31 35 " + "32 02 09 00 00 31 2E 54 32 30 2E 31 35 33 02 09 " + "00 00 31 2E 54 32 30 2E 31 35 33 02 09 00 00 31 " + "2E 54 32 30 2E 31 35 33 02 09 00 00 31 2E 54 32 " + "30 2E 31 36 33 02 09 00 00 31 2E 54 32 30 2E 31 " + "36 33 02 09 00 00 31 2E 54 32 30 2E 31 36 33 02 " + "09 00 00 31 2E 54 32 30 2E 31 36 34 02 09 00 00 " + "31 2E 54 32 30 2E 31 36 34 02 09 00 00 31 2E 54 " + "32 30 2E 31 36 34 02 09 00 00 31 2E 54 32 30 2E " + "31 36 35 02 09 00 00 31 2E 54 32 30 2E 31 36 35 " + "02 09 00 00 31 2E 54 32 30 2E 31 36 35 02 09 00 " + "00 31 2E 54 36 30 2E 30 30 33 02 09 00 00 31 2E " + "54 36 30 2E 30 30 33 02 09 00 00 31 2E 54 36 30 " + "2E 30 30 33 02 09 00 00 31 2E 54 36 30 2E 30 30 " + "34 02 09 00 00 31 2E 54 36 30 2E 30 30 34 02 09 " + "00 00 31 2E 54 36 30 2E 30 30 34 02 09 00 00 31 " + "2E 54 36 30 2E 30 30 35 02 09 00 00 31 2E 54 36 " + "30 2E 30 30 35 02 09 00 00 31 2E 54 36 30 2E 30 " + "30 35 02 09 00 00 31 2E 54 36 30 2E 30 31 35 02 " + "09 00 00 31 2E 54 36 30 2E 30 31 35 02 09 00 00 " + "31 2E 54 36 30 2E 30 31 35 02 09 00 00 31 2E 54 " + "36 30 2E 30 31 36 02 09 00 00 31 2E 54 36 30 2E " + "30 31 36 02 09 00 00 31 2E 54 36 30 2E 30 31 36 " + "02 09 00 00 31 2E 54 36 30 2E 30 31 37 02 09 00 " + "00 31 2E 54 36 30 2E 30 31 37 02 09 00 00 31 2E " + "54 36 30 2E 30 31 37 02 09 00 00 31 2E 54 36 30 " + "2E 30 32 37 02 09 00 00 31 2E 54 36 30 2E 30 32 " + "37 02 09 00 00 31 2E 54 36 30 2E 30 32 37 02 09 " + "00 00 31 2E 54 36 30 2E 30 32 38 02 09 00 00 31 " + "2E 54 36 30 2E 30 32 38 02 09 00 00 31 2E 54 36 " + "30 2E 30 32 38 02 09 00 00 31 2E 54 36 30 2E 30 " + "32 39 02 09 00 00 31 2E 54 36 30 2E 30 32 39 02 " + "09 00 00 31 2E 54 36 30 2E 30 32 39 02 09 00 00 " + "31 2E 54 36 30 2E 30 33 39 02 09 00 00 31 2E 54 " + "36 30 2E 30 33 39 02 09 00 00 31 2E 54 36 30 2E " + "30 33 39 02 09 00 00 31 2E 54 36 30 2E 30 34 30 " + "02 09 00 00 31 2E 54 36 30 2E 30 34 30 02 09 00 " + "00 31 2E 54 36 30 2E 30 34 30 02 09 00 00 31 2E " + "54 36 30 2E 30 34 31 02 09 00 00 31 2E 54 36 30 " + "2E 30 34 31 02 09 00 00 31 2E 54 36 30 2E 30 34 " + "31 02 09 00 00 31 2E 54 36 30 2E 30 35 31 02 09 " + "00 00 31 2E 54 36 30 2E 30 35 31 02 09 00 00 31 " + "2E 54 36 30 2E 30 35 31 02 09 00 00 31 2E 54 36 " + "30 2E 30 35 32 02 09 00 00 31 2E 54 36 30 2E 30 " + "35 32 02 09 00 00 31 2E 54 36 30 2E 30 35 32 02 " + "09 00 00 31 2E 54 36 30 2E 30 35 33 02 09 00 00 " + "31 2E 54 36 30 2E 30 35 33 02 09 00 00 31 2E 54 " + "36 30 2E 30 35 33 02 09 00 00 31 2E 54 36 30 2E " + "30 35 36 02 09 00 00 31 2E 54 36 30 2E 30 35 36 " + "02 09 00 00 31 2E 54 36 30 2E 30 35 36 02 09 00 " + "00 31 2E 54 36 30 2E 30 35 35 02 09 00 00 31 2E " + "54 36 30 2E 30 35 35 02 09 00 00 31 2E 54 36 30 " + "2E 30 35 35 02 09 00 00 31 2E 54 36 30 2E 30 35 " + "34 02 09 00 00 31 2E 54 36 30 2E 30 35 34 02 09 " + "00 00 31 2E 54 36 30 2E 30 35 34 02 09 00 00 31 " + "2E 54 36 30 2E 30 34 34 02 09 00 00 31 2E 54 36 " + "30 2E 30 34 34 02 09 00 00 31 2E 54 36 30 2E 30 " + "34 34 02 09 00 00 31 2E 54 36 30 2E 30 34 33 02 " + "09 00 00 31 2E 54 36 30 2E 30 34 33 02 09 00 00 " + "31 2E 54 36 30 2E 30 34 33 02 09 00 00 31 2E 54 " + "36 30 2E 30 34 32 02 09 00 00 31 2E 54 36 30 2E " + "30 34 32 02 09 00 00 31 2E 54 36 30 2E 30 34 32 " + "02 09 00 00 31 2E 54 36 30 2E 30 33 32 02 09 00 " + "00 31 2E 54 36 30 2E 30 33 32 02 09 00 00 31 2E " + "54 36 30 2E 30 33 32 02 09 00 00 31 2E 54 36 30 " + "2E 30 33 31 02 09 00 00 31 2E 54 36 30 2E 30 33 " + "31 02 09 00 00 31 2E 54 36 30 2E 30 33 31 02 09 " + "00 00 31 2E 54 36 30 2E 30 33 30 02 09 00 00 31 " + "2E 54 36 30 2E 30 33 30 02 09 00 00 31 2E 54 36 " + "30 2E 30 33 30 02 09 00 00 31 2E 54 36 30 2E 30 " + "32 30 02 09 00 00 31 2E 54 36 30 2E 30 32 30 02 " + "09 00 00 31 2E 54 36 30 2E 30 32 30 02 09 00 00 " + "31 2E 54 36 30 2E 30 31 39 02 09 00 00 31 2E 54 " + "36 30 2E 30 31 39 02 09 00 00 31 2E 54 36 30 2E " + "30 31 39 02 09 00 00 31 2E 54 36 30 2E 30 31 38 " + "02 09 00 00 31 2E 54 36 30 2E 30 31 38 02 09 00 " + "00 31 2E 54 36 30 2E 30 31 38 02 09 00 00 31 2E " + "54 36 30 2E 30 30 38 02 09 00 00 31 2E 54 36 30 " + "2E 30 30 38 02 09 00 00 31 2E 54 36 30 2E 30 30 " + "38 02 09 00 00 31 2E 54 36 30 2E 30 30 37 02 09 " + "00 00 31 2E 54 36 30 2E 30 30 37 02 09 00 00 31 " + "2E 54 36 30 2E 30 30 37 02 09 00 00 31 2E 54 36 " + "30 2E 30 30 36 02 09 00 00 31 2E 54 36 30 2E 30 " + "30 36 02 09 00 00 31 2E 54 36 30 2E 30 30 36 02 " + "09 00 00 31 2E 54 32 30 2E 31 36 38 02 09 00 00 " + "31 2E 54 32 30 2E 31 36 38 02 09 00 00 31 2E 54 " + "32 30 2E 31 36 38 02 09 00 00 31 2E 54 32 30 2E " + "31 36 37 02 09 00 00 31 2E 54 32 30 2E 31 36 37 " + "02 09 00 00 31 2E 54 32 30 2E 31 36 37 02 09 00 " + "00 31 2E 54 32 30 2E 31 36 36 02 09 00 00 31 2E " + "54 32 30 2E 31 36 36 02 09 00 00 31 2E 54 32 30 " + "2E 31 36 36 02 09 00 00 31 2E 54 32 30 2E 31 35 " + "36 02 09 00 00 31 2E 54 32 30 2E 31 35 36 02 09 " + "00 00 31 2E 54 32 30 2E 31 35 36 02 09 00 00 31 " + "2E 54 32 30 2E 31 35 35 02 09 00 00 31 2E 54 32 " + "30 2E 31 35 35 02 09 00 00 31 2E 54 32 30 2E 31 " + "35 35 02 09 00 00 31 2E 54 32 30 2E 31 35 34 02 " + "09 00 00 31 2E 54 32 30 2E 31 35 34 02 09 00 00 " + "31 2E 54 32 30 2E 31 35 34 02 09 00 00 31 2E 54 " + "32 30 2E 31 34 34 02 09 00 00 31 2E 54 32 30 2E " + "31 34 34 "; String record_0x03C = " 3C 00 62 05 02 09 00 00 31 2E 54 32 30 " + "2E 31 34 34 02 09 00 00 31 2E 54 32 30 2E 31 34 " + "33 02 09 00 00 31 2E 54 32 30 2E 31 34 33 02 09 " + "00 00 31 2E 54 32 30 2E 31 34 33 02 09 00 00 31 " + "2E 54 32 30 2E 31 34 32 02 09 00 00 31 2E 54 32 " + "30 2E 31 34 32 02 09 00 00 31 2E 54 32 30 2E 31 " + "34 32 02 09 00 00 31 2E 54 32 30 2E 31 33 32 02 " + "09 00 00 31 2E 54 32 30 2E 31 33 32 02 09 00 00 " + "31 2E 54 32 30 2E 31 33 32 02 09 00 00 31 2E 54 " + "32 30 2E 31 33 31 02 09 00 00 31 2E 54 32 30 2E " + "31 33 31 02 09 00 00 31 2E 54 32 30 2E 31 33 31 " + "02 09 00 00 31 2E 54 32 30 2E 31 33 30 02 09 00 " + "00 31 2E 54 32 30 2E 31 33 30 02 09 00 00 31 2E " + "54 32 30 2E 31 33 30 02 09 00 00 31 2E 54 32 30 " + "2E 31 32 30 02 09 00 00 31 2E 54 32 30 2E 31 32 " + "30 02 09 00 00 31 2E 54 32 30 2E 31 32 30 02 09 " + "00 00 31 2E 54 32 30 2E 31 31 39 02 09 00 00 31 " + "2E 54 32 30 2E 31 31 39 02 09 00 00 31 2E 54 32 " + "30 2E 31 31 39 02 09 00 00 31 2E 54 32 30 2E 31 " + "31 38 02 09 00 00 31 2E 54 32 30 2E 31 31 38 02 " + "09 00 00 31 2E 54 32 30 2E 31 31 38 02 09 00 00 " + "31 2E 54 32 30 2E 31 30 38 02 09 00 00 31 2E 54 " + "32 30 2E 31 30 38 02 09 00 00 31 2E 54 32 30 2E " + "31 30 38 02 09 00 00 31 2E 54 32 30 2E 31 30 37 " + "02 09 00 00 31 2E 54 32 30 2E 31 30 37 02 09 00 " + "00 31 2E 54 32 30 2E 31 30 37 02 09 00 00 31 2E " + "54 32 30 2E 31 30 36 02 09 00 00 31 2E 54 32 30 " + "2E 31 30 36 02 09 00 00 31 2E 54 32 30 2E 31 30 " + "36 02 09 00 00 31 2E 54 32 30 2E 30 39 36 02 09 " + "00 00 31 2E 54 32 30 2E 30 39 36 02 09 00 00 31 " + "2E 54 32 30 2E 30 39 36 02 09 00 00 31 2E 54 32 " + "30 2E 30 39 35 02 09 00 00 31 2E 54 32 30 2E 30 " + "39 35 02 09 00 00 31 2E 54 32 30 2E 30 39 35 02 " + "09 00 00 31 2E 54 32 30 2E 30 39 34 02 09 00 00 " + "31 2E 54 32 30 2E 30 39 34 02 09 00 00 31 2E 54 " + "32 30 2E 30 39 34 02 09 00 00 31 2E 54 32 30 2E " + "30 38 34 02 09 00 00 31 2E 54 32 30 2E 30 38 34 " + "02 09 00 00 31 2E 54 32 30 2E 30 38 34 02 09 00 " + "00 31 2E 54 32 30 2E 30 38 33 02 09 00 00 31 2E " + "54 32 30 2E 30 38 33 02 09 00 00 31 2E 54 32 30 " + "2E 30 38 33 02 09 00 00 31 2E 54 32 30 2E 30 38 " + "32 02 09 00 00 31 2E 54 32 30 2E 30 38 32 02 09 " + "00 00 31 2E 54 32 30 2E 30 38 32 02 09 00 00 31 " + "2E 54 32 30 2E 30 37 32 02 09 00 00 31 2E 54 32 " + "30 2E 30 37 32 02 09 00 00 31 2E 54 32 30 2E 30 " + "37 32 02 09 00 00 31 2E 54 32 30 2E 30 37 31 02 " + "09 00 00 31 2E 54 32 30 2E 30 37 31 02 09 00 00 " + "31 2E 54 32 30 2E 30 37 31 02 09 00 00 31 2E 54 " + "32 30 2E 30 37 30 02 09 00 00 31 2E 54 32 30 2E " + "30 37 30 02 09 00 00 31 2E 54 32 30 2E 30 37 30 " + "02 09 00 00 31 2E 54 32 30 2E 30 36 30 02 09 00 " + "00 31 2E 54 32 30 2E 30 36 30 02 09 00 00 31 2E " + "54 32 30 2E 30 36 30 02 09 00 00 31 2E 54 32 30 " + "2E 30 35 39 02 09 00 00 31 2E 54 32 30 2E 30 35 " + "39 02 09 00 00 31 2E 54 32 30 2E 30 35 39 02 09 " + "00 00 31 2E 54 32 30 2E 30 35 38 02 09 00 00 31 " + "2E 54 32 30 2E 30 35 38 02 09 00 00 31 2E 54 32 " + "30 2E 30 35 38 02 09 00 00 31 2E 54 32 30 2E 30 " + "34 38 02 09 00 00 31 2E 54 32 30 2E 30 34 38 02 " + "09 00 00 31 2E 54 32 30 2E 30 34 38 02 09 00 00 " + "31 2E 54 32 30 2E 30 34 37 02 09 00 00 31 2E 54 " + "32 30 2E 30 34 37 02 09 00 00 31 2E 54 32 30 2E " + "30 34 37 02 09 00 00 31 2E 54 32 30 2E 30 34 36 " + "02 09 00 00 31 2E 54 32 30 2E 30 34 36 02 09 00 " + "00 31 2E 54 32 30 2E 30 34 36 02 09 00 00 31 2E " + "54 32 30 2E 30 33 36 02 09 00 00 31 2E 54 32 30 " + "2E 30 33 36 02 09 00 00 31 2E 54 32 30 2E 30 33 " + "36 02 09 00 00 31 2E 54 32 30 2E 30 33 35 02 09 " + "00 00 31 2E 54 32 30 2E 30 33 35 02 09 00 00 31 " + "2E 54 32 30 2E 30 33 35 02 09 00 00 31 2E 54 32 " + "30 2E 30 33 34 02 09 00 00 31 2E 54 32 30 2E 30 " + "33 34 02 09 00 00 31 2E 54 32 30 2E 30 33 34 02 " + "09 00 00 31 2E 54 32 30 2E 30 32 34 02 09 00 00 " + "31 2E 54 32 30 2E 30 32 34 02 09 00 00 31 2E 54 " + "32 30 2E 30 32 34 02 09 00 00 31 2E 54 32 30 2E " + "30 32 33 02 09 00 00 31 2E 54 32 30 2E 30 32 33 " + "02 09 00 00 31 2E 54 32 30 2E 30 32 33 02 09 00 " + "00 31 2E 54 32 30 2E 30 32 32 02 09 00 00 31 2E " + "54 32 30 2E 30 32 32 02 09 00 00 31 2E 54 32 30 " + "2E 30 32 32 02 09 00 00 31 2E 54 32 30 2E 30 31 " + "32 02 09 00 00 31 2E 54 32 30 2E 30 31 32 02 09 " + "00 00 31 2E 54 32 30 2E 30 31 32 02 09 00 00 31 " + "2E 54 32 30 2E 30 31 31 02 09 00 00 31 2E 54 32 " + "30 2E 30 31 31 02 09 00 00 31 2E 54 32 30 2E 30 " + "31 31 02 09 00 00 31 2E 54 32 30 2E 30 31 30 02 " + "09 00 00 31 2E 54 32 30 2E 30 31 30 02 09 00 00 " + "31 2E 54 32 30 2E 30 31 30 "; byte[] data1 = HexRead.readFromString(record_0x0018 + record_0x03C); RecordInputStream in1 = TestcaseRecordInputStream.create(data1); NameRecord nr1 = new NameRecord(in1); assert_bug50244(nr1); byte[] data2 = nr1.serialize(); assertEquals(data1.length, data2.length); RecordInputStream in2 = TestcaseRecordInputStream.create(data2); NameRecord nr2 = new NameRecord(in2); assert_bug50244(nr2); }
/** Reads in the contents of this sheet */ final void readSheet() { // If this sheet contains only a chart, then set everything to // empty and do not bother parsing the sheet // Thanks to steve.brophy for spotting this if (!sheetBof.isWorksheet()) { numRows = 0; numCols = 0; cells = new Cell[0][0]; // return; } SheetReader reader = new SheetReader( excelFile, sharedStrings, formattingRecords, sheetBof, workbookBof, nineteenFour, workbook, startPosition, this); reader.read(); // Take stuff that was read in numRows = reader.getNumRows(); numCols = reader.getNumCols(); cells = reader.getCells(); rowProperties = reader.getRowProperties(); columnInfosArray = reader.getColumnInfosArray(); hyperlinks = reader.getHyperlinks(); conditionalFormats = reader.getConditionalFormats(); autoFilter = reader.getAutoFilter(); charts = reader.getCharts(); drawings = reader.getDrawings(); dataValidation = reader.getDataValidation(); mergedCells = reader.getMergedCells(); settings = reader.getSettings(); settings.setHidden(hidden); rowBreaks = reader.getRowBreaks(); columnBreaks = reader.getColumnBreaks(); workspaceOptions = reader.getWorkspaceOptions(); plsRecord = reader.getPLS(); buttonPropertySet = reader.getButtonPropertySet(); maxRowOutlineLevel = reader.getMaxRowOutlineLevel(); maxColumnOutlineLevel = reader.getMaxColumnOutlineLevel(); reader = null; if (!workbookSettings.getGCDisabled()) { System.gc(); } if (columnInfosArray.size() > 0) { ColumnInfoRecord cir = (ColumnInfoRecord) columnInfosArray.get(columnInfosArray.size() - 1); columnInfos = new ColumnInfoRecord[cir.getEndColumn() + 1]; } else { columnInfos = new ColumnInfoRecord[0]; } // Add any local names if (localNames != null) { for (Iterator it = localNames.iterator(); it.hasNext(); ) { NameRecord nr = (NameRecord) it.next(); if (nr.getBuiltInName() == BuiltInName.PRINT_AREA) { if (nr.getRanges().length > 0) { NameRecord.NameRange rng = nr.getRanges()[0]; settings.setPrintArea( rng.getFirstColumn(), rng.getFirstRow(), rng.getLastColumn(), rng.getLastRow()); } } else if (nr.getBuiltInName() == BuiltInName.PRINT_TITLES) { // There can be 1 or 2 entries. // Row entries have hardwired column entries (first and last // possible column) // Column entries have hardwired row entries (first and last // possible row) for (int i = 0; i < nr.getRanges().length; i++) { NameRecord.NameRange rng = nr.getRanges()[i]; if (rng.getFirstColumn() == 0 && rng.getLastColumn() == 255) { settings.setPrintTitlesRow(rng.getFirstRow(), rng.getLastRow()); } else { settings.setPrintTitlesCol(rng.getFirstColumn(), rng.getLastColumn()); } } } } } }
/** * Does the hard work of building up the object graph from the excel bytes * * @exception BiffException * @exception PasswordException if the workbook is password protected */ public void parse() throws BiffException, PasswordException { Record r = null; BOFRecord bof = new BOFRecord(excelFile.next()); workbookBof = bof; bofs++; if (!bof.isBiff8() && !bof.isBiff7()) { throw new BiffException(BiffException.unrecognizedBiffVersion); } if (!bof.isWorkbookGlobals()) { throw new BiffException(BiffException.expectedGlobals); } ArrayList continueRecords = new ArrayList(); ArrayList localNames = new ArrayList(); nameTable = new ArrayList(); addInFunctions = new ArrayList(); // Skip to the first worksheet while (bofs == 1) { r = excelFile.next(); if (r.getType() == Type.SST) { continueRecords.clear(); Record nextrec = excelFile.peek(); while (nextrec.getType() == Type.CONTINUE) { continueRecords.add(excelFile.next()); nextrec = excelFile.peek(); } // cast the array Record[] records = new Record[continueRecords.size()]; records = (Record[]) continueRecords.toArray(records); sharedStrings = new SSTRecord(r, records, settings); } else if (r.getType() == Type.FILEPASS) { throw new PasswordException(); } else if (r.getType() == Type.NAME) { NameRecord nr = null; if (bof.isBiff8()) { nr = new NameRecord(r, settings, nameTable.size()); } else { nr = new NameRecord(r, settings, nameTable.size(), NameRecord.biff7); } // Add all local and global names to the name table in order to // preserve the indexing nameTable.add(nr); if (nr.isGlobal()) { namedRecords.put(nr.getName(), nr); } else { localNames.add(nr); } } else if (r.getType() == Type.FONT) { FontRecord fr = null; if (bof.isBiff8()) { fr = new FontRecord(r, settings); } else { fr = new FontRecord(r, settings, FontRecord.biff7); } fonts.addFont(fr); } else if (r.getType() == Type.PALETTE) { PaletteRecord palette = new PaletteRecord(r); formattingRecords.setPalette(palette); } else if (r.getType() == Type.NINETEENFOUR) { NineteenFourRecord nr = new NineteenFourRecord(r); nineteenFour = nr.is1904(); } else if (r.getType() == Type.FORMAT) { FormatRecord fr = null; if (bof.isBiff8()) { fr = new FormatRecord(r, settings, FormatRecord.biff8); } else { fr = new FormatRecord(r, settings, FormatRecord.biff7); } try { formattingRecords.addFormat(fr); } catch (NumFormatRecordsException e) { // This should not happen. Bomb out Assert.verify(false, e.getMessage()); } } else if (r.getType() == Type.XF) { XFRecord xfr = null; if (bof.isBiff8()) { xfr = new XFRecord(r, settings, XFRecord.biff8); } else { xfr = new XFRecord(r, settings, XFRecord.biff7); } try { formattingRecords.addStyle(xfr); } catch (NumFormatRecordsException e) { // This should not happen. Bomb out Assert.verify(false, e.getMessage()); } } else if (r.getType() == Type.BOUNDSHEET) { BoundsheetRecord br = null; if (bof.isBiff8()) { br = new BoundsheetRecord(r, settings); } else { br = new BoundsheetRecord(r, BoundsheetRecord.biff7); } if (br.isSheet()) { boundsheets.add(br); } else if (br.isChart() && !settings.getDrawingsDisabled()) { boundsheets.add(br); } } else if (r.getType() == Type.EXTERNSHEET) { if (bof.isBiff8()) { externSheet = new ExternalSheetRecord(r, settings); } else { externSheet = new ExternalSheetRecord(r, settings, ExternalSheetRecord.biff7); } } else if (r.getType() == Type.XCT) { XCTRecord xctr = new XCTRecord(r); xctRecords.add(xctr); } else if (r.getType() == Type.CODEPAGE) { CodepageRecord cr = new CodepageRecord(r); settings.setCharacterSet(cr.getCharacterSet()); } else if (r.getType() == Type.SUPBOOK) { Record nextrec = excelFile.peek(); while (nextrec.getType() == Type.CONTINUE) { r.addContinueRecord(excelFile.next()); nextrec = excelFile.peek(); } SupbookRecord sr = new SupbookRecord(r, settings); supbooks.add(sr); } else if (r.getType() == Type.EXTERNNAME) { ExternalNameRecord enr = new ExternalNameRecord(r, settings); if (enr.isAddInFunction()) { addInFunctions.add(enr.getName()); } } else if (r.getType() == Type.PROTECT) { ProtectRecord pr = new ProtectRecord(r); wbProtected = pr.isProtected(); } else if (r.getType() == Type.OBJPROJ) { containsMacros = true; } else if (r.getType() == Type.COUNTRY) { countryRecord = new CountryRecord(r); } else if (r.getType() == Type.MSODRAWINGGROUP) { if (!settings.getDrawingsDisabled()) { msoDrawingGroup = new MsoDrawingGroupRecord(r); if (drawingGroup == null) { drawingGroup = new DrawingGroup(Origin.READ); } drawingGroup.add(msoDrawingGroup); Record nextrec = excelFile.peek(); while (nextrec.getType() == Type.CONTINUE) { drawingGroup.add(excelFile.next()); nextrec = excelFile.peek(); } } } else if (r.getType() == Type.BUTTONPROPERTYSET) { buttonPropertySet = new ButtonPropertySetRecord(r); } else if (r.getType() == Type.EOF) { bofs--; } else if (r.getType() == Type.REFRESHALL) { RefreshAllRecord rfm = new RefreshAllRecord(r); settings.setRefreshAll(rfm.getRefreshAll()); } else if (r.getType() == Type.TEMPLATE) { TemplateRecord rfm = new TemplateRecord(r); settings.setTemplate(rfm.getTemplate()); } else if (r.getType() == Type.EXCEL9FILE) { Excel9FileRecord e9f = new Excel9FileRecord(r); settings.setExcel9File(e9f.getExcel9File()); } else if (r.getType() == Type.WINDOWPROTECT) { WindowProtectedRecord winp = new WindowProtectedRecord(r); settings.setWindowProtected(winp.getWindowProtected()); } else if (r.getType() == Type.HIDEOBJ) { HideobjRecord hobj = new HideobjRecord(r); settings.setHideobj(hobj.getHideMode()); } else if (r.getType() == Type.WRITEACCESS) { WriteAccessRecord war = new WriteAccessRecord(r, bof.isBiff8(), settings); settings.setWriteAccess(war.getWriteAccess()); } else { // logger.info("Unsupported record type: " + // Integer.toHexString(r.getCode())+"h"); } } bof = null; if (excelFile.hasNext()) { r = excelFile.next(); if (r.getType() == Type.BOF) { bof = new BOFRecord(r); } } // Only get sheets for which there is a corresponding Boundsheet record while (bof != null && getNumberOfSheets() < boundsheets.size()) { if (!bof.isBiff8() && !bof.isBiff7()) { throw new BiffException(BiffException.unrecognizedBiffVersion); } if (bof.isWorksheet()) { // Read the sheet in SheetImpl s = new SheetImpl( excelFile, sharedStrings, formattingRecords, bof, workbookBof, nineteenFour, this); BoundsheetRecord br = (BoundsheetRecord) boundsheets.get(getNumberOfSheets()); s.setName(br.getName()); s.setHidden(br.isHidden()); addSheet(s); } else if (bof.isChart()) { // Read the sheet in SheetImpl s = new SheetImpl( excelFile, sharedStrings, formattingRecords, bof, workbookBof, nineteenFour, this); BoundsheetRecord br = (BoundsheetRecord) boundsheets.get(getNumberOfSheets()); s.setName(br.getName()); s.setHidden(br.isHidden()); addSheet(s); } else { logger.warn("BOF is unrecognized"); while (excelFile.hasNext() && r.getType() != Type.EOF) { r = excelFile.next(); } } // The next record will normally be a BOF or empty padding until // the end of the block is reached. In exceptionally unlucky cases, // the last EOF will coincide with a block division, so we have to // check there is more data to retrieve. // Thanks to liamg for spotting this bof = null; if (excelFile.hasNext()) { r = excelFile.next(); if (r.getType() == Type.BOF) { bof = new BOFRecord(r); } } } // Add all the local names to the specific sheets for (Iterator it = localNames.iterator(); it.hasNext(); ) { NameRecord nr = (NameRecord) it.next(); if (nr.getBuiltInName() == null) { logger.warn("Usage of a local non-builtin name"); } else if (nr.getBuiltInName() == BuiltInName.PRINT_AREA || nr.getBuiltInName() == BuiltInName.PRINT_TITLES) { // appears to use the internal tab number rather than the // external sheet index SheetImpl s = (SheetImpl) sheets.get(nr.getSheetRef() - 1); s.addLocalName(nr); } } }