From fb38bcb821f8856efe35da24b561d58300e8c7fa Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Mon, 16 Jun 2008 13:46:05 +0000 Subject: [PATCH] Merged revisions 638786-638802,638805-638811,638813-638814,638816-639230,639233-639241,639243-639253,639255-639486,639488-639601,639603-639835,639837-639917,639919-640056,640058-640710,640712-641156,641158-641184,641186-641795,641797-641798,641800-641933,641935-641963,641965-641966,641968-641995,641997-642230,642232-642562,642564-642565,642568-642570,642572-642573,642576-642736,642739-642877,642879,642881-642890,642892-642903,642905-642945,642947-643624,643626-643653,643655-643669,643671,643673-643830,643832-643833,643835-644342,644344-644472,644474-644508,644510-645347,645349-645351,645353-645559,645561-645565,645568-645951,645953-646193,646195-646311,646313-646404,646406-646665,646667-646853,646855-646869,646871-647151,647153-647185,647187-647277,647279-647566,647568-647573,647575,647578-647711,647714-647737,647739-647823,647825-648155,648157-648202,648204-648273,648275,648277-648302,648304-648333,648335-648588,648590-648622,648625-648673,648675-649141,649144,649146-649556,649558-649795,649799,649801-649910,649912-649913,649915-650128,650131-650132,650134-650137,650140-650914,650916-651991,651993-652284,652286-652287,652289,652291,652293-652297,652299-652328,652330-652425,652427-652445,652447-652560,652562-652933,652935,652937-652993,652995-653116,653118-653124,653126-653483,653487-653519,653522-653550,653552-653607,653609-653667,653669-653674,653676-653814,653817-653830,653832-653891,653893-653944,653946-654055,654057-654355,654357-654365,654367-654648,654651-655215,655217-655277,655279-655281,655283-655911,655913-656212,656214,656216-656251,656253-656698,656700-656756,656758-656892,656894-657135,657137-657165,657168-657179,657181-657354,657356-657357,657359-657701,657703-657874,657876-658032,658034-658284,658286,658288-658301,658303-658307,658309-658321,658323-658335,658337-658348,658351,658353-658832,658834-658983,658985,658987-659066,659068-659402,659404-659428,659430-659451,659453-659454,659456-659461,659463-659477,659479-659524,659526-659571,659574,659576-660255,660257-660262,660264-660279,660281-660343,660345-660473,660475-660827,660829-660833,660835-660888,660890-663321,663323-663435,663437-663764,663766-663854,663856-664219,664221-664489,664494-664514,664516-668013,668015-668142,668144-668156 via svnmerge from https://svn.apache.org:443/repos/asf/poi/trunk ........ r668153 | nick | 2008-06-16 14:20:42 +0100 (Mon, 16 Jun 2008) | 1 line Slight tweak for named ranges pointing at deleted sheets, related to bug #30978 ........ r668155 | nick | 2008-06-16 14:39:44 +0100 (Mon, 16 Jun 2008) | 1 line Make the test related to bug #30978, which shows that named ranges pointing to deleted sheets is ok, more complete ........ git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@668157 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/poi/hssf/model/Workbook.java | 3 + .../poi/hssf/record/formula/Area3DPtg.java | 9 +- .../apache/poi/hssf/data/30978-deleted.xls | Bin 0 -> 13824 bytes .../poi/hssf/usermodel/TestHSSFWorkbook.java | 87 ++++++++++++++++++ 4 files changed, 98 insertions(+), 1 deletion(-) create mode 100755 src/testcases/org/apache/poi/hssf/data/30978-deleted.xls diff --git a/src/java/org/apache/poi/hssf/model/Workbook.java b/src/java/org/apache/poi/hssf/model/Workbook.java index d87fc2c63..5b38935f4 100644 --- a/src/java/org/apache/poi/hssf/model/Workbook.java +++ b/src/java/org/apache/poi/hssf/model/Workbook.java @@ -603,6 +603,9 @@ public class Workbook implements Model boundsheets.remove(sheetnum); fixTabIdRecord(); } + + // If we decide that we need to fix up + // NameRecords, do it here } /** diff --git a/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java b/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java index dab9cf3ce..2804e37c3 100644 --- a/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java @@ -269,7 +269,14 @@ public class Area3DPtg extends OperandPtg implements AreaI { StringBuffer retval = new StringBuffer(); String sheetName = Ref3DPtg.getSheetName(book, field_1_index_extern_sheet); if(sheetName != null) { - SheetNameFormatter.appendFormat(retval, sheetName); + if(sheetName.length() == 0) { + // What excel does if sheet has been deleted + sheetName = "#REF"; + retval.append(sheetName); + } else { + // Normal + SheetNameFormatter.appendFormat(retval, sheetName); + } retval.append( '!' ); } diff --git a/src/testcases/org/apache/poi/hssf/data/30978-deleted.xls b/src/testcases/org/apache/poi/hssf/data/30978-deleted.xls new file mode 100755 index 0000000000000000000000000000000000000000..0a2cabedce3dfb631901b16c51d152bb8db25d7d GIT binary patch literal 13824 zcmeHOU2IfE6#njZx82f0w=F*f!@Ai<3+)y`B$70xTO&pju>@iuiYcXCr0Jj8t`UDC ztH2v37#@5fQR0h)1R)xIG1@-K3xSvrqEE$`_-HhmNK#q9@7%raZlzF7h@vyinV&Of z=A8Lv=H7c|wwEt8&YU{G>Kf*REvUkcLM^Jx_#X2sgK`Y4FBDV^(iY~)a^WsQpf<{h ztd5{Laj|B4irFgQ8bUZ1o@NYuOWK1Muo&na8XF!Tp3G$jaueCa9S)C}4FjHRnBv0g z_QLSECQp*TgsV{eCX1Ub{?H^pv$&fzGhQ4|b{)EZGh2bQJCruLw=7Otyo9lbPp!>2 z#@T>XxIp>Bq2p=>oQin8$YK}+7{#5feUIvHt~VZT0cQwEzMpJOwYIMB+S3_i&gDwhaWDB_h8b9yncO=!n@pkK<{6J|+&r*BKC zSgcKUCRx|tneOk5hf`RKHZ?4X?J3KPUm@R(6gF2Xq5*Ss`J9rvo}QAzhtPos$`l5z zi~576rnb~>21_;P_@$7r)Q_eT;%hk=|L36U)_kqco5|0|SFbmd|1a}BBs9EY2=MIi zarkvEf9*W{)I9w5dHA(|;-3hG5zAKU7C*+_SzHUD4#aWAEnZb!PzCgj zKiH*3rv(EF+^Zx~A<#FT>5_ooV+)cJiB^c1VH>;DiT^;G_M(_(Hu<@SS#J9v6xdG` zgVANAfCnrqWUD#TqW^84sbs@{Npv7?sSP{_(4A z`?mM=8^7K79TvZ7oP3#C_i;-2Si~EwnGQ>rOge1RM=U;N!!8(%9&HFr24;FF%AoXV z%5q$xCB{*oJ|NK$Uw@Y8OjxD?;`xA8@&vO-TLQUie@<+CD}cNv^D>^9twpP_UKvY$ z`8t79R}G}zv`XrPrF?JtDi+~Yme!z^>t;)+37@b8q%HQN)s(GL2htp}u72R+ir`^# z=ARRPOxBFiOC0z=Hy?o&Ga3U7e5!oals+r5O4@M1RMem0f&G?z#-rea0oaA90LD)1a9U3 zhpt?_a&p~0u@mpm|4&^%EB`-C$G?`T{QvDF-E8b8@dAWbJ%DbXMoIGRb0qowuaTCM zj*xU7aEzq$foW3td4SFm6y&=%wAEQ(DhD@ObJIALsEy7e{2RDZb|bGzbcx10GPAdD z+`kG#eX)@a8r0#giR{RvuJ0yIuk2Bk?0jlqEHjkYF);porc_D33l0H?fJ49`;1F;K zI0PI54grUNL%<>65V+eAkRLCfS3b9V=?F=lvwUj(Ux$2s{m@XZvV3;=#rhGY{C?Fp zGS!{G{QThOnez2@9-#W)NJ?G!cOtL@6a32|fvp&4n#IeUxrK-2hlo|%jhK$X?U$bZP-x$9Qy*U2g0X(fd_W%F@ literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java index b9873fa4b..37359231f 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java @@ -30,6 +30,7 @@ import org.apache.poi.hssf.model.Sheet; import org.apache.poi.hssf.record.NameRecord; import org.apache.poi.hssf.record.Record; import org.apache.poi.hssf.record.RecordInputStream; +import org.apache.poi.hssf.record.formula.Area3DPtg; import org.apache.poi.util.TempFile; /** * @@ -402,6 +403,92 @@ public final class TestHSSFWorkbook extends TestCase { 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.getIndexToSheet()); + assertEquals(1, nr.getExternSheetNumber()); + assertEquals(1, nr.getNameDefinition().size()); + + ptg = (Area3DPtg)nr.getNameDefinition().get(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.getIndexToSheet()); + assertEquals(0, nr.getExternSheetNumber()); + assertEquals(1, nr.getNameDefinition().size()); + + ptg = (Area3DPtg)nr.getNameDefinition().get(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.getIndexToSheet()); + assertEquals(2, nr.getExternSheetNumber()); + assertEquals(1, nr.getNameDefinition().size()); + + ptg = (Area3DPtg)nr.getNameDefinition().get(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() */