web-dev-qa-db-ja.com

セルの境界線を持つOpenXMLSDK

OpenXMLSDKでそのセルの値とデータ型を持つセルを追加する次のコードがあります。

Cell cell = InsertCellInWorksheet(column, row, worksheetPart);              
cell.CellValue = new CellValue(index.ToString());
cell.DataType = new EnumValue<CellValues>(CellValues.SharedString);

このセルの場合、両側に境界線を追加するにはどうすればよいですか?また、セルに背景色を追加するのも好きです。

私は以下を持っていますが、セルに境界線を追加する方法がわかりません:

Borders borders1 = new Borders() { Count = (UInt32Value)1U };

Border border1 = new Border();
LeftBorder leftBorder1 = new LeftBorder();
RightBorder rightBorder1 = new RightBorder();
TopBorder topBorder1 = new TopBorder();
BottomBorder bottomBorder1 = new BottomBorder();

border1.Append(leftBorder1);
border1.Append(rightBorder1);
border1.Append(topBorder1);
border1.Append(bottomBorder1);

borders1.Append(border1);

前もって感謝します

13
Nate Pet

Open XML 2.0生産性ツール をインストールすることをお勧めします。次に、必要な境界線と色を含む空白のExcelドキュメントを作成します。そのファイルを生産性ツールで開き、[コードを反映]をクリックします。次に、その境界線と背景色を生成するために必要なC#コードを提供します。コードは投稿するのに少し時間がかかりますが、これらの手順に従うと、それを使用できるはずです。

**編集**

Borderプロパティとfillプロパティは、WookbookStylesPartと呼ばれる別の部分に保存されます。この部分は、ブック内のセルに適用する境界線、塗りつぶし、フォントなどのタイプを挿入する場所です。これらのプロパティは、インデックスを介して挿入したスタイルにアクセスする配列型構造に格納されます。セルに複数のスタイルを適用できるため、CellFormatオブジェクトには、さまざまなスタイルのすべてのインデックスが格納されます。セルのCellFormatを取得したら、そのインデックスをStlyeIndexプロパティを介して実際のセルで参照する必要があります。これが、セルがさまざまなスタイルを自分自身に適用する方法を知っている方法です。

境界線を作成するコードは次のとおりです。

public Border GenerateBorder()
{ 
    Border border2 = new Border();

    LeftBorder leftBorder2 = new LeftBorder(){ Style = BorderStyleValues.Thin };
    Color color1 = new Color(){ Indexed = (UInt32Value)64U };

    leftBorder2.Append(color1);

    RightBorder rightBorder2 = new RightBorder(){ Style = BorderStyleValues.Thin };
    Color color2 = new Color(){ Indexed = (UInt32Value)64U };

    rightBorder2.Append(color2);

    TopBorder topBorder2 = new TopBorder(){ Style = BorderStyleValues.Thin };
    Color color3 = new Color(){ Indexed = (UInt32Value)64U };

    topBorder2.Append(color3);

    BottomBorder bottomBorder2 = new BottomBorder(){ Style = BorderStyleValues.Thin };
    Color color4 = new Color(){ Indexed = (UInt32Value)64U };

    bottomBorder2.Append(color4);
    DiagonalBorder diagonalBorder2 = new DiagonalBorder();

    border2.Append(leftBorder2);
    border2.Append(rightBorder2);
    border2.Append(topBorder2);
    border2.Append(bottomBorder2);
    border2.Append(diagonalBorder2);

    return borders2;
}

塗りつぶしを追加するコードは次のとおりです。

public Fill GenerateFill()
{
    Fill fill = new Fill();

    PatternFill patternFill = new PatternFill(){ PatternType = PatternValues.Solid };
    ForegroundColor foregroundColor1 = new ForegroundColor(){ Rgb = "FFFFFF00" };
    BackgroundColor backgroundColor1 = new BackgroundColor(){ Indexed = (UInt32Value)64U };

    patternFill.Append(foregroundColor1);
    patternFill.Append(backgroundColor1);

    fill.Append(patternFill);

    return fill;
}

境界線を挿入してスタイル部分に入力するには、次のコードが必要になります。

public uint InsertBorder(WorkbookPart workbookPart, Border border)
{
    Borders borders = workbookPart.WorkbookStylesPart.Stylesheet.Elements<Borders>().First();
    borders.Append(border);
    return (uint)borders.Count++;
}

public uint InsertFill(WorkbookPart workbookPart, Fill fill)
{
    Fills fills = workbookPart.WorkbookStylesPart.Stylesheet.Elements<Fills>().First();
    fills.Append(fill);
    return (uint)fills.Count++;
}

最初に、セルアドレスが「B2」の形式である場所に塗りつぶしと境界線を追加するセルへの参照を取得する必要があります。

public Cell GetCell(WorksheetPart workSheetPart, string cellAddress)
{
    return workSheetPart.Worksheet.Descendants<Cell>()
                                .SingleOrDefault(c => cellAddress.Equals(c.CellReference));
}

次に、セルを取得したら、そのセルに属するCellFormatを取得し、新しいCellFormatを追加する必要があります。

public CellFormat GetCellFormat(WorkbookPart workbookPart, uint styleIndex)
{
    return workbookPart.WorkbookStylesPart.Stylesheet.Elements<CellFormats>().First().Elements<CellFormat>().ElementAt((int)styleIndex);
}

public uint InsertCellFormat(WorkbookPart workbookPart, CellFormat cellFormat)
{
    CellFormats cellFormats = workbookPart.WorkbookStylesPart.Stylesheet.Elements<CellFormats>().First();
    cellFormats.Append(cellFormat);
    return (uint)cellFormats.Count++;
}

CellFormatを取得したら、塗りつぶしと境界線のプロパティを変更できます。それらが変更されたら、新しいCellFormatを挿入し、そのCellFormatのインデックスをセルのStyleIndexにポイントする必要があります。これは、セルがそれ自体に適用するスタイルを知る方法です。

 public void SetBorderAndFill(WorkbookPart workbookPart, WorksheetPart workSheetPart)
 {
      Cell cell = GetCell(workSheetPart, "B2");

      CellFormat cellFormat = cell.StyleIndex != null ? GetCellFormat(workbookPart, cell.StyleIndex).CloneNode(true) as CellFormat : new CellFormat();
      cellFormat.FillId = InsertFill(workbookPart, GenerateFill());
      cellFormat.BorderId = InsertBorder(workbookPart, GenerateBorder());    

      cell.StyleIndex = InsertCellFormat(workbookPart, cellFormat);
 }
23
amurra

ただ呼び出すのがはるかに簡単

ws.Cells[row, col].Style.Border.BorderAround(ExcelBorderStyle.Thin);
1
markokstate

SpreadsheetDocumentは、WorkbookPartsのコレクションとして構造化されています。これらの1つであるWorkbookStylesPartには、ドキュメントで使用されているすべてのスタイルが含まれています。 WorkbookPartには、Worksheetsが含まれています。セルまたはセルの範囲にスタイルを適用するには、StyleIndexプロパティをWorkbookStylesPartの対応するスタイルに設定する必要があります。

この答えはあなたが始めるのに役立つはずです: https://stackoverflow.com/a/11118442/741326

0
saarp