Search in sources :

Example 11 with SupBookRecord

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

the class LinkTable method getExternalBookAndSheetName.

public String[] getExternalBookAndSheetName(int extRefIndex) {
    int ebIx = _externSheetRecord.getExtbookIndexFromRefIndex(extRefIndex);
    SupBookRecord ebr = _externalBookBlocks[ebIx].getExternalBookRecord();
    if (!ebr.isExternalReferences()) {
        return null;
    }
    // Sheet name only applies if not a global reference
    int shIx1 = _externSheetRecord.getFirstSheetIndexFromRefIndex(extRefIndex);
    int shIx2 = _externSheetRecord.getLastSheetIndexFromRefIndex(extRefIndex);
    String firstSheetName = null;
    String lastSheetName = null;
    if (shIx1 >= 0) {
        firstSheetName = ebr.getSheetNames()[shIx1];
    }
    if (shIx2 >= 0) {
        lastSheetName = ebr.getSheetNames()[shIx2];
    }
    if (shIx1 == shIx2) {
        return new String[] { ebr.getURL(), firstSheetName };
    } else {
        return new String[] { ebr.getURL(), firstSheetName, lastSheetName };
    }
}
Also used : SupBookRecord(org.apache.poi.hssf.record.SupBookRecord)

Example 12 with SupBookRecord

use of org.apache.poi.hssf.record.SupBookRecord 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 13 with SupBookRecord

use of org.apache.poi.hssf.record.SupBookRecord 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

SupBookRecord (org.apache.poi.hssf.record.SupBookRecord)13 ExternSheetRecord (org.apache.poi.hssf.record.ExternSheetRecord)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