Search in sources :

Example 1 with ExternSheetRecord

use of org.apache.poi.hssf.record.ExternSheetRecord in project poi by apache.

the class EventWorkbookBuilder method createStubWorkbook.

/**
	 * Creates a stub Workbook from the supplied records,
	 *  suitable for use with the {@link HSSFFormulaParser}
	 * @param externs The ExternSheetRecords in your file
	 * @param bounds The BoundSheetRecords in your file
	 * @param sst The SSTRecord in your file.
	 * @return A stub Workbook suitable for use with {@link HSSFFormulaParser}
	 */
public static InternalWorkbook createStubWorkbook(ExternSheetRecord[] externs, BoundSheetRecord[] bounds, SSTRecord sst) {
    List<Record> wbRecords = new ArrayList<Record>();
    // Core Workbook records go first
    if (bounds != null) {
        for (BoundSheetRecord bound : bounds) {
            wbRecords.add(bound);
        }
    }
    if (sst != null) {
        wbRecords.add(sst);
    }
    //  preceded by a SupBookRecord
    if (externs != null) {
        wbRecords.add(SupBookRecord.createInternalReferences((short) externs.length));
        for (ExternSheetRecord extern : externs) {
            wbRecords.add(extern);
        }
    }
    // Finally we need an EoF record
    wbRecords.add(EOFRecord.instance);
    return InternalWorkbook.createWorkbook(wbRecords);
}
Also used : ExternSheetRecord(org.apache.poi.hssf.record.ExternSheetRecord) ArrayList(java.util.ArrayList) BoundSheetRecord(org.apache.poi.hssf.record.BoundSheetRecord) Record(org.apache.poi.hssf.record.Record) SupBookRecord(org.apache.poi.hssf.record.SupBookRecord) SSTRecord(org.apache.poi.hssf.record.SSTRecord) EOFRecord(org.apache.poi.hssf.record.EOFRecord) ExternSheetRecord(org.apache.poi.hssf.record.ExternSheetRecord) BoundSheetRecord(org.apache.poi.hssf.record.BoundSheetRecord)

Example 2 with ExternSheetRecord

use of org.apache.poi.hssf.record.ExternSheetRecord in project poi by apache.

the class LinkTable method addNameXPtg.

/**
     * Register an external name in this workbook
     *
     * @param name  the name to register
     * @return a NameXPtg describing this name 
     */
public NameXPtg addNameXPtg(String name) {
    int extBlockIndex = -1;
    ExternalBookBlock extBlock = null;
    // find ExternalBlock for Add-In functions and remember its index
    for (int i = 0; i < _externalBookBlocks.length; i++) {
        SupBookRecord ebr = _externalBookBlocks[i].getExternalBookRecord();
        if (ebr.isAddInFunctions()) {
            extBlock = _externalBookBlocks[i];
            extBlockIndex = i;
            break;
        }
    }
    // An ExternalBlock for Add-In functions was not found. Create a new one.
    if (extBlock == null) {
        extBlock = new ExternalBookBlock();
        extBlockIndex = extendExternalBookBlocks(extBlock);
        // add the created SupBookRecord before ExternSheetRecord
        int idx = findFirstRecordLocBySid(ExternSheetRecord.sid);
        _workbookRecordList.add(idx, extBlock.getExternalBookRecord());
        // register the SupBookRecord in the ExternSheetRecord
        // -2 means that the scope of this name is Workbook and the reference applies to the entire workbook.
        _externSheetRecord.addRef(_externalBookBlocks.length - 1, -2, -2);
    }
    // create a ExternalNameRecord that will describe this name
    ExternalNameRecord extNameRecord = new ExternalNameRecord();
    extNameRecord.setText(name);
    // The docs don't explain why Excel set the formula to #REF!
    extNameRecord.setParsedExpression(new Ptg[] { ErrPtg.REF_INVALID });
    int nameIndex = extBlock.addExternalName(extNameRecord);
    int supLinkIndex = 0;
    // the created ExternalNameRecord will be appended to it
    for (Iterator<Record> iterator = _workbookRecordList.iterator(); iterator.hasNext(); supLinkIndex++) {
        Record record = iterator.next();
        if (record instanceof SupBookRecord) {
            if (((SupBookRecord) record).isAddInFunctions())
                break;
        }
    }
    int numberOfNames = extBlock.getNumberOfNames();
    // a new name is inserted in the end of the SupBookRecord, after the last name
    _workbookRecordList.add(supLinkIndex + numberOfNames, extNameRecord);
    int fakeSheetIdx = -2;
    /* the scope is workbook*/
    int ix = _externSheetRecord.getRefIxForSheet(extBlockIndex, fakeSheetIdx, fakeSheetIdx);
    return new NameXPtg(ix, nameIndex);
}
Also used : ExternalNameRecord(org.apache.poi.hssf.record.ExternalNameRecord) SupBookRecord(org.apache.poi.hssf.record.SupBookRecord) NameXPtg(org.apache.poi.ss.formula.ptg.NameXPtg) CRNCountRecord(org.apache.poi.hssf.record.CRNCountRecord) Record(org.apache.poi.hssf.record.Record) SupBookRecord(org.apache.poi.hssf.record.SupBookRecord) CRNRecord(org.apache.poi.hssf.record.CRNRecord) ExternalNameRecord(org.apache.poi.hssf.record.ExternalNameRecord) NameRecord(org.apache.poi.hssf.record.NameRecord) CountryRecord(org.apache.poi.hssf.record.CountryRecord) NameCommentRecord(org.apache.poi.hssf.record.NameCommentRecord) ExternSheetRecord(org.apache.poi.hssf.record.ExternSheetRecord)

