В файле, который вы собрали прошлыми уроками, живут три слоя: данные, оформление и удобство вроде закреплённой шапки. Четвёртый слой — правила игры для получателя: он может смотреть файл, пользоваться фильтром, заполнять ячейки ввода, но не может переписать заголовки, стереть формулы или удалить колонку. Защита в xlsx устроена не как пароль на архив, а как набор флагов в разметке листа: Excel при открытии читает флаги и отказывается выполнять запрещённые действия. Это значит, что сила защиты — в интерфейсе офисного пакета, а не в самом файле, и об этой границе мы поговорим отдельно и без умолчаний. Защита бывает двух уровней: на листе блокируются ячейки и действия со строками и колонками, на книге — структурные операции вроде удаления листов. Оба уровня ставятся вызовами excelize, оба снимаются тоже вызовами, и оба не шифруют содержимое. Разберём сначала лист, потом разблокированные ячейки, потом книгу, а в конце — чтение защищённого файла своими программами.
ProtectSheet: excelize защита листа за один вызов#
Метод f.ProtectSheet принимает имя листа и указатель на структуру SheetProtectionOptions — в ней пароль, алгоритм хеширования и набор прав. В версиях до 2.9 сигнатура была проще: лист, пароль строкой и необязательный алгоритм; в свежих релизах права разложены по полям, и примеры курса используют новую форму. Семантика полей прав — разрешения: true означает, что действие пользователю доступно, и по умолчанию большинство прав выключено, то есть действия запрещены. Если указать пароль и не указать алгоритм, excelize запишет старый совместимый хеш XOR; поле AlgorithmName со значением вроде SHA-256 или SHA-512 включит современный хеш с солью. Пароль в файле хранится не как текст, а как хеш: Excel сверяет введённую строку с хешем при попытке снять защиту. Запрос excelize защита листа на практике сводится к одной паре вызовов: ProtectSheet на лист с нужными правами и при необходимости UnprotectSheet для снятия — остальное делают поля структуры.
Защита листа с паролем и правами
GOif err := f.ProtectSheet("Отчёт", &excelize.SheetProtectionOptions{
Password: "qwerty-2024",
AlgorithmName: "SHA-256",
FormatCells: true,
AutoFilter: true,
}); err != nil {
panic(err)
}Лист Отчёт защищён паролем: править ячейки, вставлять и удалять строки и колонки пользователь не сможет. Поля FormatCells и AutoFilter оставляют доступным форматирование и кнопки фильтра — отчёт остаётся рабочим инструментом, а не картинкой. AlgorithmName задаёт современный хеш с солью вместо совместимого XOR.
Значения ячеек лежат в файле открыто: любой читатель — excelize, парсер на другом языке, просмотрщик — вынет данные без пароля. Защита меняет права в интерфейсе Excel, но не содержимое файла. Пароль хранится хешем в разметке листа, и совместимый хеш XOR подбирается мгновенно, а современные SHA-256 и SHA-512 защищают от случайных правок, но не от чтения. Если файлу нужно именно шифрование, его делает офисный пакет при сохранении — это отдельный механизм, а не ProtectSheet.
Разблокированные ячейки и права на действия#
По умолчанию Excel считает заблокированной каждую ячейку листа: флаг locked живёт в стиле ячейки и до защиты листа никак не проявляется. Поэтому первый практический вопрос — форма ввода: нужно разрешить пользователю заполнять колонку данных, а всё остальное держать под замком. Разблокировка делается стилем: в структуре Style есть поле Protection с двумя булевыми флагами — Locked и Hidden. Стиль с Locked false прикладывается SetCellStyle к диапазону ввода, и после ProtectSheet править можно только эти ячейки. Поле Hidden той же структуры прячет содержимое строки формул — приём для колонок с формулами, которые не должны быть видны, хотя встречается реже. Права на действия настраиваются полями SheetProtectionOptions: разрешите форматирование, если пользователь красит строки, разрешите фильтр, если он отбирает данные, и оставьте запрещёнными вставку и удаление строк, чтобы структура отчёта не расползалась. Так запрос protectsheet превращается в форму: что можно трогать, а что нет.
Форма ввода на защищённом листе
GOinput, _ := 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 |
| FormatCells | true | разрешает менять форматирование ячеек |
| AutoFilter | true | разрешает пользоваться фильтром |
| InsertRows | false | запрет вставки строк — структура стабильна |
| SelectLockedCells | true | разрешает выделять защищённые ячейки |
GetRows, GetCellValue и весь набор чтения работают по защищённому листу как по обычному: флаги защиты не фильтруют доступ к данным и вашим тестам незаметны. Защита адресована человеку в интерфейсе Excel — программы и парсер читают файл целиком. Отсюда практический вывод: защищать лист от машины бессмысленно, а от человека — полезно; для секретности данных нужны другие механизмы.
Чек-лист защиты#
- ProtectSheet принимает лист и указатель на SheetProtectionOptions: пароль, алгоритм, права.
- Поля прав — разрешения: true оставляет действие доступным, по умолчанию действия запрещены.
- Ячейку можно править при защите, если её стиль несёт Protection с Locked false.
- UnprotectSheet снимает защиту; опциональный пароль включает проверку по хешу.
- ProtectWorkbook с LockStructure блокирует правки состава листов книги.
- Защита не шифрует: значения читаются любым парсером без пароля.
ProtectSheet и ProtectWorkbook работают с книгой, поэтому в браузерной песочнице не запускаются: там доступны fmt, strings, strconv, math, sort, errors и time без файлового ввода-вывода. Разминка на тему защиты живёт на структурах: опишите структуру прав с булевыми полями, напишите функцию, которая сводит их в список разрешений и запретов, и напечатайте результат — логика та же, что у SheetProtectionOptions, а файл соберите локально.
Кейс про форму ввода, которая выжила после защиты. Бухгалтерия получала еженедельный файл с ценами: колонки с наименованиями и остатками заполняла программа, а менеджер вписывал закупочные цены и комментарий. Без защиты менеджер однажды сдвинул шапку на строку ниже, формулы итогов поехали, и месяц отчётности посчитался вдвое. Решение заняло час: все ячейки, кроме диапазона ввода, остались заблокированными, диапазон получил стиль с Locked false и жёлтую заливку, лист защитили паролем с разрешённым форматированием — менеджер красит строки, но структуру трогать не может. Через месяц добавили и защиту книги с LockStructure: кто-то из соседей по опенспейсу скрывал лист Данные, чтобы не мешал, и формулы падали. Спорная сторона осталась: пароль лежит в коде генератора в открытом виде, и часть команды считает это недоразумением — защита от случайных правок, поэтому и пароль публике известен; другой подход держит пароль в конфиге и меняет его по регламенту. Обе стороны согласны в главном: цель — не секрет, а сохранность структуры.
Проверка: что блокирует защита
Лист защищён ProtectSheet с паролем и без полей-разрешений. Что произойдёт при попытке пользователя отредактировать ячейку в Excel?
Проверка: чтение без пароля
Парсер читает защищённый лист через GetRows, пароля у него нет. Что он получит?
Что напечатает запись в защищённый лист?
Прочитайте код и выберите, что он выведет:
f.SetCellValue("Отчёт", "B2", 100)
f.ProtectSheet("Отчёт", &excelize.SheetProtectionOptions{
Password: "key",
})
err := f.SetCellValue("Отчёт", "B2", 200)
fmt.Println(err)Соберите защиту формы ввода
Допишите метод защиты, имя поля пароля и снятие защиты.
Соберите порядок защиты
Расставьте строки в порядке выполнения: записать данные, разблокировать ячейки ввода, защитить лист, сохранить файл, снять защиту, закрыть книгу.
Строки
Ваша программа
Нажимайте на строки слева, чтобы собрать программу
Карточки: защита
Правила игры расставлены: лист защищён, ячейки ввода разблокированы, структура книги под замком, а честная граница темы — отсутствие шифрования — названа прямо. Слой удобства и защиты закрыт, дальше курс поворачивает к объёмам: в уроке про StreamWriter выгрузка в сотни тысяч строк соберётся потоком без укладки всего листа в память, а тема закрепления из прошлого урока рядом — защищённый лист с закреплённой шапкой и есть финальная форма отчёта для человека. Состав книги и порядок листов вспомнятся из урока про листы книги — теперь вы знаете, как их ещё и защитить, а прозрачность защиты для чтения ложится на материал про чтение ячеек. Типовые ловушки вокруг прав и стилей собраны в уроке про ошибки. Домашнее задание — разблокировать одну колонку и защитить лист паролем.
Песочница урока
Редактируйте код и запускайте его прямо здесь — интерпретатор работает в браузере, ничего устанавливать не нужно. За каждый запуск — +2 XP.
Запустите код, чтобы увидеть вывод.
Коротко: что запомнить
- ProtectSheet включает защиту листа: пароль, алгоритм хеша и права-разрешения в SheetProtectionOptions.
- Поля прав работают как разрешения: true оставляет действие доступным, по умолчанию действия запрещены.
- Разблокированная ячейка — стиль с Protection Locked false: диапазон ввода правят при защищённом листе.
- UnprotectSheet снимает защиту; опциональный пароль включает проверку, без него — без вопросов.
- ProtectWorkbook с LockStructure защищает состав книги от структурных правок.
- Защита не шифрует: данные читаются без пароля, а excelize пишет в защищённый лист свободно.
Домашнее задание
Возьмите свой отчёт из прошлых уроков: выделите колонку, которую пользователь должен заполнять руками, разблокируйте её стилем с Protection Locked false и подсветите заливкой, затем защитите лист ProtectSheet с паролем и разрешённым форматированием. Откройте файл в Excel, попробуйте поправить заблокированную ячейку и шапку, заполните разблокированную, после чего снимите защиту UnprotectSheet и убедитесь, что чтение GetRows работало одинаково до и после защиты.
Личные заметкиПусто
Вопросы и ответы по уроку
ProtectSheet не защищает лист — что проверить?
В версиях до 2.9 сигнатура другая: ProtectSheet принимает пароль строкой, а не структуру опций. Проверьте версию библиотеки и форму вызова, а после защиты откройте файл в Excel — флаг защиты проявляется в интерфейсе, excelize при записи его не проверяет.
Можно ли защитить лист так, чтобы данные никто не увидел?
Нет: защита листа не шифрует файл, значения лежат в разметке открыто и читаются любым парсером без пароля. Для секретности шифруйте файл средствами Excel при сохранении или храните данные в защищённом контуре, а в выгрузку кладите только то, что адресат вправе видеть.
Пароль от листа потерян — файл теперь не перегенерировать?
Перегенерировать можно: ваш код собирает файл заново, а UnprotectSheet без пароля снимает защиту без проверки, потому что шифрования нет. Проблема потерянного пароля касается только ручных правок в Excel — там пароль запрашивается при снятии защиты.
Термины урока
Ключевые понятия из этого урока — короткие определения в глоссарии. Наведите на термин, чтобы вспомнить, откройте карточку для подробностей и ссылки на практику.
Изучайте дальше
Следующая ступень учебного пути
Фоновые задачи в Go: планировщик на robfig/cron
Курс по cron в Go: robfig/cron v3, синтаксис выражений, пояса, wrappers, конкурентность и graceful shutdown. 25 уроков с примерами и проектом.
- Собирать планировщик на robfig/cron v3 и запускать задачи по расписанию
- Читать и писать cron-выражения: пять полей, спецсимволы, @daily
- Управлять жизненным циклом: Start, Stop, Entry, Remove
- Держать часовые пояса и секундные расписания под контролем