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 + -
显示快捷键?