Open vpstuart opened 4 years ago
On second look that will result in the pool of borders growing each time. Perhaps instead CT_Border ct = GetCTBorder();
needs to always make a clone.
I didn't know the cause (what you describe) but this was happening to me. Define a border in one style affects any other style that has border definition. Good finding. Thanks, Gustavo
I have found in an application that the border formatting in XSSFCellStyle is a bit broken. It results in accidentally sharing a CT_Border instance.
From https://github.com/dotnetcore/NPOI/blob/master/src/NPOI.OOXML/XSSF/UserModel/XSSFCellStyle.cs#L227
Each of the border setters has the same but, I have chosen BorderBottom as an example.
The first time you assign a value to a border property. E.g.
cell.BorderBottom = BorderStyle.Thin;
it will create a CT_Border object, assign the border to it and then call_stylesSource.PutBorder(new XSSFCellBorder(ct, _theme))
which will store the border object and return an ID.If it finds a matching CT_Border it will return that instances id, causing it to be shared.
This seems to be from here: https://github.com/dotnetcore/NPOI/blob/master/src/NPOI.OOXML/XSSF/Model/StylesTable.cs#L285
Using
borders.IndexOf(border)
will search by the current value of the border. The XSSFCellBorder class implements equality based on the XML value of the CT_Border.I think the easiest and possibly best solution would be to delete the 5 lines:
I'm not a regular contributer here, but if it would help I can try and put together a PR.
Warm Regards, Stuart