return SpreadsheetVersion.EXCEL2007;
}
- /*
- * TODO: data tables are stored at the workbook level in XSSF, but are bound to a single sheet.
- * The current code structure has them hanging off XSSFSheet, but formulas reference them
- * only by name (names are global, and case insensitive).
- * This map stores names as lower case for case-insensitive lookups.
- *
- * FIXME: Caching tables by name here for fast formula lookup means the map is out of date if
- * a table is renamed or added/removed to a sheet after the map is created.
- *
- * Perhaps tables can be managed similar to PivotTable references above?
- */
- Map<String, XSSFTable> _tableCache = null;
- private Map<String, XSSFTable> getTableCache() {
- if ( _tableCache != null ) {
- return _tableCache;
- }
- // FIXME: use org.apache.commons.collections.map.CaseInsensitiveMap
- _tableCache = new HashMap<String, XSSFTable>();
-
- if (sheets != null) {
- for (XSSFSheet sheet : sheets) {
- for (XSSFTable tbl : sheet.getTables()) {
- String lname = tbl.getName().toLowerCase(Locale.ROOT);
- _tableCache.put(lname, tbl);
- }
- }
- }
- return _tableCache;
- }
-
/**
* Returns the data table with the given name (case insensitive).
- * Tables are cached for performance (formula evaluation looks them up by name repeatedly).
- * After the first table lookup, adding or removing a table from the document structure will cause trouble.
- * This is meant to be used on documents whose structure is essentially static at the point formulas are evaluated.
*
* @param name the data table name (case-insensitive)
* @return The Data table in the workbook named <tt>name</tt>, or <tt>null</tt> if no table is named <tt>name</tt>.
* @since 3.15 beta 2
*/
public XSSFTable getTable(String name) {
- String lname = name.toLowerCase(Locale.ROOT);
- return getTableCache().get(lname);
+ if (sheets != null) {
+ for (XSSFSheet sheet : sheets) {
+ for (XSSFTable tbl : sheet.getTables()) {
+ if (name.equalsIgnoreCase(tbl.getName())) {
+ return tbl;
+ }
+ }
+ }
+ }
+ return null;
}
}