Перейти к содержимому
ГоМастер

Поиск по урокам

Найдите урок, курс, термин или раздел

Урок 16 из 25 ~14 мин +20 XP

Защита листа и книги

Запрос excelize защита листа приходит обычно после первого инцидента: получатель отчёта поправил формулу в итоговой строке, пересохранил файл, и дальше по цепочке разошлись цифры, которые никто не считал. Защита листа в xlsx работает как замок на двери кабинета: содержимое она не прячет, а мешает случайным и намеренным правкам через интерфейс Excel. В уроке разберём ProtectSheet с паролем и набором разрешений, разблокированные ячейки для пользовательского ввода, снятие защиты UnprotectSheet, защиту структуры книги ProtectWorkbook и честную границу темы: что защита не делает с данными и почему парсер прочитает файл без всякого пароля.

Содержание урока · 9 разделов

В файле, который вы собрали прошлыми уроками, живут три слоя: данные, оформление и удобство вроде закреплённой шапки. Четвёртый слой — правила игры для получателя: он может смотреть файл, пользоваться фильтром, заполнять ячейки ввода, но не может переписать заголовки, стереть формулы или удалить колонку. Защита в xlsx устроена не как пароль на архив, а как набор флагов в разметке листа: Excel при открытии читает флаги и отказывается выполнять запрещённые действия. Это значит, что сила защиты — в интерфейсе офисного пакета, а не в самом файле, и об этой границе мы поговорим отдельно и без умолчаний. Защита бывает двух уровней: на листе блокируются ячейки и действия со строками и колонками, на книге — структурные операции вроде удаления листов. Оба уровня ставятся вызовами excelize, оба снимаются тоже вызовами, и оба не шифруют содержимое. Разберём сначала лист, потом разблокированные ячейки, потом книгу, а в конце — чтение защищённого файла своими программами.

ProtectSheet: excelize защита листа за один вызов#

Метод f.ProtectSheet принимает имя листа и указатель на структуру SheetProtectionOptions — в ней пароль, алгоритм хеширования и набор прав. В версиях до 2.9 сигнатура была проще: лист, пароль строкой и необязательный алгоритм; в свежих релизах права разложены по полям, и примеры курса используют новую форму. Семантика полей прав — разрешения: true означает, что действие пользователю доступно, и по умолчанию большинство прав выключено, то есть действия запрещены. Если указать пароль и не указать алгоритм, excelize запишет старый совместимый хеш XOR; поле AlgorithmName со значением вроде SHA-256 или SHA-512 включит современный хеш с солью. Пароль в файле хранится не как текст, а как хеш: Excel сверяет введённую строку с хешем при попытке снять защиту. Запрос excelize защита листа на практике сводится к одной паре вызовов: ProtectSheet на лист с нужными правами и при необходимости UnprotectSheet для снятия — остальное делают поля структуры.

Защита листа с паролем и правами

GO
if err := f.ProtectSheet("Отчёт", &excelize.SheetProtectionOptions{
    Password:      "qwerty-2024",
    AlgorithmName: "SHA-256",
    FormatCells:   true,
    AutoFilter:    true,
}); err != nil {
    panic(err)
}

Лист Отчёт защищён паролем: править ячейки, вставлять и удалять строки и колонки пользователь не сможет. Поля FormatCells и AutoFilter оставляют доступным форматирование и кнопки фильтра — отчёт остаётся рабочим инструментом, а не картинкой. AlgorithmName задаёт современный хеш с солью вместо совместимого XOR.

Разблокированные ячейки и права на действия#

По умолчанию Excel считает заблокированной каждую ячейку листа: флаг locked живёт в стиле ячейки и до защиты листа никак не проявляется. Поэтому первый практический вопрос — форма ввода: нужно разрешить пользователю заполнять колонку данных, а всё остальное держать под замком. Разблокировка делается стилем: в структуре Style есть поле Protection с двумя булевыми флагами — Locked и Hidden. Стиль с Locked false прикладывается SetCellStyle к диапазону ввода, и после ProtectSheet править можно только эти ячейки. Поле Hidden той же структуры прячет содержимое строки формул — приём для колонок с формулами, которые не должны быть видны, хотя встречается реже. Права на действия настраиваются полями SheetProtectionOptions: разрешите форматирование, если пользователь красит строки, разрешите фильтр, если он отбирает данные, и оставьте запрещёнными вставку и удаление строк, чтобы структура отчёта не расползалась. Так запрос protectsheet превращается в форму: что можно трогать, а что нет.

Форма ввода на защищённом листе

GO
input, _ := f.NewStyle(&excelize.Style{
    Protection: &excelize.Protection{Locked: false},
    Fill: excelize.Fill{Type: "pattern", Pattern: 1,
        Color: []string{"FFF7CC"}},
})

f.SetCellStyle("Отчёт", "C2", "C21", input)

