保护 Excel 中的某些单元格 - C# Epplus

Protecting certain cells in Excel - C# Epplus

我有一个导出电子表格的程序,其中包含 headers 和一些数据。我需要保护 headers,但让数据单元格保持可编辑状态。

问题是,将工作表设置为受保护后,所有单元格都变为 read-only。

因此,我使用的方法是检查 header 下面的每个单元格,看它们是否不为空,如果是,则解锁它们。

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(),但没有用。

有什么想法吗?

锁定整个电子表格,自动永久锁定单元格。 如果您只想锁定某些单元格,请浏览电子表格并锁定它们(保持电子表格本身解锁)

你的问题不在于锁定,而在于遍历单元格的循环:

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;
}