我在现有的 Excel 文件中有一个带有条件格式的范围。我使用 EPPlus 将该范围复制到新工作表,然后发现缺少条件格式。
有没有办法使用 EPPlus 复制带有条件格式的范围?
我在现有的 Excel 文件中有一个带有条件格式的范围。我使用 EPPlus 将该范围复制到新工作表,然后发现缺少条件格式。
有没有办法使用 EPPlus 复制带有条件格式的范围?
我找到了解决方案。我没有在所有的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;
我不知道为什么 IExcelConditionalFormattingRule 接口中不包含 Formula 属性。所以我需要投这个。
添加到 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() 不需要公式属性,添加它们可能会弄乱条件格式。更好的方法是检查类型,并仅在需要时添加公式。
我遇到了类似的问题,我发现检查、更改或删除单元格或范围的条件格式的唯一方法是查看 openxml 规范。条件格式存储在工作表中,范围在属性 sqref 下。因此,您可以编辑该范围或添加新范围。
例如:
DIM p As New ExcelPackage(New FileInfo(ExlReportPath), True)
Dim ws As ExcelWorksheet = p.Workbook.Worksheets(ExlSheetName)
'--Find Node "worksheet" (1 in my case) , Find all Child Nodes "conditionalFormatting" (5 to 11 in my test)
Print.Debug(ws.WorksheetXml.ChildNodes(1).ChildNodes(5).Name)
'——你得到:条件格式
'--现在您可以检查范围:
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 Explained”。我发现它很有用,并且完整的文档在线(免费)。
如果您找到更简单的方法,请发布它。
问候