if err := f.ProtectSheet("Отчёт", &excelize.SheetProtectionOptions{
    Password: "qwerty-2024",
}); err != nil {
    panic(err)
}

Ячейки C2:C21 разблокированы и подсвечены жёлтым: при защищённом листе пользователь заполняет только их. Разблокировка живёт в стиле, поэтому новый стиль создаётся NewStyle и прикладывается до ProtectSheet — лист защищается последним, когда все стили уже расставлены.

UnprotectSheet: снятие защиты и пароль#

Обратная операция — f.UnprotectSheet с именем листа. Без второго аргумента метод снимает защиту без проверки пароля: excelize правит разметку напрямую, и вашим скриптам перегенерации пароль не нужен — соберите файл заново, вызовите UnprotectSheet, если защита попала в шаблон, и лист вернётся к обычному состоянию. С необязательным паролем метод работает строже: он сверит строку с хешем в файле и вернёт ошибку при несовпадении — приём для утилит, которые снимают защиту только зная ключ. Забытый пароль для своего же файла — тоже не преграда: код с UnprotectSheet без пароля снимет защиту, ведь шифрования нет, есть только флаг. Отдельно держите в голове версию библиотеки: в релизах до 2.9 ProtectSheet принимала пароль строкой вторым аргументом, и старые сниппеты с форумов не скомпилируются без правки — сигнатуры проверяйте по документации своей версии.

ProtectWorkbook: защита структуры книги#

Второй уровень — защита книги: она не про ячейки, а про состав файла. Вызов f.ProtectWorkbook с указателем на WorkbookProtectionOptions блокирует структурные операции: добавление, удаление, переименование, скрытие и перестановку листов. Поле LockStructure включает запрет структурных правок, LockWindows фиксирует положение окна при открытии, пароль и алгоритм задаются так же, как на листе, — только без алгоритма пароль книги хешируется SHA-512. Типичный сценарий — отчётник с листами Данные, Расчёт и Итоги: структура важна для формул, и удаление листа ломает весь файл, поэтому структура под замком, а ячейки листа Итоги редактируются свободно. Снимается защита книги вызовом UnprotectWorkbook, который с опциональным паролем проверяет его так же, как UnprotectSheet. Защита книги не блокирует чтение значений и не мешает вашим программам — как и защита листа, она адресована человеку в Excel.

Поля SheetProtectionOptions#

ПолеПримерСмысл
Password"qwerty-2024"пароль защиты листа
AlgorithmName"SHA-256"хеш пароля; без поля — совместимый XOR
FormatCellstrueразрешает менять форматирование ячеек
AutoFiltertrueразрешает пользоваться фильтром
InsertRowsfalseзапрет вставки строк — структура стабильна
SelectLockedCellstrueразрешает выделять защищённые ячейки

Чек-лист защиты#

  • ProtectSheet принимает лист и указатель на SheetProtectionOptions: пароль, алгоритм, права.
  • Поля прав — разрешения: true оставляет действие доступным, по умолчанию действия запрещены.
  • Ячейку можно править при защите, если её стиль несёт Protection с Locked false.
  • UnprotectSheet снимает защиту; опциональный пароль включает проверку по хешу.
  • ProtectWorkbook с LockStructure блокирует правки состава листов книги.
  • Защита не шифрует: значения читаются любым парсером без пароля.

Кейс про форму ввода, которая выжила после защиты. Бухгалтерия получала еженедельный файл с ценами: колонки с наименованиями и остатками заполняла программа, а менеджер вписывал закупочные цены и комментарий. Без защиты менеджер однажды сдвинул шапку на строку ниже, формулы итогов поехали, и месяц отчётности посчитался вдвое. Решение заняло час: все ячейки, кроме диапазона ввода, остались заблокированными, диапазон получил стиль с Locked false и жёлтую заливку, лист защитили паролем с разрешённым форматированием — менеджер красит строки, но структуру трогать не может. Через месяц добавили и защиту книги с LockStructure: кто-то из соседей по опенспейсу скрывал лист Данные, чтобы не мешал, и формулы падали. Спорная сторона осталась: пароль лежит в коде генератора в открытом виде, и часть команды считает это недоразумением — защита от случайных правок, поэтому и пароль публике известен; другой подход держит пароль в конфиге и меняет его по регламенту. Обе стороны согласны в главном: цель — не секрет, а сохранность структуры.

Проверка: что блокирует защита

Лист защищён ProtectSheet с паролем и без полей-разрешений. Что произойдёт при попытке пользователя отредактировать ячейку в Excel?

Проверка: чтение без пароля

Парсер читает защищённый лист через GetRows, пароля у него нет. Что он получит?

Что напечатает запись в защищённый лист?

Прочитайте код и выберите, что он выведет:

f.SetCellValue("Отчёт", "B2", 100)

