Один из наших клиентов – финансовый специалист, который управляет финансовыми рисками для своих клиентов. Он разрабатывает инструмент на основе Excel для анализа рисков инвестиций и прогнозирования рыночных тенденций. Он создает множество ценных формул в своем файле Excel, которые помогают ему выполнять эту работу.
Теперь он планирует превратить этот инструмент в веб-приложение, которое позволяет пользователям вводить финансовые данные и выдает результат анализа рисков. Но он хочет скрыть свои ценные формулы, так как это его коммерческая тайна.
Мы можем реализовать его план с помощью Keikai . Общая идея этой системы такова:
Поэтому я создаю файл xlsx с 3 листами:
- исходный лист : принимать вводимые пользователем данные
- преобразовать лист : вычислять результаты с помощью формул, ссылаясь на ячейки исходного листа. Чтобы защитить ценные формулы, этот лист скрыт от пользователей.
- лист отображения : отображение результатов расчета для пользователей.
Указав путь к файлу xlsx, я могу импортировать его в Keikai .
dataTransform.zul
Поскольку Kekkai поддерживает шаблон MVC, я также могу применить Controller Data Transform Composer
для управления Keikai и прослушивания событий в Java API.
Это импортированный результат в браузере:
Как вы можете видеть на скриншоте, вкладки “Лист” нет. Keikai позволяет скрыть вкладку листа. Следовательно, пользователи не могут переключиться на лист, содержащий формулы.
Keikai поддерживает большинство функций Excel (более 250) и синтаксис. Keikai может импортировать формулы, которые вы пишете в Excel, без каких-либо изменений, и они будут работать так, как были.
Я не хочу, чтобы пользователи произвольно меняли мой лист, поэтому я хочу включить защиту листа. Перед этим мне нужно создать Sheet Protection
с соответствующими разрешениями. Есть 14 разрешений на выбор. Kekkai предоставляет API шаблонов Builder, поэтому я могу просто настроить те разрешения, которые мне нужны:
private static final SheetProtection VIEW_ONLY = SheetProtection.Builder.create() .withSelectLockedCellsAllowed(true) .withSelectUnlockedCellsAllowed(true) .withAutoFilterAllowed(true) .build();
Когда я включаю защиту листа в цикле с помощью Защита листа
:
private void protectAllSheets() { for (int i = 0; i < spreadsheet.getBook().getNumberOfSheets(); i++) { Ranges.range(spreadsheet.getBook().getSheetAt(i)).protectSheet(VIEW_ONLY); } }
Незапертые ячейки
Под защитой листа каждая ячейка доступна только для чтения. Но мне все еще нужно принимать пользовательский ввод в исходном листе, поэтому мне нужно установить несколько ячеек как разблокированные в Excel, чтобы сделать их доступными для редактирования. Просто откройте формат ячейки/Защита, снимите флажок “Заблокировано”.:
Есть 2 ячейки, работающие как кнопки. Когда пользователи нажимают на них, Keikai вычисляет и показывает результат. Я должен реализовать эту логику в своем классе контроллера с помощью приведенного ниже кода:
@Listen(Events.ON_CELL_CLICK + "=spreadsheet") public void onCellClick(CellMouseEvent e) { String sheetName = e.getSheet().getSheetName(); switch (sheetName) { case SOURCE_SHEET : if(e.getRow() == 14 && e.getColumn() == 2) simpleWorkflow(); if(e.getRow() == 16 && e.getColumn() == 2) complexWorkflow(); break; } }
@Слушать(События.ON_CELL_CLICK +")
заключается в регистрацииON_CELL_CLICK
прослушивателя событий, методаonCellClick()
, для компонентаэлектронная таблица
. Поэтому, когда пользователь нажимает на ячейку, он вызываетonCellClick()
.- В этом методе прослушивания мне нужно проверить лист, строку и столбец выбранной ячейки, чтобы определить, какой рабочий процесс выполнить.
Наконец, я вызываю setSelected Sheet(SIMPLE_DISPLAY_SHEET)
, чтобы показать отображаемый лист пользователям.
private void simpleWorkflow() { spreadsheet.setSelectedSheet(SIMPLE_DISPLAY_SHEET); }
После преобразования файла xlsx в веб-приложение формулы полностью защищены. Кроме того, финансовый специалист все еще может время от времени изменять свои формулы, не меняя мой Java-код, поскольку анализ реализован в его формулах вместо Java.
Вы можете ознакомиться с полным исходным кодом по адресу Github .
Оригинал: “https://dev.to/hawkchen/protect-formulas-in-a-web-spreadsheet-application-43j0”