Как на самом деле работают Cell Borders в NPOI?

Я сейчас создаю несколько листов Excel на C # с NPOI. Когда я устанавливал разные границы для некоторых ячеек, я обнаружил странное поведение. Например, если я хочу, чтобы первая ячейка (0,0) имела границу справа, а вторая ячейка (0,1) - границу справа и снизу, я пишу:

XSSFWorkbook wb = new XSSFWorkbook();
ISheet sheet = wb.CreateSheet();

IRow row = sheet.CreateRow(0);
ICell cell = row.CreateCell(0);
ICellStyle styleRight = wb.CreateCellStyle();
styleRight.BorderRight = BorderStyle.Medium;
cell.CellStyle = styleRight;

row = sheet.CreateRow(1);
cell = row.CreateCell(0);
ICellStyle styleBottomRight = wb.CreateCellStyle();
styleBottomRight.BorderRight = BorderStyle.Medium;
styleBottomRight.BorderBottom = BorderStyle.Medium;
cell.CellStyle = styleBottomRight;

это портит мой результат и дает моей первой ячейке (0,0) нижнюю границу.

Однако, если я изменю порядок границ для второго стиля ячейки:

row = sheet.CreateRow(1);
cell = row.CreateCell(0);
ICellStyle styleBottomRight = wb.CreateCellStyle();
styleBottomRight.BorderBottom = BorderStyle.Medium;
styleBottomRight.BorderRight = BorderStyle.Medium;
cell.CellStyle = styleBottomRight;

Я получаю желаемый результат с выделенной рамкой на моей первой ячейке и двумя границами на второй ячейке.

Почему так случилось? Почему порядок двух команд меняет результат? Почему styleBottomRightinfluence стиль первой ячейки? Я использую NPOI v2.5.1 в .Net Core 3.1


person phirus    schedule 01.07.2020    source источник


Ответы (1)


Похоже на ошибку в NPOI, потому что в первом случае сгенерированы две границы:

<borders count="2">
  <border>
    <left/>
    <right/>
    <top/>
    <bottom/>
    <diagonal/>
  </border>
  <border>
     <left/>
     <right style="medium"/>
     <top/>
     <bottom style="medium"/>
     <diagonal/>
  </border>

И оба стиля ссылаются на последнюю границу.

Для второго случая:

<borders count="3">
    <border>
        <left/>
        <right/>
        <top/>
        <bottom/>
        <diagonal/>
    </border>
    <border>
        <left/>
        <right style="medium"/>
        <top/>
        <bottom/>
        <diagonal/>
    </border>
    <border>
        <left/>
        <right style="medium"/>
        <top/>
        <bottom style="medium"/>
        <diagonal/>
    </border>
</borders>

И стиль ссылается на вторую и третью границу.

В любом случае порядок команд не будет иметь значения, если вы явно зададите значения границ:

        XSSFWorkbook wb = new XSSFWorkbook();
        ISheet sheet = wb.CreateSheet();

        IRow row = sheet.CreateRow(0);
        ICell cell = row.CreateCell(0);
        ICellStyle styleRight = wb.CreateCellStyle();
        styleRight.BorderBottom = BorderStyle.None;
        styleRight.BorderRight = BorderStyle.Medium;
        cell.CellStyle = styleRight;
        
        row = sheet.CreateRow(2);
        cell = row.CreateCell(0);
        ICellStyle styleBottomRight = wb.CreateCellStyle();                        
        styleBottomRight.BorderBottom = BorderStyle.Medium;
        styleBottomRight.BorderRight = BorderStyle.Medium;
        cell.CellStyle = styleBottomRight;
person progpow    schedule 01.07.2020