保护 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;
}
我有一个导出电子表格的程序,其中包含 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;
}