Как изменить стиль границы или несколько ячеек одновременно. 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.