Excel не отображает формулы без редактирования - PullRequest
0 голосов
/ 27 мая 2020

Я создал общий c excel в Apache poi, который включает формулы, значения цен и c. Вот ожидаемый Excel (столбцы 1428,78 241 и c - это формат цены), который равен "\\" + "\u20BA" + "#,##0.00". excel format 1

Когда я загружаю Excel с моего хостинга (без домена), Excel отображается как

excel format 2

После того, как я нажму включить редактирование, они покажут. Моя проблема заключается в следующем: почему я не могу отображать свои формулы в предварительном просмотре? А также я не вижу сгенерированного Excel с моего телефона
Есть ли какие-либо настройки для рабочей книги?
Является ли хостинг без ssl или без домена причиной проблемы из-за проблем с безопасностью?

1 Ответ

2 голосов
/ 27 мая 2020

Excel не оценивает ячейки формул в защищенном режиме. Формулы могут потреблять значительную вычислительную мощность на клиентском устройстве, а также могут пытаться импортировать внешние данные, что создает потенциальную угрозу безопасности.

Вместо этого в защищенном режиме Excel отобразит кэшированное значение, если оно уже было вычислено, в противном случае значение по умолчанию, 0.00 в вашем случае.

Возьмите эту формулу, например, C1 = A1 + B1.

enter image description here

Предполагая вы используете формат .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();

Еще несколько примечаний:

  1. evaluateAll() необходимо выполнить только один раз перед сохранением книги. См. https://poi.apache.org/components/spreadsheet/eval.html#recalculation для получения дополнительной информации.
  2. POI может оценивать большинство, но не все формулы Excel.
...