Защита определенных ячеек в Excel - C # Epplus - PullRequest
2 голосов
/ 09 октября 2019

У меня есть программа, экспортирующая электронную таблицу, содержащую заголовки и некоторые данные. Мне нужно защитить заголовки, но оставить ячейки данных редактируемыми.

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

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

public void formatSpreadsheet(OfficeOpenXml.ExcelWorksheet ws)
{
    // autofit columns
    for (int i = 1; i <= ws.Dimension.End.Column; i++)
    {
        ws.Column(i).AutoFit();
    }

    // protect headers/metadata
    ws.Protection.IsProtected = true;
    int row = HEADER_ROW_OFFSET;
    int col = 1;


    while (ws.Cells[row,col].Value != null)
    {

        while (ws.Cells[row,col].Value != null)
        {
            ws.Cells[row, col].Style.Locked = false;
            col++;
        }
        row++;
    }

}

Проверка на нулевые значениявот так:

if (ws.Cells[row,col].Value != null)  ws.Cells[row,col].Style.Locked = false;

не работает.

Я также пробовал ToString () для значений ячеек, и это не помогает.

Любые идеи

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Ваша проблема не в блокировке, а в вашем цикле, проходящем через ячейки:

while (ws.Cells[row,col].Value != null)

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

Следующее должно работать нормально:

// Lock the worksheet. You can do this here, or in the end. Doesn't really matter.
ws.Protection.IsProtected = true;

// Assuming `HEADER_ROW_OFFSET` is the first row that's not a header,
// we first define a "data" range as starting from the first column of that row, 
// to the very last used row & column.
var dataCells = ws.Cells[HEADER_ROW_OFFSET, 1, ws.Dimension.End.Row, ws.Dimension.End.Column];

// Now go through each cell in that range,
foreach (var cel in dataCells)
{
    // and unlock when it has content.
    if (cel.Value != null) cel.Style.Locked = false;
}
0 голосов
/ 09 октября 2019

Блокировка всей электронной таблицы, автоматически навсегда блокирует ячейки. Если вы хотите, чтобы блокировались только определенные ячейки, пройдите через электронную таблицу и заблокируйте их (оставив саму таблицу открытой)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...