OpenXML SDK具有单元格边框

时间:2013-04-03 15:34:32

标签: c# openxml-sdk

我有以下代码在OpenXML SDK中为该单元格添加一个包含值和数据类型的单元格:

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);

提前致谢

3 个答案:

答案 0 :(得分:21)

我建议安装Open XML 2.0 productivity tool。然后创建一个包含所需边框和颜色的空白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”形式的cellAddress所在的位置:

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);
 }

答案 1 :(得分:0)

SpreadsheetDocument 的结构为 WorkbookParts 的集合。其中之一, WorkbookStylesPart ,包含文档中使用的所有样式。 WorkbookPart 包含工作表。要将样式应用于单元格或单元格范围,您需要将 StyleIndex 属性设置为WorkbookStylesPart中的相应样式。

这个答案应该有助于您入门:   https://stackoverflow.com/a/11118442/741326

答案 2 :(得分:0)

更容易打电话

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