2016-05-06 9 views

答えて

3

あなた自身でプログラムしない限り、そうはありません。

また、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です。

関連する問題