Excel не оценивает ячейки формул в защищенном режиме. Формулы могут потреблять значительную вычислительную мощность на клиентском устройстве, а также могут пытаться импортировать внешние данные, что создает потенциальную угрозу безопасности.
Вместо этого в защищенном режиме Excel отобразит кэшированное значение, если оно уже было вычислено, в противном случае значение по умолчанию, 0.00
в вашем случае.
Возьмите эту формулу, например, C1 = A1 + B1
.
Предполагая вы используете формат .xlsx, данные рабочего листа хранятся внутри в такой структуре:
...
<!-- worksheet.xlsx!xl/worksheets/sheet1.xml -->
<sheetData>
<row r="1">
<c r="A1" t="n">
<v>1.0</v>
</c>
<c r="B1" t="n">
<v>2.0</v>
</c>
<c r="C1" t="n">
<f>A1 + B1</f>
<v>3.0</v> <!-- This is the cached formula result -->
</c>
</row>
</sheetData>
...
В этом примере <v>3.0</v>
- значение ячейки кэшированной формулы.
Вы можете используйте POI XSSFFormulaEvaluator
, чтобы оценить ячейку формулы и сохранить кэшированное значение, чтобы оно было доступно в защищенном режиме Excel.
// evaluate all formulas in the workbook
XSSFFormulaEvaluator evaluator = new XSSFFormulaEvaluator(workbook);
evaluator.evaluateAll();
Еще несколько примечаний:
evaluateAll()
необходимо выполнить только один раз перед сохранением книги. См. https://poi.apache.org/components/spreadsheet/eval.html#recalculation для получения дополнительной информации. - POI может оценивать большинство, но не все формулы Excel.