2424import org .spacious_team .table_wrapper .api .TableCellAddress ;
2525
2626import java .util .Date ;
27+ import java .util .Objects ;
2728import java .util .function .BiPredicate ;
29+ import java .util .function .Predicate ;
2830
2931import static org .spacious_team .table_wrapper .api .TableCellAddress .NOT_FOUND ;
3032
3133class XmlTableHelper {
3234
33- static TableCellAddress find (Worksheet sheet , Object value , int startRow , int endRow , int startColumn , int endColumn ,
34- BiPredicate < String , Object > stringPredicate ) {
35- int tableLastRowNum = getLastRowNum ( sheet );
36- if ( tableLastRowNum == - 1 ) {
37- return NOT_FOUND ;
38- } else if ( endRow > tableLastRowNum ) {
39- endRow = tableLastRowNum + 1 ; // endRow is exclusive
40- }
41- if ( value instanceof Number ) {
42- value = (( Number ) value ). doubleValue ( );
43- }
44- for (int rowNum = startRow ; rowNum < endRow ; rowNum ++) {
35+ static TableCellAddress find (Worksheet sheet , Object expected ,
36+ int startRow , int endRow ,
37+ int startColumn , int endColumn ) {
38+ return find ( sheet , startRow , endRow , startColumn , endColumn , equalsPredicate ( expected ));
39+ }
40+
41+ static TableCellAddress find ( Worksheet sheet , int startRow , int endRow ,
42+ int startColumn , int endColumn ,
43+ Predicate < Cell > predicate ) {
44+ startRow = Math . max ( 0 , startRow );
45+ endRow = Math . min ( endRow , getLastRowNum ( sheet ) + 1 ); // endRow is exclusive
46+ for (int rowNum = startRow ; rowNum < endRow ; rowNum ++) {
4547 Row row = sheet .getRowAt (rowNum + 1 );
46- TableCellAddress address = find (row , value , startColumn , endColumn , stringPredicate );
48+ TableCellAddress address = find (row , startColumn , endColumn , predicate );
4749 if (address != NOT_FOUND ) {
4850 return address ;
4951 }
5052 }
5153 return NOT_FOUND ;
5254 }
5355
54- static TableCellAddress find (Row row , Object value , int startColumn , int endColumn ,
55- BiPredicate <String , Object > stringPredicate ) {
56+ static TableCellAddress find (Row row , int startColumn , int endColumn , Predicate <Cell > predicate ) {
5657 if (row != null ) {
5758 for (Cell cell : row .getCells ()) {
5859 if (cell != null ) {
5960 int column = cell .getIndex () - 1 ;
6061 if (startColumn <= column && column < endColumn ) {
61- if (compare ( value , cell , stringPredicate )) {
62+ if (predicate . test ( cell )) {
6263 return new TableCellAddress (row .getIndex () - 1 , column );
6364 }
6465 }
@@ -72,19 +73,25 @@ static int getLastRowNum(Worksheet sheet) {
7273 return sheet .getTable ().getRowMap ().lastKey () - 1 ;
7374 }
7475
75- private static boolean compare (Object value , Cell cell , BiPredicate <String , Object > stringPredicate ) {
76- if (value instanceof String ) {
77- return stringPredicate .test (cell .getData$ (), value );
78- } else if (value instanceof Integer || value instanceof Long ) {
79- return cell .intValue () == ((Number ) value ).longValue ();
80- } else if (value instanceof Number ) {
81- return Math .abs (cell .doubleValue () - ((Number ) value ).doubleValue ()) < 1e-6 ;
82- } else if (value instanceof Boolean ) {
83- return value .equals (cell .booleanValue ());
84- } else if (value instanceof Date ) {
85- return value .equals (cell .getData ());
76+ static Predicate <Cell > equalsPredicate (Object expected ) {
77+ if (expected instanceof String ) {
78+ return (cell ) -> Objects .equals (cell .getData$ (), expected );
79+ } else if (expected instanceof Integer || expected instanceof Long ) {
80+ return (cell ) -> {
81+ Object data = cell .getData ();
82+ return (data instanceof Number ) &&
83+ ((Number ) data ).longValue () == ((Number ) expected ).longValue ();
84+ };
85+ } else if (expected instanceof Number ) {
86+ return (cell ) -> {
87+ Object data = cell .getData ();
88+ return (data instanceof Number ) &&
89+ Math .abs (((Number ) data ).doubleValue () - ((Number ) expected ).doubleValue ()) < 1e-6 ;
90+ };
91+ } else if (expected instanceof Boolean ) {
92+ return (cell ) -> Objects .equals (expected , cell .booleanValue ());
8693 } else {
87- return false ;
94+ return ( cell ) -> Objects . equals ( expected , cell . getData ()) ;
8895 }
8996 }
9097}
0 commit comments