NPOI中的单元格边框实际上是如何工作的?



我正在用NPOI在C#中创建一些Excel工作表。当我为某些单元格设置不同的边界时,我遇到了一些奇怪的行为。 例如,如果我希望第一个单元格 (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;

我得到预期的结果是,我的第一个单元格上有单个边框,第二个单元格上有两个边框。

为什么会这样?为什么两个命令的顺序会改变结果?为什么styleBottomRight会影响第一个单元格的样式? 我在.Net Core 3.1中使用NPOI v2.5.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;

相关内容

  • 没有找到相关文章

最新更新