如何使用EPPlus删除单元格或范围的条件格式

时间:2014-05-07 01:36:30

标签: c# vb.net excel epplus

有没有办法从EPPlus的单元格或范围中删除条件格式?我尝试过清除,重置,删除行,插入行,复制没有格式化的单元格,但没有任何作用。有一些方法可以从工作表(worksheet.RemoveAll或RemoveAt)中删除所有条件格式,但不能从我能够在任何地方找到的单元格或范围中删除。
感谢

2 个答案:

答案 0 :(得分:0)

经过一些研究后,我找到了一种方法来检查,更改或删除查看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中检查规则本身......

如果您需要有关标记的更多详细信息,请参阅Google Wouter van Vugt,“Open XML The Markup explain”。我发现它很有用,完整的文档在线(免费)。

如果您找到更简单的方法,请发布。

此致

答案 1 :(得分:0)

您可以将每个规则的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对象。)