web-dev-qa-db-fra.com

OpenXML SDK ayant des bordures pour la cellule

J'ai le code suivant qui ajoute une cellule avec des valeurs et un type de données pour cette cellule dans OpenXML SDK: 

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

Pour cette cellule, comment ajouter une bordure de chaque côté? J'aime aussi ajouter une couleur de fond sur la cellule.

J'ai le suivant mais je ne sais pas comment ajouter la bordure à la cellule:

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

Merci d'avance

12
Nate Pet

Je recommande d'installer l'outil de productivité Open XML 2.0 . Créez ensuite un document Excel vierge contenant la bordure et la couleur souhaitées. Ouvrez ce fichier dans l'outil de productivité, puis cliquez sur le code de réflexion. Il vous donnera ensuite le code C # nécessaire pour produire cette bordure et cette couleur d'arrière-plan. Le code est un peu long pour la publication, mais si vous suivez ces étapes, vous devriez pouvoir l’utiliser.

**Modifier**

Les propriétés de bordure et de remplissage sont stockées dans une partie distincte appelée WookbookStylesPart. Cette partie est l'endroit où vous allez insérer le type de bordure, de remplissage, de police, etc. que vous souhaitez appliquer à une cellule d'un classeur. Ces propriétés sont stockées dans une structure de type tableau où vous accédez au style que vous avez inséré via un index. Étant donné que vous pouvez appliquer plusieurs styles à une cellule, un objet CellFormat est l'emplacement où sont stockés tous les index des différents styles. Une fois que vous avez une CellFormat pour une cellule, son index doit être référencé sur la cellule réelle via la propriété StlyeIndex. C'est ainsi que la cellule sait appliquer les différents styles sur elle-même.

Voici le code pour créer la bordure:

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

Voici le code pour ajouter un remplissage:

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

Vous aurez besoin de ce code pour insérer la bordure et la remplir dans la partie style:

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

Vous devrez d'abord obtenir une référence à la cellule à laquelle vous souhaitez ajouter le remplissage et la bordure à l'endroit où cellAddress est sous la forme "B2":

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

Ensuite, une fois que vous avez obtenu votre cellule, vous devez obtenir la variable CellFormat appartenant à cette cellule et ajouter une nouvelle variable 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++;
}

Une fois que vous avez la CellFormat, vous pouvez maintenant modifier les propriétés de remplissage et de bordure. Une fois ceux-ci modifiés, vous devez insérer la nouvelle CellFormat, puis pointer l'index de cette CellFormat sur la StyleIndex de la cellule. C'est ainsi que la cellule saura quels styles appliquer à elle-même.

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

Beaucoup plus facile d'appeler 

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

Le SpreadsheetDocument est structuré comme une collection de WorkbookParts . L'un d'eux, le WorkbookStylesPart , contient tous les styles utilisés dans le document. Le WorkbookPart contient votre Feuilles de travail . Pour appliquer un style à une cellule ou à une plage de cellules, vous devez définir la propriété StyleIndex sur le style correspondant dans WorkbookStylesPart.

Cette réponse devrait vous aider à démarrer: https://stackoverflow.com/a/11118442/741326

0
saarp