OpenXML SDK设置单元格边框

15

我有以下代码,它使用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);

提前感谢您

2个回答

31
我建议安装Open XML 2.5生产力工具。 然后创建一个包含所需边框和颜色的空白Excel文档。 在生产力工具中打开该文件,然后单击“反射代码”。 它将为您提供生成该边框和背景颜色所需的C#代码。 该代码有点冗长,无法发布,但如果按照这些步骤进行操作,应该能够使用它。
**编辑**
边框和填充属性存储在名为WorkbookStylesPart的单独部分中。 这部分是您将希望应用于工作簿单元格的边框、填充、字体等类型的样式的位置。 这些属性存储在数组类型结构中,您可以通过索引访问插入的样式。 因为您可以在单元格上应用多个样式,所以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);
 }

谢谢您的回复。我确实查看了生产力工具,并发现它生成的代码与我在网上看到的代码有很大不同。例如,我正在使用http://msdn.microsoft.com/en-us/library/office/cc861607.aspx 在现有单元格中插入单元格文本。但是我不确定如何更改背景颜色等。我不知道如何合并样式表。当我使用生产力工具时,我没有看到任何样式表。非常感谢您的帮助。 - Nate Pet
所提到的工具是免费的,来自可信赖的来源(Microsoft),不可或缺且易于使用。是的,生成的代码可能会有点冗长,但谁在意呢。只需将整个类“生成的代码”复制到您的项目中并根据需要进行修改。我建议将代码分成许多#region块,以隐藏对您无聊的内容,从而能够专注于您需要更改或复制的内容。同时归档未更改的生成代码。如果以后对模板电子表格进行了小的更改,请使用“diff”工具查看哪些代码发生了变化。 - Roland
OpenXML Productivity工具已经迁移到GitHub https://github.com/OfficeDev/Open-XML-SDK/releases/tag/v2.5 - nimblebit

0

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

这个答案应该可以帮助您入门: https://dev59.com/D2gu5IYBdhLWcg3wv5Ya#11118442


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接