Search in sources :

Example 1 with ExternalNameRecord

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

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

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