Как изменить стиль границы или несколько ячеек одновременно. NPOI

Я хочу сделать это: Вопрос

Но сделайте это, используя NPOI. Есть ли способ указать 4 "точки" квадрата и изменить его границу на то, что я хочу?

1 ответ

Решение

Нет, нет, если вы сами не запрограммируете это.

Кроме того, стили границ в NPOI (2.1.3.1) содержат ошибки, в основном, когда ваш ICellStyle имеет тот же стиль границ, что и некоторые другие ICellStyle (например, две ячейки имеют верхнюю черную рамку), и вы меняете одну из них, изменение распространяется на оба стиля. (например, когда вы добавляете левую верхнюю границу к одной ячейке, она также добавляется к другой ячейке).

Я создал pull-запрос, но пока он должен работать (остерегайтесь ограничения в 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.

Другие вопросы по тегам