From 6cc94cdae8b9b7a3aa886a98de9fdd1857fc402c Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Fri, 23 May 2014 09:18:16 +0000 Subject: [PATCH] Handle date format strings in an iso8601 style format, with a T in them. Fixes bug #54034 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1597038 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/ss/usermodel/DataFormatter.java | 3 +- .../org/apache/poi/ss/usermodel/DateUtil.java | 4 +- .../poi/xssf/usermodel/TestXSSFBugs.java | 45 +++++++++++++++++- test-data/spreadsheet/54034.xlsx | Bin 0 -> 8840 bytes 4 files changed, 46 insertions(+), 6 deletions(-) create mode 100644 test-data/spreadsheet/54034.xlsx diff --git a/src/java/org/apache/poi/ss/usermodel/DataFormatter.java b/src/java/org/apache/poi/ss/usermodel/DataFormatter.java index b86b09044..28dbfbe3f 100644 --- a/src/java/org/apache/poi/ss/usermodel/DataFormatter.java +++ b/src/java/org/apache/poi/ss/usermodel/DataFormatter.java @@ -20,8 +20,6 @@ ==================================================================== */ package org.apache.poi.ss.usermodel; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.math.RoundingMode; import java.text.DateFormatSymbols; import java.text.DecimalFormat; @@ -424,6 +422,7 @@ public class DataFormatter { formatStr = formatStr.replaceAll(";@", ""); formatStr = formatStr.replaceAll("\"/\"", "/"); // "/" is escaped for no reason in: mm"/"dd"/"yyyy formatStr = formatStr.replace("\"\"", "'"); // replace Excel quoting with Java style quoting + formatStr = formatStr.replaceAll("\\\\T","'T'"); // Quote the T is iso8601 style dates boolean hasAmPm = false; diff --git a/src/java/org/apache/poi/ss/usermodel/DateUtil.java b/src/java/org/apache/poi/ss/usermodel/DateUtil.java index e4d870de7..2bc9f0171 100644 --- a/src/java/org/apache/poi/ss/usermodel/DateUtil.java +++ b/src/java/org/apache/poi/ss/usermodel/DateUtil.java @@ -56,7 +56,7 @@ public class DateUtil { private static final Pattern date_ptrn1 = Pattern.compile("^\\[\\$\\-.*?\\]"); private static final Pattern date_ptrn2 = Pattern.compile("^\\[[a-zA-Z]+\\]"); private static final Pattern date_ptrn3a = Pattern.compile("[yYmMdDhHsS]"); - private static final Pattern date_ptrn3b = Pattern.compile("^[\\[\\]yYmMdDhHsS\\-/,. :\"\\\\]+0*[ampAMP/]*$"); + private static final Pattern date_ptrn3b = Pattern.compile("^[\\[\\]yYmMdDhHsS\\-T/,. :\"\\\\]+0*[ampAMP/]*$"); // elapsed time patterns: [h],[m] and [s] private static final Pattern date_ptrn4 = Pattern.compile("^\\[([hH]+|[mM]+|[sS]+)\\]"); @@ -445,7 +445,7 @@ public class DateUtil { } // If we get here, check it's only made up, in any case, of: - // y m d h s - \ / , . : [ ] + // y m d h s - \ / , . : [ ] T // optionally followed by AM/PM boolean result = date_ptrn3b.matcher(fs).matches(); diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java index aa8395e02..71f462361 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java @@ -18,7 +18,13 @@ package org.apache.poi.xssf.usermodel; import static org.hamcrest.core.IsEqual.equalTo; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -42,7 +48,25 @@ import org.apache.poi.ss.formula.WorkbookEvaluator; import org.apache.poi.ss.formula.eval.ErrorEval; import org.apache.poi.ss.formula.eval.ValueEval; import org.apache.poi.ss.formula.functions.Function; -import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.usermodel.BaseTestBugzillaIssues; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.CellValue; +import org.apache.poi.ss.usermodel.ClientAnchor; +import org.apache.poi.ss.usermodel.Comment; +import org.apache.poi.ss.usermodel.CreationHelper; +import org.apache.poi.ss.usermodel.DataFormatter; +import org.apache.poi.ss.usermodel.DateUtil; +import org.apache.poi.ss.usermodel.Drawing; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.FormulaError; +import org.apache.poi.ss.usermodel.FormulaEvaluator; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Name; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.ss.util.AreaReference; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellReference; @@ -1501,6 +1525,23 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues { assertThat(firstSave, equalTo(secondSave)); } + + /** + * ISO-8601 style cell formats with a T in them, eg + * cell format of "yyyy-MM-ddTHH:mm:ss" + */ + @Test + public void bug54034() throws IOException { + Workbook wb = XSSFTestDataSamples.openSampleWorkbook("54034.xlsx"); + Sheet sheet = wb.getSheet("Sheet1"); + Row row = sheet.getRow(1); + Cell cell = row.getCell(2); + assertTrue(DateUtil.isCellDateFormatted(cell)); + + DataFormatter fmt = new DataFormatter(); + assertEquals("yyyy\\-mm\\-dd\\Thh:mm", cell.getCellStyle().getDataFormatString()); + assertEquals("2012-08-08T22:59", fmt.formatCellValue(cell)); + } @Test diff --git a/test-data/spreadsheet/54034.xlsx b/test-data/spreadsheet/54034.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2ae2bebefcdbc1d7a23cd23a6ad4fe590f712dd6 GIT binary patch literal 8840 zcmeHMg6ZAx;xBQKRw{f5bZt8aP3O z@xIM&rPt73O=8q4f$m;W$_cJ342d{@>1xij9wP`tN335?j@Y=MBQHeXY#k_){qjPW zV|hro_f>Q_yAS5CiwJVudDF_&)WkC(Jg49KV~BdTJ&i(p!!cVkqzNcf zIEv!vN^*u&klDK!PyoL8nb!-eh-5^efhmqPoTp!OieAe`lo^`FPz%l(`q& zI|cu|^Qbpo$OubK5o(%oXnZ1UQ} zh-MmfF7feJTXZx(v{KNy`1dz;f+|klJnI4AG}Rc%Y$CBf&ovoKtdgOb;tc6Ng;0{C ztTBR~3kGvwHVfQP?f9lv#DziW`LO)rk@!Nio8%CCs#YLlat+#lJ=KqkPvkZQT+b1kMhJJ z#SUKl&i#;m{B_5%N(P3^J-M(Z+kl{W<;*t@g#0TxADeRXX2Ky&$AsT3yU(upU+(VN zQFWlPY=!EmlQ5$nvrNrY^SA*2Gg`V!D7iG%pU+s<6{b9*4vSo!T!en2#%2h!tGK zhd~<`k7~11Gxgc0;-b-=W~?d?_ul5oy3o>uVbfvOOIrJV({eWQn^Xv&)6QN^PFY|u zp(0Q}QVqYKd>@u?GA-Vh>cX!NOB=q(d5zxlo$f_-0F|5_50O6om&ie>=wV{P%qq=B zoAQUj;==TMt3HI&(>&*`lKz%a9oSpO`6c(RpTvj}2YoP5Ql3>U0Jgt->Y|;SMIO=m z9sKeI(O6vSuXWmO9jF3B%rzcj-iiO1b2n=-QS`4XRweeyHEj27Y zWBXuNghpV)5xDrN%$LVt7SrxQn)3027y-fhVL&1kcp^@>OstlQP%m9YKwaL49XW+` zu&CVvBl?rp(zdMi(sOLP`!shgHLkc|;fe)%HUmE4BS(Tl@>i=F@Gq~2YCq4u`+`-8 z&phFq4Z)%gpi}qRlIP@<^dNSm-ut+Vjb_zBeQ5JeB!A(1F0@LFYI(jd$00&#hJGjT z)kWki)~{$K=D@GiiWr(SVu*}CY2{`Ofw;Tfey&FjUo|JQu0HUC zb2UrBM7Cy$F}TFz&BnMtW&l-H6`yy->ylu>!Znz#$lC)ureU!dCGnv3X@%!LyglEc zl*8qvwhmuS(BAQ=*6eex2Iz!7c&Mp&y%QTiEAE)zJShKlC`>^#-V~H4FWN1)`!xtG zwe5A9Z5M!xQs~g%cXW#Js~NZezjjDQ1ptaDf2=Nk7nZv$ z#+&k@b9ZuJt))csh@OIFR;W;RI7ZUgyiC>A%99*b2%v3HdZW(B8#@)ZkaC^}v#4Z| zpo(Qr2ucq^(lFek^k#q{^FTo+yyQsoR7@7Q@%Uw9@5DIfyfPVI4cNiVXyJ0yV>9H? zec*t&mCZ_jd(uG1)Aby+nQc1*crb$@Qa(q!G@bofZCF#~O`_ zhHuDMC(JJmep4+PQG~!`ak@bhX$O?!mH~bPt(5Vf?x!A{40_hhxF4We91bx1-zb*p zc^#q>^HZp$4a0M<0u>)dDvQi;g*yTK^E2AW*rFoD>jj}0apR@B(1QT(bHK1<1j&np z3|5PffT(5e*heAY0e};sVLD9aqanp;WBl_hdAidBtpZ(LHFPl_I0QeI`xgI5HqT%co%#UXT_D1RnU&GyBS|~Hmen2HU{8$A zY)tCK3QaW|`05$KbY0^X17Qj;MI-QFb0q+S=aZtslvlVQ7OO7Yp-P72b@`yVRQ37dv zp^>9jR#M?FU}TLag?iec1inn$#IE$Tf9pl&A;K}{8%b3!FOS}@7)DFDo__cs`yN$F z0@ZR92~HqUS+#O^tKl~}LpAmTcS-WcO?(M&><1i>&PlTZfig|(9v3v3kGVD39&qLR z5V;x4?j6|N@6gbUpdJ?C1WUwgp=-pPeqayXceyWfEcOkli(@Vzjj(I3h%7`*&{6zU~K%uD}6`L9z4%SZ%|J#yaUrIMh7> z`!Kx#H0sN9QEZu&{HZsQK_8D2`+UbcdK`0BKVyf|Sqz#Ky|cwJ1)29F;(-t}9uTUF zy^Q7LW?_YnXw29NO;FH$bs0Tnaeflf#fDU+G^Y$EZ3#%K3d6b3N}9I#-j-RR%y%Ed z*7?G0_hUh|78)V_IBse#4vs)d1OO_;%5kF)?Dy5cOn#F8Rsr@Asr8^r0m;+dNQs4L zxh(H379-sAREX=fe_<4P*b1W{SimKy_3FVBsT{r(=M^*dkig(=Q3nTsHPQ{i&FC~R zs#O=Cl5|$8!EbqbEC%oI$$!9Jub`v(@|3+nWACywJ-L}qJKF40LQ8I+)%gw#G(mH) zC6foxbL9gZ}DtkcMgBX!5?^LjH~EW9 zYT6QY{5N=z9@&L^9k!eE5QR6%@z0Ax-t)u2aozN0GDg5mU#By5^jybM1$|WPJ&Vf^ z`!=XAkmpv3j|NICzR%maE#~a`+w+HNI#LVcs94?@b~HZJ-6{2K(#zg$l9M~`$QvlN z(nIRUG?3y@xtJtg$}*^^&{d+S65?NKf%Z|fo6h4iJ12x4(@xzKAH2L;%)S4aULpt{ zy?7DMf@%iT2Nlu6p5Gp92Dm`oyJc{mc_e2nWaoX*Fr!rNNJ9-JFV zlP(^#T1Pc7TG5OsQUC4^*`^+iy+Cw^>4;T1&L2h0&E3Zy@_UO?@I=LFh8MdDZ|WJo zyVshx!X!#97E?(uvJu~_yVWv0(Oj(3CuZ`lWKL7hXqg*gp)~boq8-G{AP`7Xu}V$z zm6avuBzyZ?C^=)HqLGV7_d%TzfsvU7wKfTfJ`CHde|h_ICGvB*>D#28vEiE zKkoP2$fS?n7|zio3%m0KZP^GHtzmiUHU_6P3c|PGMgXc2j{&9A)U`xT47#-vTL}Gc za<3gzfHjZEw!9oUoQ((hwxIK0dO1*=yX1Sjic4v{x>ghwmA@uqoBHV634M|c-r7>w zq%A!#2w-@|uC}XotbE7Yk|zJNH07$KQ#X-#wBkh0lzQt~#D%#~ilKXx*kSB&-cr^o zoi5#HE4pA@6c_qVMWW)*Vqb{`z50uhNv*5BjDVXYF^}Uzb3Be%5L$6T~m|(wncEGeax%AKSHrW;6O1lSLZsUOu)Us zOBpP5kQH^P7!6}vEn;gw1L?Nhp@_;2=nG%5E$~T2;w>A~o0>Ws|879eMEf?Vn54{x zW7cuD|6uyMjeWk?Li{8}!j6oN-@kU>|Hdi}geLYu3~LhkW3iBUd$Z$2PTEW+!}H4J z6K%np4$=`<*!&~tcgvuo3jp8|S>O8l^GyR?H^?;ega zHKVY;^qJq{s4RHY@yNZc35AV0kxWgc3VX(V>WqHiuEd-6Wolzg$7JmqC_WjU^un2V z+y-A_Dpb)FZQc|7ihI*Ye|AIAm^(zG8D(d;=b?-J+X&qEp_nE_%=6bTG>1Tk7_`iR zc9)L(=G8Zu^dz6{XFlxP-rSKLdl04!qh8R~Xc7-vvt|Y7*>5Qrdg#(r$zobcUM*3zD1h?6V-)uhzMyF!-%=v<`MLrYqbDPUhX}2IVngVGfp-V# z%BT|99wD(ALp68Zj%)QI+=z9%l1;TM=pJ+FzGHKA;;+0{h0~a>AL_z9)smF_+Hm8` zVpbu!K_H;VewDfx+5nedzZ~CzSzadXBC)#oM>31Bq?^A7M))%231}V=lr$@k15vuv zgHhHvSqNGsjL{y!B`AF%%gL|pYH~KIyn0Ff@gJY{q~^nHGKv*0$UzdV``hDo61KXf zjyhE82^gv$kk)Or#L-zoNvLM9)k^13IV|VkJbpSM-u6YEb|XX=NT{4qEsyis0c4O& z&_k!xVtH_4*x_srj>4Cn?7`)@y?$%LgcCk=n#uks+* zpTi1NtU>nDsr!duaN$daxphF3MF%d6> zLs>EfGnhPz0<|EByt((+TCTufAy(;lmZw=1(v zvZ}5HB5g>gE-~bh)+4jB)HwFTx{qVAdraqY<)L8FY19YKgt86ctg_?bbr*D!ckxmR zKFb9$z|ACUsUHazJz?x*AD=EL<#SZnp6Vo>R-&+@9WN9>dTn=NbTxOh=Dtn@KZ&jS zM%$4-6nJuE`o>s~rE;wN0~vA?x_1e{OQ%X`kTdbLw`HZ#k0$2Og8@$4Rgcn-{sm?@ z!>R;yhIIl>J(e5NI{GPqoh>((i)GhzF0c$P+W_Mwn!<4Siu!s)wwt@rt`fyrLjlTp z>;sF&+EttFviz0iPa6RsvO=w@79Y| zKksu{g*lp2kR5$4G#CG^4L3i!a4NSw)?vL*)+PSkM2y#me3JCBLCa4~0<_AADdkrI z0JlU zL$vK)ZxrSs;0a2h0lfEpn10PW>sC$WyY&l=wRQjZ%XA**EzGia7j+)VYVHun zD)#$1$C1K~g+xPj`=ljNTEybJhQ3_=NfxP|ZP4aMu>^_u=V|6*@lUFn|y|J>vIEAYp; z43XRZw&Qm@@Socre-9i%_;3IBCdh4^+gA8bq&oz{xB{~4&a0dG5yKLL%ge+RtnN8Sdwz54qJz=&`(5l{4UEqFWhb_4!1 zbcW>iV1Bmaw^9DtIsL={0IU&R{lEIC+u^sX-%o%Qir*jNR_*&`ExZl-&jkGw5&%e{ c`r9-8nXc89?jSe_0AM3NEC?Da)Bd>nAN*G4qW}N^ literal 0 HcmV?d00001