From 399c35aef26af18abca0a258b56160157eeea4d4 Mon Sep 17 00:00:00 2001 From: Sunil Jain Date: Sun, 22 Dec 2019 16:30:19 +0530 Subject: [PATCH 1/3] BAEL-3658: Read cell value rather than the formula that is evaluating it --- apache-poi/pom.xml | 2 +- .../excel/ReadCellValueNotFormulaHelper.java | 84 ++++++++++++++++++ apache-poi/src/main/resources/test.xlsx | Bin 0 -> 4850 bytes .../ReadCellValueNotFormulaUnitTest.java | 39 ++++++++ 4 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 apache-poi/src/main/java/com/baeldung/poi/excel/ReadCellValueNotFormulaHelper.java create mode 100644 apache-poi/src/main/resources/test.xlsx create mode 100644 apache-poi/src/test/java/com/baeldung/poi/excel/ReadCellValueNotFormulaUnitTest.java diff --git a/apache-poi/pom.xml b/apache-poi/pom.xml index a114946c47..333339ed33 100644 --- a/apache-poi/pom.xml +++ b/apache-poi/pom.xml @@ -32,7 +32,7 @@ - 3.15 + 4.1.1 1.0.6 diff --git a/apache-poi/src/main/java/com/baeldung/poi/excel/ReadCellValueNotFormulaHelper.java b/apache-poi/src/main/java/com/baeldung/poi/excel/ReadCellValueNotFormulaHelper.java new file mode 100644 index 0000000000..f5117dcda9 --- /dev/null +++ b/apache-poi/src/main/java/com/baeldung/poi/excel/ReadCellValueNotFormulaHelper.java @@ -0,0 +1,84 @@ +package com.baeldung.poi.excel; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.FormulaEvaluator; +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.util.CellAddress; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +public class ReadCellValueNotFormulaHelper { + + public Object getCellValueByFetchingLastCachedValue(String fileLocation, String cellLocation) throws IOException { + Object cellValue = new Object(); + FileInputStream inputStream = new FileInputStream(new File(fileLocation)); + + Workbook workbook = new XSSFWorkbook(inputStream); + + Sheet sheet = workbook.getSheetAt(0); + + CellAddress cellReference = new CellAddress(cellLocation); + + Row row = sheet.getRow(cellReference.getRow()); + Cell cell = row.getCell(cellReference.getColumn()); + + if (cell.getCellType() == CellType.FORMULA) { + switch (cell.getCachedFormulaResultType()) { + case BOOLEAN: + cellValue = cell.getBooleanCellValue(); + break; + case NUMERIC: + cellValue = cell.getNumericCellValue(); + break; + case STRING: + cellValue = cell.getRichStringCellValue() + .getString(); + break; + default: + cellValue = null; + } + } + + workbook.close(); + return cellValue; + } + + public Object getCellValueByEvaluatingFormula(String fileLocation, String cellLocation) throws IOException { + Object cellValue; + FileInputStream inputStream = new FileInputStream(new File(fileLocation)); + + Workbook workbook = new XSSFWorkbook(inputStream); + + Sheet sheet = workbook.getSheetAt(0); + FormulaEvaluator evaluator = workbook.getCreationHelper() + .createFormulaEvaluator(); + + CellAddress cellAddress = new CellAddress(cellLocation); + + Row row = sheet.getRow(cellAddress.getRow()); + Cell cell = row.getCell(cellAddress.getColumn()); + + switch (evaluator.evaluateFormulaCell(cell)) { + case BOOLEAN: + cellValue = cell.getBooleanCellValue(); + break; + case NUMERIC: + cellValue = cell.getNumericCellValue(); + break; + case STRING: + cellValue = cell.getStringCellValue(); + break; + default: + cellValue = null; + } + + workbook.close(); + return cellValue; + } +} diff --git a/apache-poi/src/main/resources/test.xlsx b/apache-poi/src/main/resources/test.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..64fe14f25b1f43c90b7059c1354c575fa959cdd2 GIT binary patch literal 4850 zcmai22|Sc-_Z~Z83}eYMmJC8d_I(#7J0;n(jBSW8mSii&7GoEcosgI!F@y+Hwia2+ zzD`I&Wcg3^V9|K^ zpn}Vv4W;gKk#B-<+9E892gGA)XSXM*2w4DmFJ6Lb=sxacAc!Mpn7DgVzNilbu&sTo-|fAQ{)+5 zctlTgUztY!fMfGhw^>W?d;9KB%&$lw#vNxGwL-dMYX$9E(p+?dRwEnWWROT)_cQq) zGoNZjdSsuT7WJyN`&|7RbE?7K1V%+o<>VesK>`3!kpTcE|0|S1K7OA5a2J>B{^CbJ zze1VOhA5I?)@gM(X!{n(%*6yZBe$Tpl=)<7>E^l;MRQR?x1MHc;?4>vA*MXZm24gx z)Q>%<`;vj`Vzde)`kP>6i(G7kw1PMsV>r3Cy)eQ-TH$LxnJWj4yszCJ`~Cd5e{C8I z-wC)nKiEq6y)Jc6^C>#mordDUd^GLtjBw^F&?_3gjyhGk2|Ig0$qSrFsP;4~r8q1% zP3T@wqVzH~V{wI_93)&W%Gq)56j5MiFzMpu&Di!v4JAAPU>+2E?DUlrlUzAUxSc{afrk74Q zZKRQjB!8uS|_)7=ni)ghKrLA_V`6!F9Ncw~P4E_fh@5xip3t=LPLY9gt09+lH~i zO{R5sEqSahm+P0MYS&BJK9b71AGDkd^$vp-y7If&lg>!RN=dy)!Bw`hQ!vCNNV|E$ z?X5r{)>+5iX_>uE|HELC$dv3`+4G52Q((rg9ve$cHO`vnNYj76I|7*9*F zvIT2o@3PJ*cbFLlCu%11uz2gHUcD@pK9$}!dcUdcj= z+l#kbRf)Dk7$t-3h1%=;N}Lo5ogCH5NZBn-sVFAvJb&1gP{#qxnKA<&?is&V2`wo@ zkI;{?)A%gqR}VoLy8`j?67`NzT0?U88$aOYkQMo+>>Hh-?>Ok!D0`nveJ$_H!;9tu z*gQ{G;4jc)G}mcZwIbZBxP>CC!24=)u(n&{j;R(B`xWtOFoCIv(wtGeEBk5Brz3si zyU(UGKfJMQzT}(ZEA!2$keinSPR8w|@ z&K%*jDw}}CKU9t97gyeoDA0+*Cp+2Av)J6>RM6$Jc2^UT&TMZ&-b{Y?BWi)+@- z&7zxC+s0!(bvsnVLUSpKbUaPybk)FrDm3O_h2{@;^mB1GzwSp=4@A-6ovcA*7aikC zNV`{OsU;{CdX_xv(RV;CWK3PEBBx?;rJ7b_U@r9V<`38HIPCMQ^C{h$mgx^tmfw+k zh~*i_c2Y7Ylyz;R2HL^wfe6=Z9Yb>`+WhXv?{o3MqJ>lRdggwH3L!ZX4Y{$2EmJ^K zri=KIrK4_0=7}mdN%xV{ke#ywV4|S0gHONsU4U5-3je za^HQntC--!D&h0@bVC1cFRurCxg5Fo)B=ZiC&9c=O6cP)GsV2xl~7AL4KIg54JW*O z-^+(QsW-}?VJgF0#ZqrIO!&G_t>4J^{}P(NjF8P$*5^sb$cV{N2n?MV7Hz6r8ukv| zj6?&*w``O|J)d{0ujR^FM(E&TO$~VC9JCD2M=WL5^6I)HKR(m9PNeJO1j2VAv}sw* z47J_xKwIXuoT=WSL|>(>wP(*>NE#s7#sQpDbp9O=Vw$y|JIW;{u=Lop?`bAa9b8kh z<@@qdBfvn^3N12f5sd-G`G(TUU{&RFMfP}&ZDtf$kS0|XF>m|8t$2^odYzEMF+YC) zY3wDN^K3Z4PCgEhF@?%(tSn2(&e6na9#p*>niksD(J)d$; z6)oWO^>=yw7sBq4)%j&z59oZS1=@x_4Uf}W_m+p{Q=$D;H)T4P;ve9dfZvF>j? zzPb*+QnU-b3Lov|`KXQ@A|^QUr6;5P zWQDwP(BxIVW+UcCEv=tfIngoQ)w83QyL(tjN7#&;cozE4FZ9uT7)wbL=~66`jyple z0J{|3nKl&M!GCrib$gU7tAI34_pN1ai%Ca@fSl(1f`rXw5t14s8@i9kXykx$;f-<& zh;FVskFPGxT9oLFnY>iWfVv5s;=ATuB|iT7lkBVgSs{_#9Ae1^mBZNdZH=rChRRH#8gR6n!Pp2i~@v&Fbn6A{{P5IpHB z?IWFu+sTFrM;hC(x3Ky=VGjiVQDbxb+Jj%Z=J-w=DVu7vhDQgHdj^!^MuzLs%nVR@ zhNqp!N~u6YAJ5ea@EMNoZsp5PDuOiG>`;fDdxryX%sxlRdZchrn`n7F6L|>OYvBsT zT5Q%&AyCefhUX02EQ#5US0=peYKLD+jRZ*20@p7`^2hg^xz6|wG*UCFOi1(5=USCs z)b&n&uG1)jJD)SpZes5okF`wMswcg6lK((RN!rlOm+iH?y746u==vGI2S#G(DEna9 z%BT)?J2xw_o)q^lJM=cgb?9cq~*) zJG&EjF5M&}W^E>WoB1*!9*qQH`1cG(OL*c}xc)8vG=NbOAc_Hk_;cMd^L0!tcq}RC zMbG`9UW-q?%)PRGWyLIsHY;ssBfPXKE7*zQyCbjYgKj?uILlHS2g&eOvkHLL)LKla z?zBTEAmFL6xO`7GLR0P83nr)N2vyynS>YPf7&pJ!6ANX`?tqi zIZbY4R}GSe7127ZEPv&>`y63{JQZ+%u#1Pq9tDN@NSv?|Jbu&;~1EwM1w=D+cyx%)40kQhQLq z(&c8>t1a5xz6YmY0ZQIgb)xsYn-Ck`TJnheB|ItWbqh2NHSPY&!3SfDQ=9c}R+W@e zJShwwU8R!|9NMe^6ulE^{`Ll1v~JH-@F+S%9|UvA1f~7R^9qrj-u`z_ryeo5OMY+S|lN52K+ulI6e{+ z&k+7SrKGQWrEKT(cP2E-ZYx4kBi$zM_a>qPV?;Bf^+ z94LMpu|p65{~Ry=1UN1(h(hVNDNr8){6E?BC&KZTL=+*vjfdtJ!v9HWc%A{=#Ccu4fXzsbG%}S6!hDs2<{vsq(2uPPrARx{xw05 Z{+IGLfl&~qVgTR-;gw6ELQN3y?q5xn+ExGn literal 0 HcmV?d00001 diff --git a/apache-poi/src/test/java/com/baeldung/poi/excel/ReadCellValueNotFormulaUnitTest.java b/apache-poi/src/test/java/com/baeldung/poi/excel/ReadCellValueNotFormulaUnitTest.java new file mode 100644 index 0000000000..df7ab81874 --- /dev/null +++ b/apache-poi/src/test/java/com/baeldung/poi/excel/ReadCellValueNotFormulaUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.poi.excel; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Paths; + +import org.junit.Before; +import org.junit.Test; + +public class ReadCellValueNotFormulaUnitTest { + + private ReadCellValueNotFormulaHelper readCellValueNotFormulaHelper; + private String fileLocation; + private static final String FILE_NAME = "test.xlsx"; + + @Before + public void setup() throws URISyntaxException { + fileLocation = Paths.get(ClassLoader.getSystemResource(FILE_NAME).toURI()).toString(); + readCellValueNotFormulaHelper = new ReadCellValueNotFormulaHelper(); + } + + @Test + public void testCachedValueMethod() throws IOException { + final double expectedResult = 7.0; + final Object cellValue = readCellValueNotFormulaHelper.getCellValueByFetchingLastCachedValue(fileLocation, "C2"); + + assertEquals(expectedResult, cellValue); + } + + @Test + public void testFormulaEvaluationMethod() throws IOException { + final double expectedResult = 7.0; + final Object cellValue = readCellValueNotFormulaHelper.getCellValueByEvaluatingFormula(fileLocation, "C2"); + + assertEquals(expectedResult, cellValue); + } +} From d2186b0dc7fe3c5d19cd77e6a8c8d31f2b657c63 Mon Sep 17 00:00:00 2001 From: Sunil Jain Date: Thu, 26 Dec 2019 18:01:37 +0530 Subject: [PATCH 2/3] BAEL-3658: Read cell value rather than the formula that is evaluating it --- .../CellValueAndNotFormulaHelper.java} | 19 ++++----- .../ReadCellValueNotFormulaUnitTest.java | 39 ------------------- .../CellValueAndNotFormulaUnitTest.java | 39 +++++++++++++++++++ 3 files changed, 47 insertions(+), 50 deletions(-) rename apache-poi/src/main/java/com/baeldung/poi/excel/{ReadCellValueNotFormulaHelper.java => read/cellvalueandnotformula/CellValueAndNotFormulaHelper.java} (87%) delete mode 100644 apache-poi/src/test/java/com/baeldung/poi/excel/ReadCellValueNotFormulaUnitTest.java create mode 100644 apache-poi/src/test/java/com/baeldung/poi/excel/read/cellvalueandnotformula/CellValueAndNotFormulaUnitTest.java diff --git a/apache-poi/src/main/java/com/baeldung/poi/excel/ReadCellValueNotFormulaHelper.java b/apache-poi/src/main/java/com/baeldung/poi/excel/read/cellvalueandnotformula/CellValueAndNotFormulaHelper.java similarity index 87% rename from apache-poi/src/main/java/com/baeldung/poi/excel/ReadCellValueNotFormulaHelper.java rename to apache-poi/src/main/java/com/baeldung/poi/excel/read/cellvalueandnotformula/CellValueAndNotFormulaHelper.java index f5117dcda9..20b154321e 100644 --- a/apache-poi/src/main/java/com/baeldung/poi/excel/ReadCellValueNotFormulaHelper.java +++ b/apache-poi/src/main/java/com/baeldung/poi/excel/read/cellvalueandnotformula/CellValueAndNotFormulaHelper.java @@ -1,4 +1,4 @@ -package com.baeldung.poi.excel; +package com.baeldung.poi.excel.read.cellvalueandnotformula; import java.io.File; import java.io.FileInputStream; @@ -13,20 +13,19 @@ import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellAddress; import org.apache.poi.xssf.usermodel.XSSFWorkbook; -public class ReadCellValueNotFormulaHelper { +public class CellValueAndNotFormulaHelper { public Object getCellValueByFetchingLastCachedValue(String fileLocation, String cellLocation) throws IOException { Object cellValue = new Object(); - FileInputStream inputStream = new FileInputStream(new File(fileLocation)); + FileInputStream inputStream = new FileInputStream(new File(fileLocation)); Workbook workbook = new XSSFWorkbook(inputStream); Sheet sheet = workbook.getSheetAt(0); - CellAddress cellReference = new CellAddress(cellLocation); - - Row row = sheet.getRow(cellReference.getRow()); - Cell cell = row.getCell(cellReference.getColumn()); + CellAddress cellAddress = new CellAddress(cellLocation); + Row row = sheet.getRow(cellAddress.getRow()); + Cell cell = row.getCell(cellAddress.getColumn()); if (cell.getCellType() == CellType.FORMULA) { switch (cell.getCachedFormulaResultType()) { @@ -37,8 +36,7 @@ public class ReadCellValueNotFormulaHelper { cellValue = cell.getNumericCellValue(); break; case STRING: - cellValue = cell.getRichStringCellValue() - .getString(); + cellValue = cell.getStringCellValue(); break; default: cellValue = null; @@ -51,8 +49,8 @@ public class ReadCellValueNotFormulaHelper { public Object getCellValueByEvaluatingFormula(String fileLocation, String cellLocation) throws IOException { Object cellValue; - FileInputStream inputStream = new FileInputStream(new File(fileLocation)); + FileInputStream inputStream = new FileInputStream(new File(fileLocation)); Workbook workbook = new XSSFWorkbook(inputStream); Sheet sheet = workbook.getSheetAt(0); @@ -60,7 +58,6 @@ public class ReadCellValueNotFormulaHelper { .createFormulaEvaluator(); CellAddress cellAddress = new CellAddress(cellLocation); - Row row = sheet.getRow(cellAddress.getRow()); Cell cell = row.getCell(cellAddress.getColumn()); diff --git a/apache-poi/src/test/java/com/baeldung/poi/excel/ReadCellValueNotFormulaUnitTest.java b/apache-poi/src/test/java/com/baeldung/poi/excel/ReadCellValueNotFormulaUnitTest.java deleted file mode 100644 index df7ab81874..0000000000 --- a/apache-poi/src/test/java/com/baeldung/poi/excel/ReadCellValueNotFormulaUnitTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.baeldung.poi.excel; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.io.IOException; -import java.net.URISyntaxException; -import java.nio.file.Paths; - -import org.junit.Before; -import org.junit.Test; - -public class ReadCellValueNotFormulaUnitTest { - - private ReadCellValueNotFormulaHelper readCellValueNotFormulaHelper; - private String fileLocation; - private static final String FILE_NAME = "test.xlsx"; - - @Before - public void setup() throws URISyntaxException { - fileLocation = Paths.get(ClassLoader.getSystemResource(FILE_NAME).toURI()).toString(); - readCellValueNotFormulaHelper = new ReadCellValueNotFormulaHelper(); - } - - @Test - public void testCachedValueMethod() throws IOException { - final double expectedResult = 7.0; - final Object cellValue = readCellValueNotFormulaHelper.getCellValueByFetchingLastCachedValue(fileLocation, "C2"); - - assertEquals(expectedResult, cellValue); - } - - @Test - public void testFormulaEvaluationMethod() throws IOException { - final double expectedResult = 7.0; - final Object cellValue = readCellValueNotFormulaHelper.getCellValueByEvaluatingFormula(fileLocation, "C2"); - - assertEquals(expectedResult, cellValue); - } -} diff --git a/apache-poi/src/test/java/com/baeldung/poi/excel/read/cellvalueandnotformula/CellValueAndNotFormulaUnitTest.java b/apache-poi/src/test/java/com/baeldung/poi/excel/read/cellvalueandnotformula/CellValueAndNotFormulaUnitTest.java new file mode 100644 index 0000000000..885a955e9b --- /dev/null +++ b/apache-poi/src/test/java/com/baeldung/poi/excel/read/cellvalueandnotformula/CellValueAndNotFormulaUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.poi.excel.read.cellvalueandnotformula; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Paths; + +import org.junit.Before; +import org.junit.Test; + +public class CellValueAndNotFormulaUnitTest { + + private CellValueAndNotFormulaHelper readCellValueAndNotFormulaHelper; + private String fileLocation; + private static final String FILE_NAME = "test.xlsx"; + + @Before + public void setup() throws URISyntaxException { + fileLocation = Paths.get(ClassLoader.getSystemResource(FILE_NAME).toURI()).toString(); + readCellValueAndNotFormulaHelper = new CellValueAndNotFormulaHelper(); + } + + @Test + public void givenExcelCell_whenReadCellValueByLastCachedValue_thenProduceCorrectResult() throws IOException { + final double expectedResult = 7.0; + final Object cellValue = readCellValueAndNotFormulaHelper.getCellValueByFetchingLastCachedValue(fileLocation, "C2"); + + assertEquals(expectedResult, cellValue); + } + + @Test + public void givenExcelCell_whenReadCellValueByEvaluatingFormula_thenProduceCorrectResult() throws IOException { + final double expectedResult = 7.0; + final Object cellValue = readCellValueAndNotFormulaHelper.getCellValueByEvaluatingFormula(fileLocation, "C2"); + + assertEquals(expectedResult, cellValue); + } +} From 01a4b4b8a6843ddd3b1699f1fc33139b2a58e49f Mon Sep 17 00:00:00 2001 From: Sunil Jain Date: Sat, 4 Jan 2020 11:16:33 +0530 Subject: [PATCH 3/3] BAEL-3658: Fixed switch case indentations and added if condition to check if the cellType is FORMULA or not --- .../CellValueAndNotFormulaHelper.java | 50 ++++++++++--------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/apache-poi/src/main/java/com/baeldung/poi/excel/read/cellvalueandnotformula/CellValueAndNotFormulaHelper.java b/apache-poi/src/main/java/com/baeldung/poi/excel/read/cellvalueandnotformula/CellValueAndNotFormulaHelper.java index 20b154321e..08dd0e07ab 100644 --- a/apache-poi/src/main/java/com/baeldung/poi/excel/read/cellvalueandnotformula/CellValueAndNotFormulaHelper.java +++ b/apache-poi/src/main/java/com/baeldung/poi/excel/read/cellvalueandnotformula/CellValueAndNotFormulaHelper.java @@ -29,17 +29,17 @@ public class CellValueAndNotFormulaHelper { if (cell.getCellType() == CellType.FORMULA) { switch (cell.getCachedFormulaResultType()) { - case BOOLEAN: - cellValue = cell.getBooleanCellValue(); - break; - case NUMERIC: - cellValue = cell.getNumericCellValue(); - break; - case STRING: - cellValue = cell.getStringCellValue(); - break; - default: - cellValue = null; + case BOOLEAN: + cellValue = cell.getBooleanCellValue(); + break; + case NUMERIC: + cellValue = cell.getNumericCellValue(); + break; + case STRING: + cellValue = cell.getStringCellValue(); + break; + default: + cellValue = null; } } @@ -48,7 +48,7 @@ public class CellValueAndNotFormulaHelper { } public Object getCellValueByEvaluatingFormula(String fileLocation, String cellLocation) throws IOException { - Object cellValue; + Object cellValue = new Object(); FileInputStream inputStream = new FileInputStream(new File(fileLocation)); Workbook workbook = new XSSFWorkbook(inputStream); @@ -61,18 +61,20 @@ public class CellValueAndNotFormulaHelper { Row row = sheet.getRow(cellAddress.getRow()); Cell cell = row.getCell(cellAddress.getColumn()); - switch (evaluator.evaluateFormulaCell(cell)) { - case BOOLEAN: - cellValue = cell.getBooleanCellValue(); - break; - case NUMERIC: - cellValue = cell.getNumericCellValue(); - break; - case STRING: - cellValue = cell.getStringCellValue(); - break; - default: - cellValue = null; + if (cell.getCellType() == CellType.FORMULA) { + switch (evaluator.evaluateFormulaCell(cell)) { + case BOOLEAN: + cellValue = cell.getBooleanCellValue(); + break; + case NUMERIC: + cellValue = cell.getNumericCellValue(); + break; + case STRING: + cellValue = cell.getStringCellValue(); + break; + default: + cellValue = null; + } } workbook.close();