Принудительный полный расчет всей книги в Coldfusion / Apache POI - PullRequest
3 голосов
/ 03 апреля 2012

Учитывая рабочую книгу с формулами кросс-листа, сгенерированными Coldfusion 9 через Apache POI.

Я хочу программно заставить всю книгу выполнить «полный расчет с перестроением дерева зависимостей» перед сохранение книги на диск.

Чтобы мои конечные пользователи открывали электронную таблицу, им не нужно было нажимать Ctrl - Alt - Shift - F9 .

Как мне сделать это в coldfusion?

Ссылки:

1 Ответ

7 голосов
/ 03 апреля 2012

К сожалению, на этот вопрос нет простого ответа.

Вариант 1:

Я думаю, что самый короткий путь должен использовать CreationHelper.createFormulaEvaluator().evaluateAll(). К сожалению, это не доступно в CF9. Этот метод был добавлен в более позднюю версию POI, чем та, которая поставляется с CF9. То же относится и к setForceFormulaRecalculation(). Возможно, вы могли бы использовать JavaLoader.cfc для загрузки более новой версии POI. Тогда у вас будет доступ к этим методам. Но это может быть более сложным, чем вы хотите для этой задачи.

Вариант 2:

В противном случае, если вы знаете правильную последовательность, вы можете перебирать листы и пересчитывать формулы для каждого из них:

wb = sheet.getWorkBook();
evaluator = wb.getCreationHelper().createFormulaEvaluator();
// you could also use an array of sheet names instead
for(sheetNum = 0; sheetNum < wb.getNumberOfSheets(); sheetNum++) {
    poiSheet = wb.getSheetAt(sheetNum);
    rows = poiSheet.rowIterator();
    while (rows.hasNext()) {
        r = rows.next();
        cells = r.cellIterator();
        while (cells.hasNext()) {
            c = cells.next();
            if (c.getCellType() == c.CELL_TYPE_FORMULA) {
                evaluator.evaluateFormulaCell(c);
            }
        }
    }
}

Вариант 3:

Другая возможность - заполнить шаблон макросом, который автоматически пересчитывает при открытии книги . Очевидным недостатком является то, что он опирается на макрос. Но так как это выполняется самим Excel, это, вероятно, самый надежный / надежный вариант.

...