使用条件格式复制范围

时间:2013-06-29 03:31:41

标签: copy conditional-formatting epplus

我在现有的Excel文件中有一个带有条件格式的范围。我使用EPPlus将该范围复制到新工作表,然后我发现缺少条件格式。

有没有办法使用EPPlus复制带有条件格式的范围?

3 个答案:

答案 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”。我发现它很有用,完整的文档在线(免费)。

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

此致