From 117e95f06340652c3152025f15ea105ee0cb7336 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Mon, 31 Mar 2008 22:30:56 +0000 Subject: [PATCH] XSSF named range support git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@643189 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/xssf/usermodel/XSSFName.java | 73 ++++++++++++++ .../poi/xssf/usermodel/XSSFWorkbook.java | 57 +++++++---- .../poi/xssf/usermodel/TestXSSFWorkbook.java | 90 +++++++++++++++++- .../apache/poi/hssf/data/WithVariousData.xlsx | Bin 0 -> 10603 bytes 4 files changed, 203 insertions(+), 17 deletions(-) create mode 100644 src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFName.java create mode 100644 src/testcases/org/apache/poi/hssf/data/WithVariousData.xlsx diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFName.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFName.java new file mode 100644 index 0000000000..5392bfce8d --- /dev/null +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFName.java @@ -0,0 +1,73 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ +package org.apache.poi.xssf.usermodel; + +import org.apache.poi.ss.usermodel.Name; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDefinedName; + +/** + * XSSF Implementation of a Named Range + */ +public class XSSFName implements Name { + private XSSFWorkbook workbook; + private CTDefinedName ctName; + + protected XSSFName(XSSFWorkbook workbook) { + this.workbook = workbook; + this.ctName = CTDefinedName.Factory.newInstance(); + } + protected XSSFName(CTDefinedName name, XSSFWorkbook workbook) { + this.workbook = workbook; + this.ctName = name; + } + + /** + * Returns the underlying named range object + */ + protected CTDefinedName getCTName() { + return ctName; + } + + public String getNameName() { + return ctName.getName(); + } + public void setNameName(String nameName) { + ctName.setName(nameName); + } + + public String getReference() { + return ctName.getStringValue(); + } + public void setReference(String ref) { + ctName.setStringValue(ref); + } + + public String getSheetName() { + long sheetId = ctName.getLocalSheetId(); + if(sheetId >= 0) { + return workbook.getSheetName((int)sheetId); + } + return null; + } + + public String getComment() { + return ctName.getComment(); + } + public void setComment(String comment) { + ctName.setComment(comment); + } +} diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java index 59e4e26b99..05479d9b74 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java @@ -58,6 +58,8 @@ import org.openxml4j.opc.PackagingURIHelper; import org.openxml4j.opc.TargetMode; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBookView; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBookViews; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDefinedName; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDefinedNames; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDialogsheet; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook; @@ -188,6 +190,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook { private CTWorkbook workbook; private List sheets = new LinkedList(); + private List namedRanges = new LinkedList(); private SharedStringSource sharedStringSource; private StylesSource stylesSource; @@ -247,6 +250,13 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook { } catch (InvalidFormatException e) { throw new IOException(e.toString()); } + + // Process the named ranges + if(workbook.getDefinedNames() != null) { + for(CTDefinedName ctName : workbook.getDefinedNames().getDefinedNameArray()) { + namedRanges.add(new XSSFName(ctName, this)); + } + } } protected CTWorkbook getWorkbook() { @@ -324,9 +334,10 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook { return null; } - public Name createName() { - // TODO Auto-generated method stub - return null; + public XSSFName createName() { + XSSFName name = new XSSFName(this); + namedRanges.add(name); + return name; } public Sheet createSheet() { @@ -430,19 +441,19 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook { return null; } - public Name getNameAt(int index) { - // TODO Auto-generated method stub - return null; - } - - public int getNameIndex(String name) { - // TODO Auto-generated method stub - return 0; + public XSSFName getNameAt(int index) { + return namedRanges.get(index); } - public String getNameName(int index) { - // TODO Auto-generated method stub - return null; + return getNameAt(index).getNameName(); + } + public int getNameIndex(String name) { + for(int i=0; i 0) { + CTDefinedNames names = CTDefinedNames.Factory.newInstance(); + CTDefinedName[] nr = new CTDefinedName[namedRanges.size()]; + for(int i=0; iLApypx{+?_5Cj>z1!<7(4gnDm?&vw+ z^&F1(uJ7-Azu#IjznL|&pP9AaXTST|d%sFxBxFJWDgYe-0MG&!LVL6#5C8yQQ~=;E zU4wdq{HTJV@;Difxz?zfC&Hof3E*i9vFDmuh7nc_x}D7?(1?U z2QB(QrBNy-iY$UPq{wEQQii%U7d@Yk475aVqKiSe+GNj0h6aZA6}m>fUdw157M96P zbKI*ykE{WuKI@w&`FJE0!GWG5X^WG)3+Ty@-6=U*UIg4P=1r=4i2SwnaUV9OUzm&j z=HRCbapa4g=btg&5kFYWfi1oQTOlUlg%AWly2|NWtx!g^&kyM^mzOTn(8L2S+>-F9 zBB*xSVgyXu-f4sJWgjn)oksA~_2(tLDg8{?5wEJx2gJOI#cQWU+l2%T1t=vU1kx#5 z4hKU~!IixdCpC;{mZL(e?z&cbrVOeYwNc5gQ?TJZoq9%rok{A6x9oeMEd>>H8?reY zu;^&&i=F7v(id31pBzzGT#+$^&G|hhx*%BUXSy%(p{Jy$6NgSbug-O-YBn3bGd{V{ zTf-31d}}hxg;waj-uddd>^^!fYu|7ym~Uz^BZ<$nEx-dSLseJsRg00^7XN%k4b_ld z14B;Vc0$C;_*bK23;^Kf1__|_x2UXr#&Q1?PBnRW&|v|F5cC{Ptex1|emv7;_x&dt z|Ib8WWXwl+1Y&m`$iA0Yz1+5yMbFA>l9z3wRi$dB->0s9nL{u7^(+v{A7nH;a<=hN zL~DM3-9nX`!jN5|y^%?*lFRVLq@{aVrW)=WLpn1H!fvux6b8@d=B@SIbK_DCCoc=D zA|l8d~7@;PozDEI@F606`i%n}{#1zNH2h2XcU zdTxlFJNvqqVWL8$XvSTEe%Cb#Q>>zovxO<*{c-_BU(!bLdoSsXkTMu%v=vWo>i8Y# zz+uC(i(dp6!kt8ScKp~f&5O>PhXj`k0+%4h=LWD&Tva{zvi+0m^BCWm5aAhU3<&@r z1E3?gTeJT`cQ-pnD?>Xws~D7h$qW%&NKJ`BB3Qkv&`KR>R;Xst&>4V(dPx|G|4pcU2V{9iWM)%0J zT%Z#;eS(nsM_1#%hWX5|;{EMQd1({^qK0m)ni_4vo(^kfQ3>VhJ$58R#(0mzw})vS zBx%xj_cDZa(3H2Y@&)%M>Q|As8-qD!c?^0sea8htlEfQJEhlvSp_)X&A#B0knAk5* zW4^DXoKYxZu#!_m& z6>0%dFe_jN>a#q^onAdTTDtg(0u;8t-%y3>cyT8~mq^5?)MH0iuha{O&LLa?LEn2M z=Q-}Xemz#FU!kH^0Bs$!Ay{~_*v1DCD+$coq8rgBdqR+~FMzEzS>-QMx6PfzAx^YL)mBDm--@Z_R%h*V3`q-I%8`~cS{oOxOpeBU~A^c!NC*MbS>R!CnpVV2mZNFCFr zW*-_pNRLH=PA-0i{APfUdtU_s7q%O=ZjNS>wYl6ydN_R;4})7m6)g@mAP=K z5;g!|J=O!>y%w9J+-dY4MNLwytRb-n!+quRt+-m-WC9PYh0nSM;JD^qoe z8h!&`y?^cyTlv5Sf4DwQI@cn1mx3fU+7oT_g$cEgv>BM21ptaszAmBxA>4r zB8GFQ#w?PskvBIzZd?dy0w%+Z?)cUFzKL%tmz!_`zbJ4 zD_x;r1Y}YviPIxIk$6ZxZtC@75Jn!|$(L|=I^wJi6d^8C3yaAPHxE-MqJ|a_0 z9G=Pg?hO(Ok>{Uf4YC7x=A^WdFogySHgZQ`M2#1#M;v;wT>yqfgNa_gPGL0m_X=HR zdnN5}I0&#K&`zq9XwfG7^gj9o1)@58$pMST$MPu8@VVLk_Vi@?TkJ~6$5+(X&R3fw zNA1+CtY%AWuL73a5*NJBHYTZaL^8a;93PRaxodRXT(mQOxVnNq#(QK=I}*X3d3Cni z8&NL&{d-e4@X*FjM(R9TS~6Q}6`k@B-I*)c0myjYp@pa&@2MHe9Y0r$tqe@c#j?ky zCJlESUb;OOJz_%A&75;HrVKR9H^{=Z^?*TsKtfpw#zN z?`n!L>aK0pKzzo91?oPVi{>}n=c0H(5uL=8yKx>DO|ZAGyglU-b>R;dR^FtNqLc?i z9_8L=j3$n7wLtbxPTazN>uO!?M&iQ%VALaoqES{BeE<|lO|YJH^dy6sBK|eSawrjw z_uY~T`5u_|xsniI(8-xquG;bt{W)_!As#F;^6{aVwIncXKx{~{c z7JMDbD#4V){0|L9qMxEGN1nZ72{>@zlQZbc6pJG?F=BiUJc2o5A3dK z5NHt9uSUgqE1b#*O8<$bdTa2{$>5KR{ro!(}1}rrTxtvPwjmQ@{HLS4&;3hr`fPGFG z4x-uAY3+mXXIo9!^THw{Yv=Y*)82KuFVX4HO9(O)Mb*sr3m4yGG^sRXL!xm7dFFnE z7O0oCmgV)fAkLD8gW5kH^tQF4$8P&1Fr!xlo z(x7f8gmUoQxdCzOTy%LL&gIkCY2$Bgsb%tEGYPYw23ax0#q5zvm`Nyx&%;ffCi zMDQ>^xY0x!@KDB_lJ&u1p5UV)z2;$Vef8F=*I3;1nX{{bHw zhC3V$dLb;ET=@jHjPg>$?Dp~bWj6Vrm(v(@ju877clk}_LPs4-o^tmaWAQ=L`t|2A zm;G$>s>s)d%ERTpVX5SicHMA2JMl)GMAGM3H`?H%mprvZ@pm6Mf-@@G_u? z5|7oM5^EGs)jreu8q2ZpW;U&wTVAuhNRe_FfPs1W8WV-~QYk_HBwf5TVP7YK9*mJ3 z$`bnE?t`;X3Ig6So{FNcuDC&X+xaQECasGKU742|ro&9b5CzVKG_sh3W?r=Gt)XrP zE~d2!gVAB*vyV~_r=RV4R140&hzQ>dlS+N|u?jJXsLo$4<*b~!?Qy-PR%HUWu9b0{ zA4wulFzh`oXz>%;mPo~o@)FmjgScIxgg2m;2v&~@!EQs%zKF3AjAn~=wMTv#OIZWU zmD3o_FN>|ytkcl5FG&3&WMIuYt#Re0V6-uq+&|RY8NuypY0y34YMoaEt7d#k7|bv& z*2UlDInLtkzMONpxJlWtoXH7!-RcjTrqT1rh{rc71550!74#GvX+$xUbcCJE)msTRF#XQ=3?i;09lY7T+B^y zyV2d8`Pwe`PDqRErfTV@N@Ne-yy$LmBTH2N;DLQQfSHwZ6O9Qi7SxY#{r0h9tpjse zuxmGlR6vBS+9M~Dk!IaVtwYZ4ar%v+C3~+i^QvHDg%GV5Fe7^<+@spv`cTU!JXlj> z@4@<;SCNLtjE!!;bzcJr%z78D=<4AQ(to(`r{f;|Nc)jWFi-~vUNhFUL{byvxkh~6 z9^JzTDrEfA3>!w9Df+uH8qaU$YfMOB5%o~0o$h+G<@dGH^Nu9!Z)C($7>Hir^dm2v z1H0Lh7kFXu2XVkC9#12G7bmDPCG-BMZx5ZoxoUeWg_=sft7w6W7=o86w^RXt`&2(6 zU9qjEqnd8wTA6d7dlIGEkqA|8t%ZZc9xQ8Pnm+qk+JRyK21ZITS28(LSZHH#2ue?W zO3QZ+cli&docUAudos&KC0P`C$5E~VdG2A^5@mN1^tR4J^Qrlt*9kV+5th8CQjPk^ za@NIYplk-w`0N*2?VXa`cG8GkdEeBLk$csjgG8B_kA@pRv()|@|e_-U#P>y^Cv76<Inxwed{)7Z^+P^xL=C4|&B zS&mjJ%^uSOH7<5!dS4ovQE||q(;poP#SmEC?P@^9OtbKFIK+o ze<1>bsu|4U&1v${luj7Fof}k=96yT(q|iv@7;0M14SDIA0LSE^*+HnRLD4*;4e{i9 zwFK(6>Dzr#{`%{ak$g2qN&PoVcv3Jf^)PEKi5vj}45Cre4=m6U^QxZ5GxFk+;`pPp z_8Gwlr?Elt*S!Yi9#+}Y{bVdX+^gycAXoHIi+=Mo=q0c0Dpzsn#+1-Jo8YCzUz6uG z8(;mca1A*}8P)@mdhNFK-kKg9*d&{s#kx29Hr?ipD`&AO!5na;BlStS0?v}c9$~Mq z!=pa_EmE`jwR`v5C|8Wl!8q~F2qEZ-om8O;GExO<&IBH2lNFK;If7u$z1g<_DW`>UpG-3TjdOe<@zj~?~_;Q$&^qb;n0LScTNPm{F63tsVDb)On`M{x(< zLl#;Xm2xfCdG6})X}xVNZG$r&7dkm~$IqPWNekz@rI&O>grt^> z231v7`b`trwFT~B?BZ6+)NVip+14Q(LC>}zyo&}{vVr^Ln|fA@dtG(wcKp$t)U=O> z#03x?Y%z*}D=9Gq9~Y3xil6nf;%&TN=kI=XDPKczxHhvi#k`==YfO85H6I+~Y3OnZ z^kREQcRmV?z9VPfGfgXfc$B`_^(DQ-V}9nQKqfMMYAr{K+T|+C8ihQ8QY~ih2+6tF z!B{5$a+TiaxBD`oV6T)TJPPpOn+?1e`%!5dI~urI*qS-9yV_Vw{_&cV4gPxfnX=U^ z2c9?et_b=mExX*^7vQ>L*Eh~5Hssa;Ld2aahP72g>Lim}o45{FTb4_ zC`?;$ znQCn|b<0S@V>=H`8KUnW`>}Cl182 z>zZQSsIOUY@0$1@=8j2f5@t0k9}*fRKiZ=rJ!Z1yRY2a8?zaYwg!bo`k@lS(q&L(V zj8XSw?|#{SRqPXibdAhE6>O4zj$U?cTk(Ek;v&O|{~FYF)p->E0AzmAHI>QczM8(b(u1W53KMY(_-x8gYr$Ya)3mXbhGcKFRXaPF^XU$PQ1TYnFnVb9WKp%JJ;eP z;wrfrjk(I+mSdVC%%#5L*3E@hC0IrE9)*$(Y?l^66l$#b5>koh!iBPP%@4X(&{DN~ zP%URnM&5lzb$#r)Yk&Pf6(yuNdK;>uUW9r1>^oC+MitGr*xNl22*!a?E#^T=rN7a9 zm(@#ucumxfY6XM41!s(O1&6}ly)4LYg2tT?{hq&b)Fs(5ao{3_orJ+ESplt&%uJqM zYm?CS`xKS7&pWPXYoa9nO|0`rpW1h<4A?)2_(14yyh=V~T_FEXLmbJmkE+7G*oOiD z;QZ-HXQ;KwPZyS|&RTxv!1H21p$?oUFHhvPj@TO}P9UDa>mj~inXO{Yj(EM=Ia_`Z zxvJ$6ass^fa$_KkD{;_P8rYkx#TYqc;Zd6txYIW#UjO*J=KGX}S$L ze4Ss+lE0Aj9taEx`4P^n)qH93iKTzL-C(%iccR^%*rnbnC}@+~Fz=`)fXtk{>(;a* z$(d#Gnn(JD3=5Ze=4fJUPS0mPM^gg#JZ|QyK3Su%kP}gQckZWx((lbw;?(rj+vB1W zH|KNibEGWC4R>X8!D1@yU*nLThG+^%UTIazKsVCRI%F=yCp}kP6mUhD_$!B)h!F)$ zDNlGnH(}QAXfHDf&_3O1q|Mdts_5qQ&FS%27plKN$9*(i0LGOVuDJVJFZ2@ZY&8v> z`!EBDQL5+x8Cgxipa?336gpB2&=s)?BAbw#=B*_=i}!q(k(w0~<_s`-(+*?bv~Vyq z>cvH^hGR}~C9Q{&%$i6Wh5m{Ik?Gw)dD8(B>gXG{H-v{DQ1K_e9y^V=2Pm<+ zS0?W4=nQ{oSpbb#b{>)X>H&!Oc=9@-%jU&QMbu;bb$oQf!xRzy*bh!xxXVScVZE96E(Vi#= z4Xn}Rl8}XUKS)V5Y5Tm~v5M`>X$`1M2NNwSN9}|Mm1o2sUWWG9a|BTE*iF%VxA>Mc zI(|K1#aTEB9!uvZr&d{Yt`%7V=1wk!Pf#x{3;Z^ar=;a%xZr`z3-9jY{Xst?I~yDL zjN0j^;#yUK{0L%r4G_YSVN>U?nJ`HFkPsOk_Y|#Tw+6#D1{j;LUG7%bq$OECA4ogU z-T!`RP_;kDt`p(zJ5s^{GZb`e241#Z!uPfllUR6hF6PeUNG#`~{w7{f<>XDFV0nLX zWEFjO z@c@}s>Ii72{0`|cV8)!hS(vs=A<*aoIkq6-+iZmiFj@Z0`u>t$?5Sbmm_>W4J`cty zf?s`Q*iVq*a7~2^sIojDfu^ZVrn*7)%X|n$_cYzZR5E=7hTuvzYRrX3^)oVF- zNx76h9&VUd-8n0~JnDpMTy#WR%(4w81-7*ex)19V+u<4KEV;8Q|%8KMG{JQ^993Uf7WJrnu6YWLiE;!#(Sr&?pi|O>aWrC&BVw6g zA9T^AXGGX*`g)jy1S}Vdq6AExCc*+P^*i-Tcb*iF@&QB9MN5l^uy~pXN!2(F z-_*CUkC5Ge&;Q$eg-x)`ifItA)^@ADnYeYMn`fdAG_fZo(5qeVyH(^p!fhYI>c7&zlIghnrsuG;o5}mPv5keAey} z^#1f@R9#BPmOnzO0wML$`MKm#s*X|29nayR^)2U^JPh?UkPRR7qT<@|loNso(gLkK zT-~A)_qadbvh?6U^RSSXUeZ7!VJG`?&$>c1IaX~Wen$Dp3NR*vX zQDCdKMz-pr%Ke_s$y*DcHK#>#(Bo%%>NB0(}<$`0nd`OOeE5{VG*$R<7#IXT>x z)cL&*nr-r-2XtP5C?vFe&zpClBrM^rMc&-#V)tfA-N&UYohGd?`>EJ3^z4>fS-Im+ z77LI+e<5|i zPnF#ozuq>!JZj@7bl`34zss6mwg3PU4FK>Dk#pPp j@2Tmp=H7IFG5<4BDS=Vo5%lBu0WM$_9)u3SAMgGPi9