Как добавить цвет к определенным столбцам Excel на основе условий с помощью openxml?

Я создаю лист Excel и хочу раскрасить столбцы Excel в зависимости от условий. Теперь все мои столбцы excel окрашиваются в красный цвет. Я хочу раскрасить только определенные имена столбцов.

Я использую открытый XML для создания Excel, есть ли способ найти ячейки для применения цвета

 using (SpreadsheetDocument document = SpreadsheetDocument.Create(path, SpreadsheetDocumentType.Workbook))
            {
                WorkbookPart workbookPart = document.AddWorkbookPart();
                workbookPart.Workbook = new Workbook();

                WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
                worksheetPart.Worksheet = new Worksheet();

                Sheets sheets = workbookPart.Workbook.AppendChild(new Sheets());

                Sheet sheet = new Sheet() { Id = workbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Template" };

                sheets.Append(sheet);

                var stylesheet = new Stylesheet() { MCAttributes = new MarkupCompatibilityAttributes() { Ignorable = "x14ac" } };
                stylesheet.AddNamespaceDeclaration("mc", "http: //schemas.openxmlformats.org/markup-compatibility/2006");
                stylesheet.AddNamespaceDeclaration("x14ac", "http: //schemas.microsoft.com/office/spreadsheetml/2009/9/ac");

                var fills = new Fills() { Count = 5U };
                var fonts = new Fonts() { Count = 1U, KnownFonts = true };
               // var cellFormats = new CellFormats();
                Font font = new Font();
                font.Append(new Color() { Rgb = "ff0000" });
                fonts.Append(font);

               // cellFormats.AppendChild(new CellFormat() { FontId = 0U });
                stylesheet.Append(fonts);
                stylesheet.Append(fills);
                //stylesheet.Append(cellFormats);
                //stylesheet.Append(fill);                 
                var stylePart = workbookPart.AddNewPart<WorkbookStylesPart>();
                stylePart.Stylesheet = stylesheet;
                stylePart.Stylesheet.Save();

                workbookPart.Workbook.Save();

                SheetData sheetData = worksheetPart.Worksheet.AppendChild(new SheetData());

                // Constructing header
                Row row = new Row();

                foreach (DataExchangeDefinition a in importColList)
                {
                    defnExist = true;
                    if (a.MustFieldYN == true)
                    {
                        row.Append(
                        ConstructCell(a.FieldCaption, CellValues.String));
                    }
                    else
                    {
                        row.Append(
                        ConstructCell(a.FieldCaption, CellValues.String));
                    }
                }

                if (defnExist == false)
                {
                    row.Append(
                    ConstructCell("Excel Template Definition Missing", CellValues.String));
                }
                // Insert the header row to the Sheet Data
                sheetData.AppendChild(row);

                // Inserting each employee

                worksheetPart.Worksheet.Save();
            }

Вот метод построения ячейки

 private Cell ConstructCell(string value, CellValues dataType)
    {
        Cell c = new Cell()
        {
            CellValue = new CellValue(value),
            DataType = new EnumValue<CellValues>(dataType)
            //StyleIndex=0U                
        };
        return c;
    }

Есть ли способ решить эту проблему?


person Dhanil Dinesan    schedule 14.02.2019    source источник


Ответы (1)


1) Добавьте таблицу стилей в WorkBookPart.

WorkbookPart workbookPart = document.AddWorkbookPart();
workbookPart.Workbook = new Workbook();

WorkbookStylesPart stylePart = workbookPart.AddNewPart<WorkbookStylesPart>();
stylePart.Stylesheet = GenerateStylesheet();
stylePart.Stylesheet.Save();

Примечание. Добавьте приведенный выше код WorkbookStylesPart чуть ниже WorkbookPart, иначе вы не сможете заставить его работать.

2) Добавьте ниже функцию, которая возвращает таблицу стилей,

