Один из наших клиентов – финансовый специалист, который управляет финансовыми рисками для своих клиентов. Он разрабатывает инструмент на основе 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”