testhssfworkbook.java

来自「EXCEL read and write」· Java 代码 · 共 554 行 · 第 1/2 页

JAVA
554
字号
        assertEquals(true, sheet4.isSelected());        assertEquals(false, sheet5.isSelected());        assertEquals(true, sheet6.isSelected());        assertEquals(true, sheet1.isActive());        assertEquals(false, sheet2.isActive());        assertEquals(true, sheet1.isActive());        assertEquals(false, sheet3.isActive());        wb.setActiveSheet(2);        assertEquals(false, sheet1.isActive());        assertEquals(true, sheet3.isActive());        if (false) { // helpful if viewing this workbook in excel:            sheet1.createRow(0).createCell(0).setCellValue(new HSSFRichTextString("Sheet1"));            sheet2.createRow(0).createCell(0).setCellValue(new HSSFRichTextString("Sheet2"));            sheet3.createRow(0).createCell(0).setCellValue(new HSSFRichTextString("Sheet3"));            sheet4.createRow(0).createCell(0).setCellValue(new HSSFRichTextString("Sheet4"));            try {                File fOut = TempFile.createTempFile("sheetMultiSelect", ".xls");                FileOutputStream os = new FileOutputStream(fOut);                wb.write(os);                os.close();            } catch (IOException e) {                throw new RuntimeException(e);            }        }    }    public void testActiveSheetAfterDelete_bug40414() {        HSSFWorkbook wb=new HSSFWorkbook();        HSSFSheet sheet0 = wb.createSheet("Sheet0");        HSSFSheet sheet1 = wb.createSheet("Sheet1");        HSSFSheet sheet2 = wb.createSheet("Sheet2");        HSSFSheet sheet3 = wb.createSheet("Sheet3");        HSSFSheet sheet4 = wb.createSheet("Sheet4");        // confirm default activation/selection        confirmActiveSelected(sheet0, true);        confirmActiveSelected(sheet1, false);        confirmActiveSelected(sheet2, false);        confirmActiveSelected(sheet3, false);        confirmActiveSelected(sheet4, false);        wb.setActiveSheet(3);        wb.setSelectedTab(3);        confirmActiveSelected(sheet0, false);        confirmActiveSelected(sheet1, false);        confirmActiveSelected(sheet2, false);        confirmActiveSelected(sheet3, true);        confirmActiveSelected(sheet4, false);        wb.removeSheetAt(3);        // after removing the only active/selected sheet, another should be active/selected in its place        if (!sheet4.isSelected()) {            throw new AssertionFailedError("identified bug 40414 a");        }        if (!sheet4.isActive()) {            throw new AssertionFailedError("identified bug 40414 b");        }        confirmActiveSelected(sheet0, false);        confirmActiveSelected(sheet1, false);        confirmActiveSelected(sheet2, false);        confirmActiveSelected(sheet4, true);        sheet3 = sheet4; // re-align local vars in this test case        // Some more cases of removing sheets        // Starting with a multiple selection, and different active sheet        wb.setSelectedTabs(new int[] { 1, 3, });        wb.setActiveSheet(2);        confirmActiveSelected(sheet0, false, false);        confirmActiveSelected(sheet1, false, true);        confirmActiveSelected(sheet2, true,  false);        confirmActiveSelected(sheet3, false, true);        // removing a sheet that is not active, and not the only selected sheet        wb.removeSheetAt(3);        confirmActiveSelected(sheet0, false, false);        confirmActiveSelected(sheet1, false, true);        confirmActiveSelected(sheet2, true,  false);        // removing the only selected sheet        wb.removeSheetAt(1);        confirmActiveSelected(sheet0, false, false);        confirmActiveSelected(sheet2, true,  true);        // The last remaining sheet should always be active+selected        wb.removeSheetAt(1);        confirmActiveSelected(sheet0, true,  true);    }    private static void confirmActiveSelected(HSSFSheet sheet, boolean expected) {        confirmActiveSelected(sheet, expected, expected);    }    private static void confirmActiveSelected(HSSFSheet sheet,            boolean expectedActive, boolean expectedSelected) {        assertEquals("active", expectedActive, sheet.isActive());        assertEquals("selected", expectedSelected, sheet.isSelected());    }        /**     * If Sheet.getSize() returns a different result to Sheet.serialize(), this will cause the BOF     * records to be written with invalid offset indexes.  Excel does not like this, and such      * errors are particularly hard to track down.  This test ensures that HSSFWorkbook throws     * a specific exception as soon as the situation is detected. See bugzilla 45066     */    public void testSheetSerializeSizeMismatch_bug45066() {        HSSFWorkbook wb = new HSSFWorkbook();        Sheet sheet = wb.createSheet("Sheet1").getSheet();        List sheetRecords = sheet.getRecords();        // one way (of many) to cause the discrepancy is with a badly behaved record:        sheetRecords.add(new BadlyBehavedRecord());        // There is also much logic inside Sheet that (if buggy) might also cause the discrepancy        try {            wb.getBytes();            throw new AssertionFailedError("Identified bug 45066 a");        } catch (IllegalStateException e) {            // Expected badly behaved sheet record to cause exception            assertTrue(e.getMessage().startsWith("Actual serialized sheet size"));        }    }        /**     * Checks that us and HSSFName play nicely with named ranges     *  that point to deleted sheets     */    public void testNamesToDeleteSheets() throws Exception {        HSSFWorkbook b = openSample("30978-deleted.xls");        assertEquals(3, b.getNumberOfNames());                // Sheet 2 is deleted        assertEquals("Sheet1", b.getSheetName(0));        assertEquals("Sheet3", b.getSheetName(1));                Area3DPtg ptg;        NameRecord nr;        HSSFName n;                /* ======= Name pointing to deleted sheet ====== */                // First at low level        nr = b.getWorkbook().getNameRecord(0);        assertEquals("On2", nr.getNameText());        assertEquals(0, nr.getSheetNumber());        assertEquals(1, nr.getExternSheetNumber());        assertEquals(1, nr.getNameDefinition().length);                ptg = (Area3DPtg)nr.getNameDefinition()[0];        assertEquals(1, ptg.getExternSheetIndex());        assertEquals(0, ptg.getFirstColumn());        assertEquals(0, ptg.getFirstRow());        assertEquals(0, ptg.getLastColumn());        assertEquals(2, ptg.getLastRow());                // Now at high level        n = b.getNameAt(0);        assertEquals("On2", n.getNameName());        assertEquals("", n.getSheetName());        assertEquals("#REF!$A$1:$A$3", n.getReference());                        /* ======= Name pointing to 1st sheet ====== */                // First at low level        nr = b.getWorkbook().getNameRecord(1);        assertEquals("OnOne", nr.getNameText());        assertEquals(0, nr.getSheetNumber());        assertEquals(0, nr.getExternSheetNumber());        assertEquals(1, nr.getNameDefinition().length);                ptg = (Area3DPtg)nr.getNameDefinition()[0];        assertEquals(0, ptg.getExternSheetIndex());        assertEquals(0, ptg.getFirstColumn());        assertEquals(2, ptg.getFirstRow());        assertEquals(0, ptg.getLastColumn());        assertEquals(3, ptg.getLastRow());                // Now at high level        n = b.getNameAt(1);        assertEquals("OnOne", n.getNameName());        assertEquals("Sheet1", n.getSheetName());        assertEquals("Sheet1!$A$3:$A$4", n.getReference());                        /* ======= Name pointing to 3rd sheet ====== */                // First at low level        nr = b.getWorkbook().getNameRecord(2);        assertEquals("OnSheet3", nr.getNameText());        assertEquals(0, nr.getSheetNumber());        assertEquals(2, nr.getExternSheetNumber());        assertEquals(1, nr.getNameDefinition().length);                ptg = (Area3DPtg)nr.getNameDefinition()[0];        assertEquals(2, ptg.getExternSheetIndex());        assertEquals(0, ptg.getFirstColumn());        assertEquals(0, ptg.getFirstRow());        assertEquals(0, ptg.getLastColumn());        assertEquals(1, ptg.getLastRow());                // Now at high level        n = b.getNameAt(2);        assertEquals("OnSheet3", n.getNameName());        assertEquals("Sheet3", n.getSheetName());        assertEquals("Sheet3!$A$1:$A$2", n.getReference());    }        /**     * result returned by getRecordSize() differs from result returned by serialize()     */    private static final class BadlyBehavedRecord extends Record {        public BadlyBehavedRecord() {            //         }        public short getSid() {            return 0x777;        }        public int serialize(int offset, byte[] data) {            return 4;        }        public int getRecordSize() {            return 8;        }    }        /**     * The sample file provided with bug 45582 seems to have one extra byte after the EOFRecord     */    public void testExtraDataAfterEOFRecord() {        try {            HSSFTestDataSamples.openSampleWorkbook("ex45582-22397.xls");        } catch (RecordFormatException e) {            if (e.getCause() instanceof LittleEndian.BufferUnderrunException) {                throw new AssertionFailedError("Identified bug 45582");            }        }    }        /**     * Test to make sure that NameRecord.getSheetNumber() is interpreted as a     * 1-based sheet tab index (not a 1-based extern sheet index)     */    public void testFindBuiltInNameRecord() {        // testRRaC has multiple (3) built-in name records        // The second print titles name record has getSheetNumber()==4        HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("testRRaC.xls");        NameRecord nr;        assertEquals(3, wb.getWorkbook().getNumNames());        nr = wb.getWorkbook().getNameRecord(2);        // TODO - render full row and full column refs properly        assertEquals("Sheet2!$A$1:$IV$1", nr.getAreaReference(wb)); // 1:1                try {            wb.setRepeatingRowsAndColumns(3, 4, 5, 8, 11);        } catch (RuntimeException e) {            if (e.getMessage().equals("Builtin (7) already exists for sheet (4)")) {                // there was a problem in the code which locates the existing print titles name record                 throw new RuntimeException("Identified bug 45720b");            }            throw e;        }        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);        assertEquals(3, wb.getWorkbook().getNumNames());        nr = wb.getWorkbook().getNameRecord(2);        assertEquals("Sheet2!E:F,Sheet2!$A$9:$IV$12", nr.getAreaReference(wb)); // E:F,9:12    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?