private Stylesheet GenerateStylesheet()
    {
        Stylesheet styleSheet = null;

        Fonts fonts = new Fonts(
            new Font( // Index 0 - default
                new FontSize() { Val = 10 }

            ),
            new Font( // Index 1 - header
                new FontSize() { Val = 10 },
                new Bold(),
                new Color() { Rgb = "FFFFFF" }

            ));

        Fills fills = new Fills(
                new Fill(new PatternFill() { PatternType = PatternValues.None }), // Index 0 - default
                new Fill(new PatternFill() { PatternType = PatternValues.Gray125 }), // Index 1 - default
                new Fill(new PatternFill(new ForegroundColor { Rgb = new HexBinaryValue() { Value = "66666666" } })
                { PatternType = PatternValues.Solid }) // Index 2 - header
            );

        Borders borders = new Borders(
                new Border(), // index 0 default
                new Border( // index 1 black border
                    new LeftBorder(new Color() { Auto = true }) { Style = BorderStyleValues.Thin },
                    new RightBorder(new Color() { Auto = true }) { Style = BorderStyleValues.Thin },
                    new TopBorder(new Color() { Auto = true }) { Style = BorderStyleValues.Thin },
                    new BottomBorder(new Color() { Auto = true }) { Style = BorderStyleValues.Thin },
                    new DiagonalBorder())
            );

        CellFormats cellFormats = new CellFormats(
                new CellFormat(), // default
                new CellFormat { FontId = 0, FillId = 0, BorderId = 1, ApplyBorder = true }, // body
                new CellFormat { FontId = 1, FillId = 2, BorderId = 1, ApplyFill = true } // header
            );

        styleSheet = new Stylesheet(fonts, fills, borders, cellFormats);

        return styleSheet;
    }

3) И ваш метод ConstructCell,

private Cell ConstructCell(string value, CellValues dataType, uint styleIndex = 0)
{
    return new Cell()
    {
        CellValue = new CellValue(value),
        DataType = new EnumValue<CellValues>(dataType),
        StyleIndex = styleIndex
    };
}

4) И вызовите указанный выше метод, например

Если вы не хотите применять стиль, используйте ниже

ConstructCell(a.FieldCaption, CellValues.String));

И если вы хотите применить стиль к ячейке тела, используйте ниже

ConstructCell(a.FieldCaption, CellValues.String, 1);

И если вы хотите применить стиль к ячейке заголовка, используйте ниже

ConstructCell(a.FieldCaption, CellValues.String, 2);
person er-sho    schedule 14.02.2019
comment
Большое спасибо за ваши усилия. Позвольте мне попробовать с этим - person Dhanil Dinesan; 14.02.2019
comment
Перед открытием excel отображается ошибка Восстановленные записи: информация о ячейке из части /xl/worksheets/sheet1.xml, и все столбцы окрашены одинаково, т.е. красным - person Dhanil Dinesan; 14.02.2019
comment
покажи мне, как ты реализовал мой ответ на свой код? добавьте свой код в свой пост - person er-sho; 14.02.2019
comment
Добавьте этот код stylePart чуть ниже этой строки => workbookPart.Workbook = new Workbook(); см. мой шаг 1 - person er-sho; 14.02.2019
comment
И не прячьте код внутри GenerateStylesheet. сначала проверьте это. Если все работает нормально, вы можете добавлять или удалять код внутри метода GenerateStylesheet. - person er-sho; 14.02.2019
comment
Я пытался, как ты сказал. Теперь ошибка исчезла, но теперь я получаю то, что получаю рано. Все названия столбцов выделены красным цветом - person Dhanil Dinesan; 14.02.2019
comment
ответ обновлен, пожалуйста, скопируйте GenerateStylesheet как есть, а в методе ConstructCell вызовите 0 ни для чего, 1 для ячейки тела и 2 для ячейки заголовка - person er-sho; 14.02.2019
comment
Теперь все в порядке. Выбранные столбцы получают границу. я придал им красный цвет с помощью `new Color() { Rgb = ff0000 }` this. но цвета нет - person Dhanil Dinesan; 14.02.2019
comment
да OpenXml поддерживает очень мало цветов, которые вам нужно искать на официальном сайте open xml - person er-sho; 14.02.2019
comment
Определенно. Спасибо большое - person Dhanil Dinesan; 14.02.2019
comment
Приятно снова встретиться с вами, у меня есть сомнения по этому поводу (Excel). Я думаю, вы можете мне помочь, я хочу добавлять новые строки во время цикла, я устал от разных методов, но не смог, можете ли вы помочь мне с этим. если можно я могу разместить код здесь - person Dhanil Dinesan; 01.10.2019
comment
Я думаю, что лучше добавить новый вопрос со всеми вашими потребностями и дать мне ссылку. - person er-sho; 02.10.2019
comment
Большое спасибо за ответ, я нашел решение, и оно работает. - person Dhanil Dinesan; 02.10.2019