From 9147f07e308e6aabec08548336e9a02598bc5cf9 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Sat, 28 Jun 2008 18:21:21 +0000 Subject: [PATCH] Avoid spurious missing lines with the MissingRecordAware event code, and odd files that contain RowRecords in the middle of the cell Records. git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@672562 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/changes.xml | 1 + src/documentation/content/xdocs/status.xml | 1 + .../MissingRecordAwareHSSFListener.java | 68 +++++++++------- .../org/apache/poi/hssf/data/MRExtraLines.xls | Bin 0 -> 25088 bytes .../TestMissingRecordAwareHSSFListener.java | 77 ++++++++++++++++-- 5 files changed, 112 insertions(+), 35 deletions(-) create mode 100644 src/testcases/org/apache/poi/hssf/data/MRExtraLines.xls diff --git a/src/documentation/content/xdocs/changes.xml b/src/documentation/content/xdocs/changes.xml index 3789216d2d..d8e6c421d7 100644 --- a/src/documentation/content/xdocs/changes.xml +++ b/src/documentation/content/xdocs/changes.xml @@ -37,6 +37,7 @@ + Avoid spurious missing lines with the MissingRecordAware event code, and odd files that contain RowRecords in the middle of the cell Records. Support for parsing formulas during EventUserModel processing, via the new EventWorkbookBuilder diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index a226686c0d..93a290c0b0 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + Avoid spurious missing lines with the MissingRecordAware event code, and odd files that contain RowRecords in the middle of the cell Records. Support for parsing formulas during EventUserModel processing, via the new EventWorkbookBuilder diff --git a/src/java/org/apache/poi/hssf/eventusermodel/MissingRecordAwareHSSFListener.java b/src/java/org/apache/poi/hssf/eventusermodel/MissingRecordAwareHSSFListener.java index a727d064b9..0bdcb1d3d9 100644 --- a/src/java/org/apache/poi/hssf/eventusermodel/MissingRecordAwareHSSFListener.java +++ b/src/java/org/apache/poi/hssf/eventusermodel/MissingRecordAwareHSSFListener.java @@ -46,8 +46,14 @@ import org.apache.poi.hssf.record.RowRecord; */ public class MissingRecordAwareHSSFListener implements HSSFListener { private HSSFListener childListener; - private int lastSeenRow = -1; - private int lastSeenColumn = -1; + + // Need to have different counters for cell rows and + // row rows, as you sometimes get a RowRecord in the + // middle of some cells, and that'd break everything + private int lastRowRow = -1; + + private int lastCellRow = -1; + private int lastCellColumn = -1; /** * Constructs a new MissingRecordAwareHSSFListener, which @@ -71,14 +77,16 @@ public class MissingRecordAwareHSSFListener implements HSSFListener { if (bof.getType() == bof.TYPE_WORKBOOK) { // Reset the row and column counts - new workbook - lastSeenRow = -1; - lastSeenColumn = -1; + lastRowRow = -1; + lastCellRow = -1; + lastCellColumn = -1; //System.out.println("Encountered workbook"); } else if (bof.getType() == bof.TYPE_WORKSHEET) { // Reset the row and column counts - new sheet - lastSeenRow = -1; - lastSeenColumn = -1; + lastRowRow = -1; + lastCellRow = -1; + lastCellColumn = -1; //System.out.println("Encountered sheet reference"); } break; @@ -92,15 +100,15 @@ public class MissingRecordAwareHSSFListener implements HSSFListener { // + rowrec.getFirstCol() + " last column at " + rowrec.getLastCol()); // If there's a jump in rows, fire off missing row records - if(lastSeenRow+1 < rowrec.getRowNumber()) { - for(int i=(lastSeenRow+1); i -1) { + for(int i=lastCellRow; i;EE6+> z%hH5SC(sPo1zK>MA(Rej0wF;2n34qYN0RA?w9|$#1n7_sP?C1iK+|cH32cAAbG~o) ze)oH5*9k39KFvM4-}%lx=iGD8J@+a7{ol2|^1zoC{>V7bW>aV0DK(o$3!g%sNuCyC z)*!?8cS@y_B8@@z!{>cufw!USd1$;kq1cETprM79lN0$|5a6YC~Fzv@k4*iZRP{=85I+-Wi;K(w{2n(q!MfEy^WZUl#nLF2%@7*%v_Nw) ze|_)KJv;NyeK(c+@#-yG@VlKzIvk#BAbs5IGrL8PeTu9B&Nk^3{npo^nxfRO`AVg1 zFjtu)WAP-usbxMoPos!~$DJeEjL6I_jjy+sWQ>J$c3ImGd z)=yzv3|ifl!cjAsM;c>fGDQkrIF*#<1Re_wqfF@*k%G?Bkm?r?rZ+FDUx3JsQM>KI zwxw&9F74cOUAv!MRDU-58b)s)vFRgM7WRD9CRl_C0)}>`?tUU1n`U^2# zMJTWZK> z9iH7hiaricu2J+KWPHkGSv`HyYG=-A#STw;`1;R?{loZ2V(@Jz3{eZu&^h~e|482pnl_;1AEKNW-jS`5Bc zeg0bbaP1SckNOGMK!X3{*4BHc-#gvZ-y`%~6DfXVAk$A4bgufF{xPB9S+5gp_n|%ED%?@O-BvXC3?h|^&qxy>HTF}F1kwx_# zyd#%uMWHX-NBy7cMvu?+$YOb@e7L?8d|A)Wi`}@M6g+8}|9wKw z^{Fpc?XT_9fKglUj{WDw;JFSKdZ%7hU~X{_Jp%36hEkBn^?uV!K< zkPa6hNlgVf4%JkEi>8_iaOF}{0lG*{1=!{_6<{Z-sQ??LrULACH5Figuc-h7TulYo zQ)?=~P*76=_TiceFc{ZVV0EnpxZPQk1nzUxRDc^>H5J%YYk>;`1=#=WAdoti>35<= z7f9;LQNt~e&UoR39h39&ES@lv?rNBn`jVOSRKujZC&~(gHqNgFagZX9?=&_pJY~ZEfK?0nLBO=fGFLnOaWe|km&0qQ z7PLDX$qs6?yN}b}7!`8cP^uEQ@e*!ipGkb&;zYf|B%~c}TxSX+wszqN%31D|OeP1D znegbS!UQi-)p3Kr+k2K)!$gn3;%&mkT}6{vn{eV8&xEIAQ!<$xOlHEPv2;3e87$xK#M!$gmaaux;`b7$-!hMO9D*r5^WQk$%*uAoW)^r z*WI~1+n((o9xfc1=sKR+W{%Tz-jk|dR65OcW1oMy$(nYgew=s?8$IvT6-ElT3!3T+ zBQL)8W~qUB_880pmUC}{Vp?4>-C;3p31V~&B4Qc}BX7O@QnZ-au9%*%m=y_Pbd@4v z8Ve&odGqCHF>_ooy8_Y{VKLnaVsu(7wP`Mly#3=BqQ%UknBHVhTMRM1Re0Lu;8!PKjTSTC6%*lU zOB2M{o;Er7`q#c1EoOl$Cc@LsNf2Xu+T`H#uRawm<_uR%gr}`e5Mz7Vqs1(8#YA}8$^j(Emi&^Z7 ziSV>F31Vzd>+X5{f$v0%$+}`9JgqZ9jO}UNJtv;^BDC8!OI$G#p4OWn#`d)Co?kwF zXH;!wm^Mx$%j0IhGj5(;YKk2zjk)61uSYXoT44&0a+xl1nA%>1qnI7rqM0tMFoplP zOqV-MZJ#mb{=fO{Xr{|6OyMmq({mlBwucx~-1FIJrYkB;;TtZ~c896$55`>ng>OeQ zJ*UDHp5QX=a+un!Z_Iz)b8!^Y3~o4L5k4@q=Xhpgu;o){mg>v^wj1}9N8ko-ieQJ3 zvm@rYjp#*^7Tkrv9)5mkZ1~97(8TD$1IIJB1{tR3m8KiL$i&NLV_;pm+}0#B2{Pq& zmM?(YOCq2VH$M51`xz;i!G6mG-kJk%C(^TUy91{Y`5Owu`?C4M*x2#REskFEOVgm& z4VVlL;~HQV`2w^XL$xbfaVttDg?1145P|?V4gEXjeM4jkp_Kq0O3)U?lh`i%6OFVm->NaLUw|GAMHdcW}mK z?mO(=wWO4eViQVqI3=1&GeRYTvQ9VW@gD9)M-Pn+9T=K8IDS)hXW{6?@ysPbR_V2+ z7F_W>imQBV`vcPcyn1;PY`zof9ECq{^U801Hn!(p&8Qo;XD&H-5RSSj$TzjHRBtYU z(GEJU${lf^7liq|X5v;FRuEeYLwiOK?9F1W;3!(x0?TfNLiGJnD7qI4>KZ{@03BxW zrN@*VU9kz8X&^k2o{2?<#T>EEW!@UWT;pF1^HSf#PyZ7tLgqa-bHqTG`RoYh8V6&T z>(n4E%zJI-h=oo-sGAePobgawtjRXZiS#tH77b}GJ#gp0M&cY6eTxgDN9F4u+0%Cmk7*~((|G+Z>p@^|~e@%=+%S$JVE5Exw8%>?*l;kSHF zq?^q~cD3yXCkn?iyMyA>)6mr@eggI3HYFEKQVZ;H`_Yj5)0G&lZ+2t6IFuMqQv-Nha)7+eGHLPSLqee*TZH(wKdV-(y}Y=GI91yyKh zKpXBroyW_225PLC<^pz_9ffgjJJ8U&PSEw7O^>=Wgaw;R-L77|Ik2(8R`Uax+RA^UZ@1zu>kM3x z9~wWvSgCQnFQ{mGI);dAAYmLG+7Fje@tm^dq+48}b`r$x(Bo_+N#BU3V{r?+L`{b>@1xNqrmcl|IJUgwB7}j*GW!>)+Ww za8>7RsO;O@iEcDk-B2h@bQAN59TukNzRUu1pQW63ESle#2XR&XLF*gK-GSbc!p+V{ z@kapY*7ftf!x6m-U%3#!K>o1AOy^ApkEf;CCbG{WEilidGDybkeLZDC<6beXPGrW>YYnndU_U9U_x2AQtqYf#f9 zLW?POdb_$dDATUaB(6AIor2P0i&L$x?oN+w7d(sZw63h-;^@yV1J5hF;D=ER!k=9R zJ)Q<=Nnx-)s6qI%%fNG@E*MxCYzQ(4e|8yo4$}pHjbae~>@x72qYJ(%3^oQe2!D1N zc#hBoKa64!{%kQojNZ5*Tb78MNPKk&HUc}O7io_XHyw7D^JFB0Qy4&}>e&U}Io!y%Ft z3jOa5DE=>h*nXJhF-l6%>{#P}oo&pP^RKgtbqpWAQ9q`5wuxkYTw>+#K@h*kQhMOE zl(`?c`z;)0-T~Yl7LLq$uTB46sU`6DO4HLkJJe?he*G<$^gkIi=BL~E_lo=rpBaFA zaAB4CRvAoMVCY|c?#+MLwtGk4F2S!7{Az)}FPI`{ao)2WvlEP<=2m=prhYE+rz3qr zs6Q!iMVb1IzH_Yn%5wf^edk*F2e9`;jw$)6H?)L4uk=-ZpTy+xWJL{+qVkJc>2o!- z$e3f|I>x-%p69Gi-YMb5#)0yC8k8?K_Ltx5VA&TNbLIEx7zbZ$s=VVAGPSHZr()8) znWtl-{&i<2jrAv==h|w3SQ8i;6Ce7IbmEXyD?|??Sja5jgs%TbBOn;utbq9Q&_} zWB+n-JeziLJezfKJezcJyw2g`c%8w;@i^bbVN?v@-j=w4O(v7Ym#>?908`jI6SzLN zz)(;2i9C|($$mM2{DK_yRDD!8)mAn4^fx)spc)BKDV2j=FRh(olHpuW&orduMO)gF zQImRJDtca;qYg2!xRqZO8p+2&k0yps9RD(2?aA1Yhkj~LEC58$yy%$|J=Y7=R?{|B zYpAsqs#n-h@hhe51%$-`fmX>4nI7LMU;QC#V#e~` zxV&A;ZUxWI!oj9-@@h}c0rN5gr#(;e+I>L$Q=^%VM>>Dd@klLT_t}j2l@0Z)(yO1# zNMtS|WidP|Y5cTcQOBm7=bxOH=6S#^_MGY2Q^q5EbkMv;zql9}_BxG$9(`y;3-gb} zs69DX&SR61dalCyZH~zyZ(AmuH(nh%r_Rg&sbSd`uWU?oD#t68%ei-+=W1e~R?j}& z(vI48E2WLppLMpNZG>QfQVQ*;u6e~Py^f(eW7L>qL&fW?(ww!F0w5sQ9 zPtTaRZF_!|Q8x$9Tct*)3RO?8QS$PCg4i$SczX7UJ#{{yb&QMKYBz0b+qRm|iiX;= zByJbQ^NTsbYroTYuCZD$-dDx=ahvO=JoHn0@-OrUkdK*H*q$Gb7;zXaW%m*7DPDiE z<`|K9wI|ndd2Ds7o~L_yX2hOGYOT=rKsY7ntAVz!s?C$5lhOpC>dEzGUUo{@?(;l7 zFA+Txdt&io)}k6%?zx~pg}my?HE&-2Zx!{N@9DW#^z0OSYH!v4t`Xa=uWjvcUQ21u zRWDU|zHrtRqRy-1^4(rc<2pRg-8G3z3sg^xL|jK~6^n&nxc|oWeVa0l+mv{{TN`0mrFp4_j^`m-~C8`U+lGePU5FVIi1g} zl!(_R(4P0IwZl+tsPqyWi#e7p>blII(*k33l($!8c77A$=ksQZc^CuISo&d;^m74j z6(oJ<-gXue?R`n^?Gcxk|7*y$%6c{!l-N8dS_?E5ELwX%nva|d=fK&bR1QUpr=7R? zJ9*lm(L4oiSk2;3D!$BZ6q6&sgE7S1j#HQ01E&oG@V;68xlu|8jd>)s&@{KT$b`;4 zKpM=wgawdr_NddDtVw%J^#H2HIdmG#)n(2yb)eC5kdyWbd%qfR7e|kzxVc;Pk<{MI ze6!c84|XznC!lUi(qWPwXZZ4G?f6X}BCSa!A0my&^ST@&`T5Er(i_$x(i?qxh{S*L z#-DnaEmi7~=O6q0-)75Hhe#LTL{T3-L^5eT*LkMjO+Tfu7953~P&EWlvOSj)i7|EdZBGFfNB5_CRdL-`H z9!26F<0p~0r*bC}CB2G5oGY?y7Rk+X0Nyq_Jbv)-!I6pVMMsAVVo9@Ddf$x1oezVY$j zJ$3y)=p|EFv+yro4&jpbZu7C4tIPkuY)8au81Qs#yc)tPX=;^UCEKdW-p}&?2ly?x A^8f$< literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hssf/eventusermodel/TestMissingRecordAwareHSSFListener.java b/src/testcases/org/apache/poi/hssf/eventusermodel/TestMissingRecordAwareHSSFListener.java index 16a406cba1..bbad7b7f48 100644 --- a/src/testcases/org/apache/poi/hssf/eventusermodel/TestMissingRecordAwareHSSFListener.java +++ b/src/testcases/org/apache/poi/hssf/eventusermodel/TestMissingRecordAwareHSSFListener.java @@ -16,8 +16,6 @@ ==================================================================== */ package org.apache.poi.hssf.eventusermodel; -import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; @@ -29,6 +27,7 @@ import org.apache.poi.hssf.HSSFTestDataSamples; import org.apache.poi.hssf.eventusermodel.dummyrecord.LastCellOfRowDummyRecord; import org.apache.poi.hssf.eventusermodel.dummyrecord.MissingCellDummyRecord; import org.apache.poi.hssf.eventusermodel.dummyrecord.MissingRowDummyRecord; +import org.apache.poi.hssf.record.BOFRecord; import org.apache.poi.hssf.record.LabelSSTRecord; import org.apache.poi.hssf.record.Record; import org.apache.poi.hssf.record.RowRecord; @@ -40,8 +39,7 @@ public final class TestMissingRecordAwareHSSFListener extends TestCase { private Record[] r; - public void setUp() { - + public void openNormal() { HSSFRequest req = new HSSFRequest(); MockHSSFListener mockListen = new MockHSSFListener(); MissingRecordAwareHSSFListener listener = new MissingRecordAwareHSSFListener(mockListen); @@ -55,10 +53,31 @@ public final class TestMissingRecordAwareHSSFListener extends TestCase { } catch (IOException e) { throw new RuntimeException(e); } + r = mockListen.getRecords(); + assertTrue(r.length > 100); + } + public void openAlt() { + HSSFRequest req = new HSSFRequest(); + MockHSSFListener mockListen = new MockHSSFListener(); + MissingRecordAwareHSSFListener listener = new MissingRecordAwareHSSFListener(mockListen); + req.addListenerForAllRecords(listener); + + HSSFEventFactory factory = new HSSFEventFactory(); + try { + InputStream is = HSSFTestDataSamples.openSampleFileStream("MRExtraLines.xls"); + POIFSFileSystem fs = new POIFSFileSystem(is); + factory.processWorkbookEvents(req, fs); + } catch (IOException e) { + throw new RuntimeException(e); + } + + r = mockListen.getRecords(); + assertTrue(r.length > 100); } public void testMissingRowRecords() throws Exception { + openNormal(); // We have rows 0, 1, 2, 20 and 21 int row0 = -1; @@ -108,6 +127,7 @@ public final class TestMissingRecordAwareHSSFListener extends TestCase { } public void testEndOfRowRecords() throws Exception { + openNormal(); // Find the cell at 0,0 int cell00 = -1; @@ -194,7 +214,7 @@ public final class TestMissingRecordAwareHSSFListener extends TestCase { assertTrue(r[cell00+57] instanceof LastCellOfRowDummyRecord); // Check the numbers of the last seen columns - LastCellOfRowDummyRecord[] lrs = new LastCellOfRowDummyRecord[23]; + LastCellOfRowDummyRecord[] lrs = new LastCellOfRowDummyRecord[24]; int lrscount = 0; for(int i=0; i