SDK OpenXML con bordes para la celda

Tengo el siguiente código que agrega una celda con valores y tipo de datos para esa celda en OpenXML SDK:

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

Para esta celda, ¿cómo agrego un borde en cada lado? También me gusta agregar un color de fondo en la celda también.

Tengo lo siguiente pero no estoy seguro de cómo agregar el borde a la celda:

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

Gracias por adelantado

Recomiendo instalar la herramienta de productividad Open XML 2.0 . Luego, cree un documento de Excel en blanco que contenga el borde y el color que desee. Abra ese archivo en la herramienta de productividad y luego haga clic en reflejar código. Luego le dará el código C # que se requiere para producir ese borde y color de fondo. El código es un poco largo para publicar, pero si sigue estos pasos, debería poder usarlo.

**Editar**

Las propiedades de borde y relleno se almacenan en una parte separada llamada WookbookStylesPart . Esta parte es donde insertarás el tipo de borde, relleno, fuente, etc. que quieras aplicar a una celda dentro de un libro de trabajo. Estas propiedades se almacenan en una estructura de tipo de matriz en la que accede al estilo que insertó a través de un índice. Dado que puede tener múltiples estilos aplicados a una celda, un objeto CellFormat es donde se almacenan todos los índices para los diversos estilos. Una vez que tiene un CellFormat para una celda, su índice debe ser referenciado en la celda real a través de la propiedad StlyeIndex . Así es como la célula sabe cómo aplicar los diversos estilos en sí misma.

Aquí está el código para crear el borde:

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

Aquí está el código para agregar un relleno:

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

Necesitará este código para insertar el borde y rellenar la parte de estilo:

 public uint InsertBorder(WorkbookPart workbookPart, Border border) { Borders borders = workbookPart.WorkbookStylesPart.Stylesheet.Elements().First(); borders.Append(border); return (uint)borders.Count++; } public uint InsertFill(WorkbookPart workbookPart, Fill fill) { Fills fills = workbookPart.WorkbookStylesPart.Stylesheet.Elements().First(); fills.Append(fill); return (uint)fills.Count++; } 

Necesitará primero obtener una referencia a la celda que desea agregar el relleno y el borde donde está cellAddress en forma de “B2”:

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

Luego, una vez que obtenga su celular, debe obtener el CellFormat que pertenece a esa celda y también agregar un nuevo CellFormat :

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

Una vez que tenga el CellFormat , ahora puede modificar las propiedades de relleno y borde. Una vez que se alteran, debe insertar el nuevo CellFormat y luego apuntar el índice de ese CellFormat al StyleIndex en la celda. Así es como la célula sabrá qué estilos aplicar a sí mismo.

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

Mucho más fácil simplemente llamar

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

SpreadsheetDocument está estructurado como colección de WorkbookParts . Uno de estos, WorkbookStylesPart , contiene todos los estilos utilizados en el documento. WorkbookPart contiene sus hojas de trabajo . Para aplicar un estilo a una celda o rango de celdas, debe establecer la propiedad StyleIndex en el estilo correspondiente en WorkbookStylesPart.

Esta respuesta debería ayudarlo a comenzar: https://stackoverflow.com/a/11118442/741326