Example 3 with ExternSheetRecord

use of org.apache.poi.hssf.record.ExternSheetRecord in project poi by apache.

the class TestLinkTable method testAddNameX.

public void testAddNameX() {
    WorkbookRecordList wrl = new WorkbookRecordList();
    wrl.add(0, new BOFRecord());
    wrl.add(1, new CountryRecord());
    wrl.add(2, EOFRecord.instance);
    int numberOfSheets = 3;
    LinkTable tbl = new LinkTable(numberOfSheets, wrl);
    // creation of a new LinkTable insert two new records: SupBookRecord followed by ExternSheetRecord
    // assure they are in place:
    //    [BOFRecord]
    //    [CountryRecord]
    //    [SUPBOOK Internal References  nSheets= 3]
    //    [EXTERNSHEET]
    //    [EOFRecord]
    assertEquals(5, wrl.getRecords().size());
    assertTrue(wrl.get(2) instanceof SupBookRecord);
    SupBookRecord sup1 = (SupBookRecord) wrl.get(2);
    assertEquals(numberOfSheets, sup1.getNumberOfSheets());
    assertTrue(wrl.get(3) instanceof ExternSheetRecord);
    ExternSheetRecord extSheet = (ExternSheetRecord) wrl.get(3);
    assertEquals(0, extSheet.getNumOfRefs());
    assertNull(tbl.getNameXPtg("ISODD", -1));
    //still have five records
    assertEquals(5, wrl.getRecords().size());
    // adds two new rercords
    NameXPtg namex1 = tbl.addNameXPtg("ISODD");
    assertEquals(0, namex1.getSheetRefIndex());
    assertEquals(0, namex1.getNameIndex());
    assertEquals(namex1.toString(), tbl.getNameXPtg("ISODD", -1).toString());
    // Can only find on the right sheet ref, if restricting
    assertEquals(namex1.toString(), tbl.getNameXPtg("ISODD", 0).toString());
    assertNull(tbl.getNameXPtg("ISODD", 1));
    assertNull(tbl.getNameXPtg("ISODD", 2));
    // assure they are in place:
    //    [BOFRecord]
    //    [CountryRecord]
    //    [SUPBOOK Internal References  nSheets= 3]
    //    [SUPBOOK Add-In Functions nSheets= 1]
    //    [EXTERNALNAME .name    = ISODD]
    //    [EXTERNSHEET]
    //    [EOFRecord]
    assertEquals(7, wrl.getRecords().size());
    assertTrue(wrl.get(3) instanceof SupBookRecord);
    SupBookRecord sup2 = (SupBookRecord) wrl.get(3);
    assertTrue(sup2.isAddInFunctions());
    assertTrue(wrl.get(4) instanceof ExternalNameRecord);
    ExternalNameRecord ext1 = (ExternalNameRecord) wrl.get(4);
    assertEquals("ISODD", ext1.getText());
    assertTrue(wrl.get(5) instanceof ExternSheetRecord);
    assertEquals(1, extSheet.getNumOfRefs());
    //check that
    assertEquals(0, tbl.resolveNameXIx(namex1.getSheetRefIndex(), namex1.getNameIndex()));
    assertEquals("ISODD", tbl.resolveNameXText(namex1.getSheetRefIndex(), namex1.getNameIndex(), null));
    assertNull(tbl.getNameXPtg("ISEVEN", -1));
    // adds two new rercords
    NameXPtg namex2 = tbl.addNameXPtg("ISEVEN");
    assertEquals(0, namex2.getSheetRefIndex());
    // name index increased by one
    assertEquals(1, namex2.getNameIndex());
    assertEquals(namex2.toString(), tbl.getNameXPtg("ISEVEN", -1).toString());
    assertEquals(8, wrl.getRecords().size());
    // assure they are in place:
    //    [BOFRecord]
    //    [CountryRecord]
    //    [SUPBOOK Internal References  nSheets= 3]
    //    [SUPBOOK Add-In Functions nSheets= 1]
    //    [EXTERNALNAME .name    = ISODD]
    //    [EXTERNALNAME .name    = ISEVEN]
    //    [EXTERNSHEET]
    //    [EOFRecord]
    assertTrue(wrl.get(3) instanceof SupBookRecord);
    assertTrue(wrl.get(4) instanceof ExternalNameRecord);
    assertTrue(wrl.get(5) instanceof ExternalNameRecord);
    assertEquals("ISODD", ((ExternalNameRecord) wrl.get(4)).getText());
    assertEquals("ISEVEN", ((ExternalNameRecord) wrl.get(5)).getText());
    assertTrue(wrl.get(6) instanceof ExternSheetRecord);
    assertTrue(wrl.get(7) instanceof EOFRecord);
    assertEquals(0, tbl.resolveNameXIx(namex2.getSheetRefIndex(), namex2.getNameIndex()));
    assertEquals("ISEVEN", tbl.resolveNameXText(namex2.getSheetRefIndex(), namex2.getNameIndex(), null));
}
Also used : ExternalNameRecord(org.apache.poi.hssf.record.ExternalNameRecord) EOFRecord(org.apache.poi.hssf.record.EOFRecord) ExternSheetRecord(org.apache.poi.hssf.record.ExternSheetRecord) SupBookRecord(org.apache.poi.hssf.record.SupBookRecord) NameXPtg(org.apache.poi.ss.formula.ptg.NameXPtg) BOFRecord(org.apache.poi.hssf.record.BOFRecord) CountryRecord(org.apache.poi.hssf.record.CountryRecord)

Aggregations

ExternSheetRecord (org.apache.poi.hssf.record.ExternSheetRecord)3 SupBookRecord (org.apache.poi.hssf.record.SupBookRecord)3 CountryRecord (org.apache.poi.hssf.record.CountryRecord)2 EOFRecord (org.apache.poi.hssf.record.EOFRecord)2 ExternalNameRecord (org.apache.poi.hssf.record.ExternalNameRecord)2 Record (org.apache.poi.hssf.record.Record)2 NameXPtg (org.apache.poi.ss.formula.ptg.NameXPtg)2 ArrayList (java.util.ArrayList)1 BOFRecord (org.apache.poi.hssf.record.BOFRecord)1 BoundSheetRecord (org.apache.poi.hssf.record.BoundSheetRecord)1 CRNCountRecord (org.apache.poi.hssf.record.CRNCountRecord)1 CRNRecord (org.apache.poi.hssf.record.CRNRecord)1 NameCommentRecord (org.apache.poi.hssf.record.NameCommentRecord)1 NameRecord (org.apache.poi.hssf.record.NameRecord)1 SSTRecord (org.apache.poi.hssf.record.SSTRecord)1