我在现有的Excel文件中有一个带有条件格式的范围。我使用EPPlus将该范围复制到新工作表,然后我发现缺少条件格式。
有没有办法使用EPPlus复制带有条件格式的范围?
答案 0 :(得分:2)
我找到了解决方案。我没有在所有formattingRuleTypes上测试它。 (目前只需要2个) 在我的应用程序中,每张工作表都有1个模板行。
var formatList = fromSheet.ConditionalFormatting.ToList();
foreach (var cf in formatList)
{
// sourceRow is the row containing the formatting
if (cf.Address.Start.Row == sourceRow )
{
IExcelConditionalFormattingRule rule = null;
switch (cf.Type)
{
case OfficeOpenXml.ConditionalFormatting.eExcelConditionalFormattingRuleType.GreaterThan:
rule = dest.ConditionalFormatting.AddGreaterThan();
break;
case OfficeOpenXml.ConditionalFormatting.eExcelConditionalFormattingRuleType.GreaterThanOrEqual:
rule = dest.ConditionalFormatting.AddGreaterThanOrEqual();
break;
case OfficeOpenXml.ConditionalFormatting.eExcelConditionalFormattingRuleType.LessThan:
rule = dest.ConditionalFormatting.AddLessThan();
break;
case OfficeOpenXml.ConditionalFormatting.eExcelConditionalFormattingRuleType.LessThanOrEqual:
rule = dest.ConditionalFormatting.AddLessThanOrEqual();
break;
default:
break;
}
rule.Style.Fill = cf.Style.Fill;
rule.Style.Border = cf.Style.Border;
rule.Style.Font = cf.Style.Font;
rule.Style.NumberFormat = cf.Style.NumberFormat;
// I have no clue why the Formula property is not included in the IExcelConditionalFormattingRule interface. So I needed to cast this.
((ExcelConditionalFormattingRule)rule).Formula = ((ExcelConditionalFormattingRule)cf).Formula;
((ExcelConditionalFormattingRule)rule).Formula2 = ((ExcelConditionalFormattingRule)cf).Formula2;
// Calculate the new address for the formatting. This will be different in your case
var adr = new ExcelAddress( dest.Start.Row , cf.Address.Start.Column -1 , dest.Start.Row, cf.Address.Start.Column -1 + cf.Address.Columns -1 );
rule.Address = adr;
我不知道为什么Formula属性不包含在IExcelConditionalFormattingRule接口中。所以我需要投这个。
答案 1 :(得分:0)
要添加到Luc Wuyts的答案中(由于声誉有限,我无法发表评论):
// I have no clue why the Formula property is not included in the IExcelConditionalFormattingRule interface. So I needed to cast this.
((ExcelConditionalFormattingRule)rule).Formula = ((ExcelConditionalFormattingRule)cf).Formula;
((ExcelConditionalFormattingRule)rule).Formula2 = ((ExcelConditionalFormattingRule)cf).Formula2;
某些条件格式没有公式选项。此强制转换将起作用,但是将“公式”属性应用于不需要它的条件格式设置选项将产生无法预料的结果。例如。 ConditionalFormatting.AddContainsBlanks()不需要Formula属性,添加它们可能会破坏条件格式。更好的方法是检查类型,并仅在需要时添加公式。
答案 2 :(得分:-1)
我有类似的问题,我发现检查,更改或删除单元格或范围的条件格式的唯一方法是查看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”。我发现它很有用,完整的文档在线(免费)。
如果您找到更简单的方法,请发布。
此致