List<ExternalLinksTable> tables = _uBook.getExternalLinksTable(); int index = findExternalLinkIndex(bookName, tables); if (index != -1) return index;
@Override public ExternalSheet getExternalSheet(String firstSheetName, String lastSheetName, int externalWorkbookNumber) { String workbookName; if (externalWorkbookNumber > 0) { // External reference - reference is 1 based, link table is 0 based int linkNumber = externalWorkbookNumber - 1; ExternalLinksTable linkTable = _uBook.getExternalLinksTable().get(linkNumber); workbookName = linkTable.getLinkedFileName(); } else { // Internal reference workbookName = null; } if (lastSheetName == null || firstSheetName.equals(lastSheetName)) { return new ExternalSheet(workbookName, firstSheetName); } else { return new ExternalSheetRange(workbookName, firstSheetName, lastSheetName); } }
@Override public ExternalName getExternalName(String nameName, String sheetName, int externalWorkbookNumber) { if (externalWorkbookNumber > 0) { // External reference - reference is 1 based, link table is 0 based int linkNumber = externalWorkbookNumber - 1; ExternalLinksTable linkTable = _uBook.getExternalLinksTable().get(linkNumber); for (org.apache.poi.ss.usermodel.Name name : linkTable.getDefinedNames()) { if (name.getNameName().equals(nameName)) { // HSSF returns one sheet higher than normal, and various bits // of the code assume that. So, make us match that behaviour! int nameSheetIndex = name.getSheetIndex() + 1; // TODO Return a more specialised form of this, see bug #56752 // Should include the cached values, for in case that book isn't available // Should support XSSF stuff lookups return new ExternalName(nameName, -1, nameSheetIndex); } } throw new IllegalArgumentException("Name '"+nameName+"' not found in " + "reference to " + linkTable.getLinkedFileName()); } else { // Internal reference int nameIdx = _uBook.getNameIndex(nameName); return new ExternalName(nameName, nameIdx, 0); // TODO Is this right? } }
private static Set<String> getReferencedWorkbooksXssf(XSSFWorkbook workbook) { Set<String> workbookNames = new HashSet<>(); final List<ExternalLinksTable> externalLinksTable = workbook.getExternalLinksTable(); for (ExternalLinksTable linksTable : externalLinksTable) { final String linkedFileName = linksTable.getLinkedFileName(); workbookNames.add(linkedFileName); } return workbookNames; }
/** * Provides a list of filenames that contain workbooks that are linked with the current one. Officially supported only for new Excel format. For the old Excel format this is experimental * * @return list of filenames (without path) belonging to linked workbooks * */ @Override public List<String> getLinkedWorkbooks() { List<String> result = new ArrayList<>(); if (this.currentWorkbook instanceof HSSFWorkbook) { result = getLinkedWorkbooksHSSF(); } else if (this.currentWorkbook instanceof XSSFWorkbook) { // use its API for (ExternalLinksTable element: ((XSSFWorkbook)this.currentWorkbook).getExternalLinksTable()) { result.add(element.getLinkedFileName()); } } else { LOG.warn("Cannot determine linked workbooks"); } return result; }
List<ExternalLinksTable> tables = _uBook.getExternalLinksTable(); int index = findExternalLinkIndex(bookName, tables); if (index != -1) return index;
@Override public ExternalSheet getExternalSheet(String firstSheetName, String lastSheetName, int externalWorkbookNumber) { String workbookName; if (externalWorkbookNumber > 0) { // External reference - reference is 1 based, link table is 0 based int linkNumber = externalWorkbookNumber - 1; ExternalLinksTable linkTable = _uBook.getExternalLinksTable().get(linkNumber); workbookName = linkTable.getLinkedFileName(); } else { // Internal reference workbookName = null; } if (lastSheetName == null || firstSheetName.equals(lastSheetName)) { return new ExternalSheet(workbookName, firstSheetName); } else { return new ExternalSheetRange(workbookName, firstSheetName, lastSheetName); } }
@Override public ExternalName getExternalName(String nameName, String sheetName, int externalWorkbookNumber) { if (externalWorkbookNumber > 0) { // External reference - reference is 1 based, link table is 0 based int linkNumber = externalWorkbookNumber - 1; ExternalLinksTable linkTable = _uBook.getExternalLinksTable().get(linkNumber); for (org.apache.poi.ss.usermodel.Name name : linkTable.getDefinedNames()) { if (name.getNameName().equals(nameName)) { // HSSF returns one sheet higher than normal, and various bits // of the code assume that. So, make us match that behaviour! int nameSheetIndex = name.getSheetIndex() + 1; // TODO Return a more specialised form of this, see bug #56752 // Should include the cached values, for in case that book isn't available // Should support XSSF stuff lookups return new ExternalName(nameName, -1, nameSheetIndex); } } throw new IllegalArgumentException("Name '"+nameName+"' not found in " + "reference to " + linkTable.getLinkedFileName()); } else { // Internal reference int nameIdx = _uBook.getNameIndex(nameName); return new ExternalName(nameName, nameIdx, 0); // TODO Is this right? } }
String tableName = paths.get(1).split("\\[")[0]; if (wb instanceof XSSFWorkbook) { ExternalLinksTable link = ((XSSFWorkbook) wb).getExternalLinksTable().get(externalLinkNumber); File file = new File(XLSCache.getWorkbookPath(wb)); XSSFWorkbook childWb = (XSSFWorkbook) XLSCache.getWorkbook(file.getParent() + "/" + link.getLinkedFileName()); ExternalLinksTable link = ((XSSFWorkbook) wb).getExternalLinksTable().get(Integer.valueOf(paths.get(0)) - 1); File file = new File(XLSCache.getWorkbookPath(wb)); XSSFWorkbook childWb = (XSSFWorkbook) XLSCache.getWorkbook(file.getParent() + "/" + link.getLinkedFileName());
String tableName = paths.get(1).split("\\[")[0]; if (wb instanceof XSSFWorkbook) { ExternalLinksTable link = ((XSSFWorkbook) wb).getExternalLinksTable().get(externalLinkNumber); File file = new File(XLSCache.getWorkbookPath(wb)); XSSFWorkbook childWb = (XSSFWorkbook) XLSCache.getWorkbook(file.getParent() + "/" + link.getLinkedFileName()); ExternalLinksTable link = ((XSSFWorkbook) wb).getExternalLinksTable().get(Integer.valueOf(paths.get(0)) - 1); File file = new File(XLSCache.getWorkbookPath(wb)); XSSFWorkbook childWb = (XSSFWorkbook) XLSCache.getWorkbook(file.getParent() + "/" + link.getLinkedFileName());