Разорвать ссылку на внешнюю ссылку в Excel с помощью Apache POIJAVA

Программисты JAVA общаются здесь
Anonymous
Разорвать ссылку на внешнюю ссылку в Excel с помощью Apache POI

Сообщение Anonymous »

Можно ли удалить ссылки на книгу (внешние ссылки) с помощью Apache POI в Java? Я понимаю, что Excel предоставляет возможность вручную разрывать ссылки на внешние книги, но есть ли способ программно идентифицировать и удалять внешние ссылки (формулы или именованные диапазоны, ссылающиеся на другие книги) с помощью Apache POI?

Код: Выделить всё

public static void breakExternalLinks(String inputFilePath, String outputFilePath) throws IOException {
// Load the Excel workbook
FileInputStream fis = new FileInputStream(inputFilePath);
XSSFWorkbook workbook = new XSSFWorkbook(fis);

// Break external links in formulas by replacing them with their current values
breakFormulaLinks(workbook);

// Remove external references in named ranges
removeExternalNamedRanges(workbook);

// Save the updated workbook
FileOutputStream fos = new FileOutputStream(outputFilePath);
workbook.write(fos);

// Close resources
fos.close();
fis.close();
workbook.close();
}

private static void breakFormulaLinks(XSSFWorkbook workbook) {
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
evaluator.setIgnoreMissingWorkbooks(true); // Ignore missing external workbooks

for (Sheet sheet : workbook) {
for (Row row : sheet) {
for (Cell cell : row) {
if (cell.getCellType() == CellType.FORMULA) {
try {
// Evaluate the formula and replace it with the calculated value
CellValue cellValue = evaluator.evaluate(cell);
switch (cellValue.getCellType()) {
case BOOLEAN:
cell.setCellValue(cellValue.getBooleanValue());
break;
case NUMERIC:
cell.setCellValue(cellValue.getNumberValue());
break;
case STRING:
cell.setCellValue(cellValue.getStringValue());
break;
case ERROR:
cell.setCellErrorValue(cellValue.getErrorValue());
break;
case BLANK:
cell.setBlank();
break;
}
} catch (Exception e) {
System.out.println("Error evaluating formula in cell " + cell.getAddress() + ": " + e.getMessage());
}
}
}
}
}
}

private static void removeExternalNamedRanges(XSSFWorkbook workbook) {
// Collect all named ranges with external references
List namesToRemove = new ArrayList();

// Iterate over all named ranges in the workbook
for (XSSFName name : workbook.getAllNames()) {
// Check if the name refers to an external workbook (contains a [ symbol)
if (name.getRefersToFormula() != null && name.getRefersToFormula().contains("[")) {
namesToRemove.add(name);
}
}

// Remove all external references from named ranges
for (XSSFName name : namesToRemove) {
workbook.removeName(name);
}
}

Здесь прикреплены изображения, связанные с проблемой.

Подробнее здесь: https://stackoverflow.com/questions/789 ... apache-poi

Вернуться в «JAVA»