如何使用EPPlus删除单元格或区域的条件格式

本文关键字:区域 条件 格式 单元格 何使用 EPPlus 删除 | 更新日期: 2023-09-27 18:02:16

是否有办法从单元格或范围中删除条件格式?我尝试过清除,重置,删除行,插入行,复制单元格而不格式化,但没有任何作用。有几种方法可以从工作表中删除所有条件格式。RemoveAll或RemoveAt),但不是从单元格或范围,我已经能够找到任何地方。

如何使用EPPlus删除单元格或区域的条件格式

经过更多的研究,我发现了一种检查、更改或删除单元格或区域的条件格式的方法,可以查看openxml规范。条件格式存储在工作表中,其范围在属性sqref下。因此,您可以编辑该范围或添加一个新的。

例如:

DIM p As New ExcelPackage(New FileInfo(ExlReportPath), True)
Dim ws As ExcelWorksheet = p.Workbook.Worksheets(ExlSheetName)

——查找节点"工作表"(在我的情况下是1),查找所有子节点"conditionalFormatting"(在我的测试中是5到11)

Print.Debug(ws.WorksheetXml.ChildNodes(1).ChildNodes(5).Name)

'——你得到:conditionalFormatting

'——现在你可以检查范围:

Print.Debug(ws.WorksheetXml.ChildNodes(1).ChildNodes(5).Attributes("sqref").Value)

'——将给出此格式应用于示例的单元格地址:"D11:D15"’——如果你愿意,你可以更改删除或添加新的范围,下面我添加F11:F15

ws.WorksheetXml.ChildNodes(1).ChildNodes(5).Attributes("sqref").Value="D11:D15 F11:F15"

'——你也可以在InnerXml中检查规则本身…

如果你需要更多的标记细节,谷歌Wouter van Vugt,"Open XML the markup explained"。我发现它很有用,完整的文档在网上(免费)。

如果你找到一个更简单的方法,请贴出来。

您可以将每个规则的Address属性设置为一个新的ExcelAddress对象,其地址省略了正在讨论的单元格或子范围,例如——

var cfRules = worksheet.ConditionalFormatting;
var cfToModify = cfRules.Where(cf => ofInterest(cf.Address));
foreach (var cf in cfToModify)
{
    // Determine a new address for the rule so that it no longer
    // affects the cell or sub-range you're interested in.
    var newRangeAddress = "something else"; // (Just some filler, won't work...)
    cf.Address = new ExcelAddress(newRangeAddress);
}

—随ofInterest定义,如:

static bool ofInterest(ExcelAddress addr)
{
    var result = false; // Determine as you see fit.
    return result;
}

(注意,ExcelAddress.Address属性是只读的,因此必须将规则的Address属性设置为新的ExcelAddress对象)