如何一次更改 os 多个单元格的边框样式。非营利组织

How to change border style os several cells at once. NPOI

我想这样做:Question

但是使用 NPOI 来做。有没有办法提供正方形的 4 "points" 并将其边框更改为我想要的任何内容?

没有,除非你自己编程。

此外,NPOI (2.1.3.1) 中的边框样式有问题,基本上当您的 ICellStyle 具有与其他一些 ICellStyle 相同的边框样式(例如,两个单元格具有顶部黑色边框)并且您更改其中一个时,更改传播到两种样式(例如,一旦您将左上边框添加到一个单元格,它也会添加到另一个单元格)。

我已经创建了拉取请求,但这现在应该可以工作(注意单元格样式的 64 000 个限制):

public void CreateBorder(ISheet sheet, int firstRow, int lastRow, int firstColumn, int lastColumn, BorderStyle borderStyle)
{
    // top line
    for (int column = firstColumn + 1; column < lastColumn; column++)
    {
        ICell topCell = GetCell(sheet, firstRow, column);
        ICellStyle topStyle = CreateCellStyle(topCell);
        using (new CellBorderLock(topStyle))
        {
            topStyle.BorderTop = borderStyle;
        }
        topCell.CellStyle = topStyle;
    }
    // top left corner
    ICell topLeftCell = GetCell(sheet, firstRow, firstColumn);
    ICellStyle topLeftStyle = CreateCellStyle(topLeftCell);
    using (new CellBorderLock(topLeftStyle))
    {
        topLeftStyle.BorderTop = borderStyle;
        topLeftStyle.BorderLeft = borderStyle;
    }
    topLeftCell.CellStyle = topLeftStyle;
    // top right corner
    ICell topRightCell = GetCell(sheet, firstRow, lastColumn);
    ICellStyle topRightStyle = CreateCellStyle(topRightCell);
    using (new CellBorderLock(topRightStyle))
    {
        topRightStyle.BorderTop = borderStyle;
        topRightStyle.BorderRight = borderStyle;
    }
    topRightCell.CellStyle = topRightStyle;

    // left line
    for (int row = firstRow + 1; row < lastRow; row++)
    {
        ICell leftCell = GetCell(sheet, row, firstColumn);
        ICellStyle leftStyle = CreateCellStyle(leftCell);
        using (new CellBorderLock(leftStyle))
        {
            leftStyle.BorderLeft = borderStyle;
        }
        leftCell.CellStyle = leftStyle;
    }

    // right line
    for (int row = firstRow + 1; row < lastRow; row++)
    {
        ICell rightCell = GetCell(sheet, row, lastColumn);
        ICellStyle rightStyle = CreateCellStyle(rightCell);
        using (new CellBorderLock(rightStyle))
        {
            rightStyle.BorderRight = borderStyle;
        }
        rightCell.CellStyle = rightStyle;
    }

    // bottom line
    for (int column = firstColumn + 1; column < lastColumn; column++)
    {
        ICell bottomCell = GetCell(sheet, lastRow, column);
        ICellStyle bottomStyle = CreateCellStyle(bottomCell);
        using (new CellBorderLock(bottomStyle))
        {
            bottomStyle.BorderBottom = borderStyle;
        }
        bottomCell.CellStyle = bottomStyle;
    }

    // bottom left corner
    ICell bottomLeftCell = GetCell(sheet, lastRow, firstColumn);
    ICellStyle bottomLeftStyle = CreateCellStyle(bottomLeftCell);
    using (new CellBorderLock(bottomLeftStyle))
    {
        bottomLeftStyle.BorderBottom = borderStyle;
        bottomLeftStyle.BorderLeft = borderStyle;
    }
    bottomLeftCell.CellStyle = bottomLeftStyle;

    // bottom right corner
    ICell bottomRightCell = GetCell(sheet, lastRow, lastColumn);
    ICellStyle bottomRightStyle = CreateCellStyle(bottomRightCell);
    using (new CellBorderLock(bottomRightStyle))
    {
        bottomRightStyle.BorderBottom = borderStyle;
        bottomRightStyle.BorderRight = borderStyle;
    }
    bottomRightCell.CellStyle = bottomRightStyle;
}

private ICellStyle CreateCellStyle(ICell cell)
{
    var style = cell.Sheet.Workbook.CreateCellStyle();
    style.CloneStyleFrom(cell.CellStyle);
    return style;
}

private ICell GetCell(ISheet sheet, int row, int column)
{
    IRow r = sheet.GetRow(row) ?? sheet.CreateRow(row);
    return r.GetCell(column) ?? r.CreateCell(column);
}

/// <summary>
/// Make a border style of <see cref="ICellStyle"/> unique for duration of a lock
/// so it doesn't propagate changes of border to other cell styles.
/// </summary>
public sealed class CellBorderLock : IDisposable
{
    private readonly ICellStyle style;

    public CellBorderLock(ICellStyle style)
    {
        this.style = style;
        style.BorderDiagonalLineStyle = BorderStyle.Thin;
        style.BorderDiagonal = BorderDiagonal.Forward;
    }

    public void Dispose()
    {
        style.BorderDiagonalLineStyle = BorderStyle.None;
        style.BorderDiagonal = BorderDiagonal.None;
    }
}

代码为 CC0。