Search code examples
c#staticreadonlynpoi

Class with CellStyle static values for NPOI


[Update at the bottom]

What I want to do: Have a class with static readonly values for the CellStyles so I can have my code that builds the excel file be like this:

ICellStyle headerStyle1 = workbook.CreateCellStyle();
headerStyle1 = ExcelStyles.header1;

Instead of like this:

headerStyle1.BorderBottom = NPOI.SS.UserModel.BorderStyle.Medium;
headerStyle1.BorderTop = NPOI.SS.UserModel.BorderStyle.Medium;
headerStyle1.BorderLeft = NPOI.SS.UserModel.BorderStyle.Medium;
headerStyle1.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;

Which would make it much easier to read, understand and maintain later on.

What I have so far: I made a class called ExcelStyles.cs in which I'm planning on having public static readonly variables so I can call the ones that I need, I know how to do it with methods, but having them being the CellStyle object directly should in theory make things easier later on. This code is what I was trying to do, but obviously doesn't work because it's not the correct syntax/way to do it.

class ExcelStyles
{
   public static readonly ICellStyle header1 = 
   { 
      header1.BorderBottom = NPOI.SS.UserModel.BorderStyle.Medium;
      header1.BorderTop = NPOI.SS.UserModel.BorderStyle.Medium;
   }
}

The issue: I don't know how to do this correctly and I've been hitting my head into a wall for a while trying to figure out how should I search for this without much success, and I don't know if it is possible to do with NPOI

What I'm using: Visual Studio 2019, Windows Forms, C#, .NET Framework 4.7.2, NPOI 2.5.3, it is a Desktop Application

Update: After fiddling a bit more I got to this code:

class ExcelStyles
{
    public static readonly ICellStyle header1 = ((XSSFWorkbook)new XSSFWorkbook()).CreateCellStyle();
    static ExcelStyles()
    {
        header1.BorderBottom = NPOI.SS.UserModel.BorderStyle.Medium;
        header1.BorderTop = NPOI.SS.UserModel.BorderStyle.Medium;
        header1.BorderLeft = NPOI.SS.UserModel.BorderStyle.Medium;
        header1.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
        header1.FillPattern = FillPattern.SolidForeground;
        header1.VerticalAlignment = VerticalAlignment.Center;
    }
}

And I'm calling it like this:

ICellStyle headerStyle1 = workbook.CreateCellStyle();
headerStyle1.CloneStyleFrom(ExcelStyles.header1);

So the question changes, with testing so far this has worked just as expected, but I worry that ((XSSFWorkbook)new XSSFWorkbook()).CreateCellStyle() might cause unexpected issues. Is there a cleaner way to do this?


Solution

  • In the end doing this was the solution.

    public static readonly ICellStyle header1 = new XSSFWorkbook().CreateCellStyle();
    
    static ExcelStyles()
    {
       header1.FillPattern = FillPattern.SolidForeground;
       header1.FillForegroundColor = color;
       header1.BorderBottom = NPOI.SS.UserModel.BorderStyle.Medium;
       header1.BorderTop = NPOI.SS.UserModel.BorderStyle.Medium;
       header1.BorderLeft = NPOI.SS.UserModel.BorderStyle.Medium;
       header1.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
       header1.VerticalAlignment = VerticalAlignment.Center;
       header1.Alignment = HorizontalAlignment.Left;
    }
    

    and then this to apply it

    ICellStyle headerStyle1 = workbook.CreateCellStyle();
    headerStyle1.CloneStyleFrom(ExcelStyles.header1);```