Добавить условное форматирование OpenXML C # - PullRequest
0 голосов
/ 17 сентября 2018

Как добавить условное форматирование в OpenXML, используя C # .Net. Я хотел бы применить следующие условия:

= INDIRECT ("D" & ROW ()) = "Отклонено", тогда правило должно применяться к: = $ 1: $ 3, $ N $ 4: $ XFD $ 4, $ 5: $ 1048576

У меня настроена функция так:

using (SpreadsheetDocument document = SpreadsheetDocument.Open(openFileDialog1.FileName, true))
{
   // apply conditions here
}

1 Ответ

0 голосов
/ 24 сентября 2018

Чтобы добавить условные форматы, вам нужно добавить экземпляр ConditionalFormatting в Worksheet. Этот объект будет содержать список ссылок, к которым должен применяться условный формат. Экземпляру ConditionalFormatting требуется ConditionalFormattingRule для определения правила, которое будет использоваться, которое, в свою очередь, определяется с помощью Formula.

Чтобы условный формат оказал влияние на электронную таблицу, вам также необходимо определить стиль, который будет использоваться. Это должно быть добавлено к DifferentialFormat, который, в свою очередь, добавлен к DifferentialFormats.

Следующий код возьмет существующий документ и добавит условный формат, который вам нужен:

using (SpreadsheetDocument document = SpreadsheetDocument.Open(filename, true))
{
    WorkbookPart workbookPart = document.WorkbookPart;
    //get the correct sheet
    Sheet sheet = workbookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName).First();
    WorksheetPart worksheetPart = workbookPart.GetPartById(sheet.Id) as WorksheetPart;
    SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();

    //grab the stylesPart so we can add the style to apply (create one if one doesn't already exist)
    WorkbookStylesPart stylesPart = document.WorkbookPart.GetPartsOfType<WorkbookStylesPart>().FirstOrDefault();
    if (stylesPart == null)
    {
        stylesPart = workbookPart.AddNewPart<WorkbookStylesPart>();
        stylesPart.Stylesheet = new Stylesheet();
    }

    //create a fills object to hold the background colour we're going to apply
    Fills fills = new Fills() { Count = 1U };

    //grab the differential formats part so we can add the style to apply (create one if one doesn't already exist)
    bool addDifferentialFormats = false;
    DifferentialFormats differentialFormats = stylesPart.Stylesheet.GetFirstChild<DifferentialFormats>();
    if (differentialFormats == null)
    {
        differentialFormats = new DifferentialFormats() { Count = 1U };
        addDifferentialFormats = true;
    }

    //create the conditional format reference
    ConditionalFormatting conditionalFormatting = new ConditionalFormatting()
    {
        SequenceOfReferences = new ListValue<StringValue>()
        {
            InnerText = "A1:XFD3 N4:XFD4 A5:XFD1048576"
        }
    };

    //create a style to assign to the conditional format
    DifferentialFormat differentialFormat = new DifferentialFormat();
    Fill fill = new Fill();
    PatternFill patternFill = new PatternFill();
    BackgroundColor backgroundColor = new BackgroundColor() { Rgb = new HexBinaryValue() { Value = "0000ff00" } };
    patternFill.Append(backgroundColor);
    fill.Append(patternFill);
    differentialFormat.Append(fill);
    differentialFormats.Append(differentialFormat);

    //create the formula
    Formula formula1 = new Formula();
    formula1.Text = "INDIRECT(\"D\"&ROW())=\"Disapproved\"";

    //create a new conditional formatting rule with a type of Expression
    ConditionalFormattingRule conditionalFormattingRule = new ConditionalFormattingRule()
    {
        Type = ConditionalFormatValues.Expression,
        FormatId = 0U,
        Priority = 1
    };

    //append the formula to the rule
    conditionalFormattingRule.Append(formula1);

    //append th formatting rule to the formatting collection
    conditionalFormatting.Append(conditionalFormattingRule);

    //add the formatting collection to the worksheet
    //note the ordering is important; there are other elements that should be checked for here really.
    //See the spec for all of them and see https://stackoverflow.com/questions/25398450/why-appending-autofilter-corrupts-my-excel-file-in-this-example/25410242#25410242
    //for more details on ordering
    PageMargins margins = worksheetPart.Worksheet.GetFirstChild<PageMargins>();
    if (margins != null)
        worksheetPart.Worksheet.InsertBefore(conditionalFormatting, margins);
    else
        worksheetPart.Worksheet.Append(conditionalFormatting);

    //add the differential formats to the stylesheet if it didn't already exist
    if (addDifferentialFormats)
        stylesPart.Stylesheet.Append(differentialFormats);
}

Обратите внимание, что OpenXml суетливо относится к порядку элементов, поэтому (особенно при работе с существующим документом) вам необходимо убедиться, что вы добавляете элементы в правильном месте в дереве.

...