Рубрики
Без рубрики

Защита формул в веб-приложении для работы с электронными таблицами

История пользователя Один из наших клиентов – финансовый специалист, который управляет финансовыми рисками… С тегами web, java, электронная таблица, excel.

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