diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java b/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java
index 1d9459a71..037d55d9f 100644
--- a/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java
+++ b/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java
@@ -265,10 +265,15 @@ public final class HSSFEvaluationWorkbook implements FormulaRenderingWorkbook, E
return extIx;
}
+ @Override
public SpreadsheetVersion getSpreadsheetVersion(){
return SpreadsheetVersion.EXCEL97;
}
+ /**
+ * @throws IllegalStateException: data tables are not supported in Excel 97-2003 format
+ */
+ @Override
public Table getTable(String name) {
throw new IllegalStateException("XSSF-style tables are not supported for HSSF");
}
diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/BaseXSSFEvaluationWorkbook.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/BaseXSSFEvaluationWorkbook.java
index 41dd05c6c..8ef2c5439 100644
--- a/src/ooxml/java/org/apache/poi/xssf/usermodel/BaseXSSFEvaluationWorkbook.java
+++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/BaseXSSFEvaluationWorkbook.java
@@ -353,8 +353,11 @@ public abstract class BaseXSSFEvaluationWorkbook implements FormulaRenderingWork
* @return The Data table in the workbook named name, or null if no table is named name.
* @since 3.15 beta 2
*/
+ @Override
public XSSFTable getTable(String name) {
- return getTableCache().get(name.toLowerCase(Locale.ROOT));
+ if (name == null) return null;
+ String lname = name.toLowerCase(Locale.ROOT);
+ return getTableCache().get(lname);
}
public UDFFinder getUDFFinder(){
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 1dcb3c42f..74974fe7d 100644
--- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
+++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
@@ -2271,7 +2271,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
* @since 3.15 beta 2
*/
public XSSFTable getTable(String name) {
- if (sheets != null) {
+ if (name != null && sheets != null) {
for (XSSFSheet sheet : sheets) {
for (XSSFTable tbl : sheet.getTables()) {
if (name.equalsIgnoreCase(tbl.getName())) {
diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java
index 6b1eebe65..868557ae1 100644
--- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java
+++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java
@@ -1137,7 +1137,7 @@ public final class TestXSSFSheet extends BaseTestXSheet {
}
/**
- * See bug #50829
+ * See bug #50829 test data tables
*/
@Test
public void tables() throws IOException {
diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java
index 6e642ccca..f4a468752 100644
--- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java
+++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java
@@ -1107,4 +1107,36 @@ public final class TestXSSFWorkbook extends BaseTestXWorkbook {
assertTrue("Had: " + e.getCause(), e.getCause() instanceof IOException);
}
}
+
+ /**
+ * See bug #57840 test data tables
+ */
+ @Test
+ public void getTable() throws IOException {
+ XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("WithTable.xlsx");
+ XSSFTable table1 = wb.getTable("Tabella1");
+ assertNotNull("Tabella1 was not found in workbook", table1);
+ assertEquals("Table name", "Tabella1", table1.getName());
+ assertEquals("Sheet name", "Foglio1", table1.getSheetName());
+
+ // Table lookup should be case-insensitive
+ assertSame("Case insensitive table name lookup", table1, wb.getTable("TABELLA1"));
+
+ // If workbook does not contain any data tables matching the provided name, getTable should return null
+ assertNull("Null table name should not throw NPE", wb.getTable(null));
+ assertNull("Should not be able to find non-existent table", wb.getTable("Foglio1"));
+
+ // If a table is added after getTable is called it should still be reachable by XSSFWorkbook.getTable
+ // This test makes sure that if any caching is done that getTable never uses a stale cache
+ XSSFTable table2 = wb.getSheet("Foglio2").createTable();
+ table2.setName("Table2");
+ assertSame("Did not find Table2", table2, wb.getTable("Table2"));
+
+ // If table name is modified after getTable is called, the table can only be found by its new name
+ // This test makes sure that if any caching is done that getTable never uses a stale cache
+ table1.setName("Table1");
+ assertSame("Did not find Tabella1 renamed to Table1", table1, wb.getTable("TABLE1"));
+
+ wb.close();
+ }
}