จะเพิ่มสีให้กับคอลัมน์ Excel เฉพาะตามเงื่อนไขโดยใช้ openxml ได้อย่างไร

ฉันกำลังสร้างแผ่นงาน Excel และฉันต้องการระบายสีคอลัมน์ Excel ตามเงื่อนไข ตอนนี้คอลัมน์ Excel ทั้งหมดของฉันมีสีแดง ฉันต้องการใส่สีเฉพาะชื่อคอลัมน์ที่ต้องการ

ฉันใช้ open 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 Repaired Records: ข้อมูลเซลล์จากส่วน /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