【问题标题】:Add Conditional Formatting OpenXML C#添加条件格式 OpenXML C#
【发布时间】:2018-09-17 18:19:44
【问题描述】:

如何使用 C# .Net 在 OpenXML 中添加条件格式。我希望应用以下条件:

=INDIRECT("D"&ROW())="Disapproved" 那么规则应该适用于:=$1:$3,$N$4:$XFD$4,$5:$1048576

我的功能设置如下:

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

【问题讨论】:

    标签: c# .net openxml


    【解决方案1】:

    要添加条件格式,您需要将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 对元素的顺序很挑剔,因此(尤其是在处理现有文档时)您需要确保在树中的正确位置添加元素。

    【讨论】:

    • 很好,代码似乎可以工作,但我不知道如何根据我的需要设置 formula1.Text。我只想选择那些包含“#”字符的单元格。你能帮帮我吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多