f.ProtectSheet("Отчёт", &excelize.SheetProtectionOptions{
    Password: "key",
})

err := f.SetCellValue("Отчёт", "B2", 200)
fmt.Println(err)

Соберите защиту формы ввода

Допишите метод защиты, имя поля пароля и снятие защиты.

f.("Отчёт", &excelize.SheetProtectionOptions{ : "qwerty-2024", AlgorithmName: "SHA-256", FormatCells: true, }) // ... правки файла своей программой ... f.("Отчёт")

Соберите порядок защиты

Расставьте строки в порядке выполнения: записать данные, разблокировать ячейки ввода, защитить лист, сохранить файл, снять защиту, закрыть книгу.

Строки

Ваша программа

Нажимайте на строки слева, чтобы собрать программу

Карточки: защита

Термин

ProtectSheet

нажмите, чтобы перевернуть
Определение

Включает защиту листа: лист и указатель на SheetProtectionOptions с паролем, алгоритмом и правами-разрешениями.

1 / 6

Правила игры расставлены: лист защищён, ячейки ввода разблокированы, структура книги под замком, а честная граница темы — отсутствие шифрования — названа прямо. Слой удобства и защиты закрыт, дальше курс поворачивает к объёмам: в уроке про StreamWriter выгрузка в сотни тысяч строк соберётся потоком без укладки всего листа в память, а тема закрепления из прошлого урока рядом — защищённый лист с закреплённой шапкой и есть финальная форма отчёта для человека. Состав книги и порядок листов вспомнятся из урока про листы книги — теперь вы знаете, как их ещё и защитить, а прозрачность защиты для чтения ложится на материал про чтение ячеек. Типовые ловушки вокруг прав и стилей собраны в уроке про ошибки. Домашнее задание — разблокировать одну колонку и защитить лист паролем.

Песочница урока

Редактируйте код и запускайте его прямо здесь — интерпретатор работает в браузере, ничего устанавливать не нужно. За каждый запуск — +2 XP.

Вывод

Запустите код, чтобы увидеть вывод.

Коротко: что запомнить

  • ProtectSheet включает защиту листа: пароль, алгоритм хеша и права-разрешения в SheetProtectionOptions.
  • Поля прав работают как разрешения: true оставляет действие доступным, по умолчанию действия запрещены.
  • Разблокированная ячейка — стиль с Protection Locked false: диапазон ввода правят при защищённом листе.
  • UnprotectSheet снимает защиту; опциональный пароль включает проверку, без него — без вопросов.
  • ProtectWorkbook с LockStructure защищает состав книги от структурных правок.
  • Защита не шифрует: данные читаются без пароля, а excelize пишет в защищённый лист свободно.

Домашнее задание

Возьмите свой отчёт из прошлых уроков: выделите колонку, которую пользователь должен заполнять руками, разблокируйте её стилем с Protection Locked false и подсветите заливкой, затем защитите лист ProtectSheet с паролем и разрешённым форматированием. Откройте файл в Excel, попробуйте поправить заблокированную ячейку и шапку, заполните разблокированную, после чего снимите защиту UnprotectSheet и убедитесь, что чтение GetRows работало одинаково до и после защиты.

Личные заметкиПусто
Хранятся только в вашем браузере (Excelize · Защита листа и книги)

Вопросы и ответы по уроку

ProtectSheet не защищает лист — что проверить?

В версиях до 2.9 сигнатура другая: ProtectSheet принимает пароль строкой, а не структуру опций. Проверьте версию библиотеки и форму вызова, а после защиты откройте файл в Excel — флаг защиты проявляется в интерфейсе, excelize при записи его не проверяет.

Можно ли защитить лист так, чтобы данные никто не увидел?

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

Пароль от листа потерян — файл теперь не перегенерировать?

Перегенерировать можно: ваш код собирает файл заново, а UnprotectSheet без пароля снимает защиту без проверки, потому что шифрования нет. Проблема потерянного пароля касается только ручных правок в Excel — там пароль запрашивается при снятии защиты.

Термины урока

Ключевые понятия из этого урока — короткие определения в глоссарии. Наведите на термин, чтобы вспомнить, откройте карточку для подробностей и ссылки на практику.

Следующая ступень учебного пути

Cron25 уроков~9 чпрактика25 уроков уже доступны

Фоновые задачи в Go: планировщик на robfig/cron

Курс по cron в Go: robfig/cron v3, синтаксис выражений, пояса, wrappers, конкурентность и graceful shutdown. 25 уроков с примерами и проектом.

  • Собирать планировщик на robfig/cron v3 и запускать задачи по расписанию
  • Читать и писать cron-выражения: пять полей, спецсимволы, @daily
  • Управлять жизненным циклом: Start, Stop, Entry, Remove
  • Держать часовые пояса и секундные расписания под контролем