---
title: "Защита листа и книги"
description: "Excelize защита листа: ProtectSheet с паролем и правами, UnprotectSheet, защита структуры книги. Что защита блокирует в Excel, а что не делает с данными."
course: "Excel в Go: чтение и генерация xlsx на excelize"
url: "https://golangmaster.ru/courses/excelize/lessons/16-zashchita-lista/"
published: "2026-09-19"
updated: "2026-09-21"
minutes: 14
---

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

*Курс «Excel в Go: чтение и генерация xlsx на excelize», урок 16 из 25. ~14 минут. Обновлено 21.09.2026. Источник: https://golangmaster.ru/courses/excelize/lessons/16-zashchita-lista/*

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

В файле, который вы собрали прошлыми уроками, живут три слоя: данные, оформление и удобство вроде закреплённой шапки. Четвёртый слой — правила игры для получателя: он может смотреть файл, пользоваться фильтром, заполнять ячейки ввода, но не может переписать заголовки, стереть формулы или удалить колонку. Защита в 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.

> **Защита — это не шифрование.** Значения ячеек лежат в файле открыто: любой читатель — excelize, парсер на другом языке, просмотрщик — вынет данные без пароля. Защита меняет права в интерфейсе Excel, но не содержимое файла. Пароль хранится хешем в разметке листа, и совместимый хеш XOR подбирается мгновенно, а современные SHA-256 и SHA-512 защищают от случайных правок, но не от чтения. Если файлу нужно именно шифрование, его делает офисный пакет при сохранении — это отдельный механизм, а не ProtectSheet.

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

По умолчанию 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 |
| 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?

- ✅ Excel откажется править и покажет подсказку про защиту листа
- Excel разрешит правку, но пометит ячейку изменённой
- Файл не откроется без пароля
- Ячейка будет видна пустой, пока защита не снята

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

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

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

- ✅ Все значения как с обычного листа
- Ошибку: чтение защищённого листа запрещено
- Пустые строки вместо значений
- Значения, но только разблокированных ячеек

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

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

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

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

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

**Что выведет программа?**

- ✅ <nil>: excelize пишет в защищённый лист без проверки
- ошибка: лист защищён паролем
- панику: запись в защищённый лист запрещена
- <nil>, но значение в файле останется сотней

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

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

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

```go
f.___("Отчёт", &excelize.SheetProtectionOptions{
    ___:           "qwerty-2024",
    AlgorithmName: "SHA-256",
    FormatCells:   true,
})

// ... правки файла своей программой ...

f.___("Отчёт")
```

Подсказка: Лист защищает ProtectSheet, поле пароля в опциях — Password, снимает защиту UnprotectSheet.

Правильные ответы в пропусках: `ProtectSheet`, `Password`, `UnprotectSheet`

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

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

Правильный порядок строк:

1. `f.SetCellValue("Отчёт", "B2", 100)`
2. `f.SetCellStyle("Отчёт", "C2", "C21", input)`
3. `f.ProtectSheet("Отчёт", &excelize.SheetProtectionOptions{Password: "key"})`
4. `err := f.SaveAs("otchet.xlsx")`
5. `f.UnprotectSheet("Отчёт")`
6. `f.Close()`

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

- **ProtectSheet** — Включает защиту листа: лист и указатель на SheetProtectionOptions с паролем, алгоритмом и правами-разрешениями.
- **SheetProtectionOptions** — Пароль и AlgorithmName задают хеш; булевы поля вроде FormatCells и AutoFilter работают как разрешения: true — действие доступно.
- **Protection в стиле** — Поле Style с флагами Locked и Hidden. Locked false разблокирует ячейку: при защите листа её можно править.
- **UnprotectSheet** — Снимает защиту листа. Без пароля — без проверки, с опциональным паролем сверяет строку с хешем и вернёт ошибку при несовпадении.
- **ProtectWorkbook** — Защита книги: LockStructure блокирует добавление, удаление, переименование и скрытие листов; UnprotectWorkbook снимает.
- **Защита и шифрование** — Защита меняет права в интерфейсе Excel, но не шифрует файл: значения читаются парсером без пароля, записи excelize флаг не проверяет.

Правила игры расставлены: лист защищён, ячейки ввода разблокированы, структура книги под замком, а честная граница темы — отсутствие шифрования — названа прямо. Слой удобства и защиты закрыт, дальше курс поворачивает к объёмам: в уроке про [StreamWriter](/courses/excelize/lessons/17-potokovyj-zapis/) выгрузка в сотни тысяч строк соберётся потоком без укладки всего листа в память, а тема закрепления из [прошлого урока](/courses/excelize/lessons/15-zakreplenie-filtry/) рядом — защищённый лист с закреплённой шапкой и есть финальная форма отчёта для человека. Состав книги и порядок листов вспомнятся из урока про [листы книги](/courses/excelize/lessons/03-listy-knigi/) — теперь вы знаете, как их ещё и защитить, а прозрачность защиты для чтения ложится на материал про [чтение ячеек](/courses/excelize/lessons/05-chtenie-yacheek/). Типовые ловушки вокруг прав и стилей собраны в уроке про [ошибки](/courses/excelize/lessons/22-tipichnye-oshibki/). Домашнее задание — разблокировать одну колонку и защитить лист паролем.

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

- 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 — там пароль запрашивается при снятии защиты.
