0
私はこれをしたいと思う:Questionボーダースタイルを変更するには、いくつかのセルを一度に変更します。 NPOI
しかしNPOIを使用してそれをする。正方形の4つの "ポイント"を提供し、私が望むものにその境界を変更する方法はありますか?
私はこれをしたいと思う:Questionボーダースタイルを変更するには、いくつかのセルを一度に変更します。 NPOI
しかしNPOIを使用してそれをする。正方形の4つの "ポイント"を提供し、私が望むものにその境界を変更する方法はありますか?
あなた自身でプログラムしない限り、そうはありません。
また、NPell(2.1.3.1)のボーダースタイルは、基本的にICellStyleが他のICellStyleと同じ境界線スタイル(たとえば、2つのセルの上に黒い枠線がある)があり、その1つを変更するとバグがあります。両方のスタイルに伝播されます(たとえば、1つのセルに左上の境界線を追加すると、別のセルにも追加されます)。
私はプルリクエストを作成しているが、これは今のために働く必要があります(セルスタイルの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です。