Копировать диапазон с условным форматированием

У меня есть диапазон с условным форматированием в существующем файле Excel. Я использовал EPPlus, чтобы скопировать этот диапазон на новый лист, а затем обнаружил, что условное форматирование отсутствует.

Есть ли способ скопировать диапазон с условным форматированием с помощью EPPlus?


person WAKU    schedule 29.06.2013    source источник


Ответы (3)


Я нашел решение для этого. Я не проверял это на всех форматах RuleTypes. (На данный момент их нужно только 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. Так что мне нужно было бросить это.

person Luc Wuyts    schedule 15.05.2016

Чтобы добавить к ответу Люка Вуйтса (пока не могу комментировать из-за ограниченной репутации):

                // 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, и их добавление может испортить условное форматирование. Лучшим подходом является проверка типа и добавление формулы только при необходимости.

person Wimpix    schedule 29.04.2020

У меня была похожая проблема, единственный способ проверить, изменить или удалить условный формат ячейки или диапазона, который я нашел, - это посмотреть спецификации openxml. Условный формат хранится на листе с диапазоном под атрибутом sqref. Таким образом, вы можете отредактировать этот диапазон или добавить новый.

Например:

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

'--Найти узел «рабочий лист» (1 в моем случае), найти все дочерние узлы «условное форматирование» (от 5 до 11 в моем тесте)

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...

Если вам нужна дополнительная информация о разметке, погуглите Wouter van Vugt, «Open XML The markupобъяснение». Я нашел это полезным, и полный документ был онлайн (бесплатно).

Если найдете более простой способ, напишите.

С уважением

person Ignacio    schedule 08.05.2014