Question

J'ai créé un document Excel avec OpenXml SDK 2.0, je dois maintenant le styliser, mais je ne peux pas.

Je ne sais pas comment peindre la couleur d'arrière-plan ni modifier la taille de la police dans différentes cellules.

Mon code pour créer une cellule est:

private static Cell CreateTextCell(string header, string text, UInt32Value index)
{
    Cell c = new Cell();
    c.DataType = CellValues.InlineString;
    c.CellReference = header + index;
    InlineString inlineString = new InlineString();
    DocumentFormat.OpenXml.Spreadsheet.Text t = new DocumentFormat.OpenXml.Spreadsheet.Text();
    t.Text = text;
    inlineString.AppendChild(t);
    c.AppendChild(inlineString);
    return c;
} 
Était-ce utile?

La solution

Remarque: Le SDK OpenXML 2.0 est actuellement au format CTP et n'est pas concédé sous licence pour une utilisation en production avant Office2010.

Ma méthode générale pour traiter avec OpenXML SDK est de créer un document vierge et un document contenant uniquement les fonctionnalités que vous souhaitez apprendre à mettre en œuvre (comme la couleur d'arrière-plan) et d'utiliser OpenXmlDiff du kit de développement pour voir quelles modifications doivent être apportées. fait pour mettre en œuvre la fonctionnalité.

Si vous créez un document à partir de rien, vous pouvez utiliser DocumentReflector pour générer le code de l'objet Stylesheet par défaut, puis ajouter les styles dont vous avez besoin.

À partir de la valeur par défaut:

new Stylesheet(
new Fonts(
    new Font(
        new FontSize() { Val = 10D },
        new Color() { Theme = (UInt32Value)1U },
        new FontName() { Val = "Arial" },
        new FontFamilyNumbering() { Val = 2 })
) { Count = (UInt32Value)1U },
new Fills(
    new Fill(
        new PatternFill() { PatternType = PatternValues.None }),
    new Fill(
        new PatternFill() { PatternType = PatternValues.Gray125 })
) { Count = (UInt32Value)2U },
new Borders(...
...
...
new CellFormats(
new CellFormat() { NumberFormatId = (UInt32Value)0U, FontId = (UInt32Value)0U, FillId = (UInt32Value)0U, BorderId = (UInt32Value)0U, FormatId = (UInt32Value)0U }) { Count = (UInt32Value)1U }, ...

J'ai ajouté une nouvelle police de taille 12 et un nouveau remplissage avec un fond rouge (valeur indexée 64), ainsi que de nouveaux CellFormats qui référencent l'index de la nouvelle police et du nouveau remplissage. (Assurez-vous également de mettre à jour les comptes)

new Stylesheet(
    new Fonts(
        new Font(
            new FontSize() { Val = 10D },
            new Color() { Theme = (UInt32Value)1U },
            new FontName() { Val = "Arial" },
            new FontFamilyNumbering() { Val = 2 }),
        new Font(
            new FontSize() { Val = 12D },
            new Color() { Theme = (UInt32Value)1U },
            new FontName() { Val = "Arial" },
            new FontFamilyNumbering() { Val = 2 })
            ) { Count = (UInt32Value)2U },
    new Fills(
        new Fill(
            new PatternFill() { PatternType = PatternValues.None }),
        new Fill(
            new PatternFill() { PatternType = PatternValues.Gray125 }),
        new Fill(
            new PatternFill() { PatternType = PatternValues.Solid, ForegroundColor = new ForegroundColor() { Rgb = "FFFF0000" }, BackgroundColor = new BackgroundColor() { Indexed = 64 } })
            ) { Count = (UInt32Value)3U },
    new Borders(
        new Border(
            new LeftBorder(), new RightBorder(), new TopBorder(), new BottomBorder(), new DiagonalBorder())
    ) { Count = (UInt32Value)1U },
    new CellStyleFormats(
        new CellFormat() { NumberFormatId = (UInt32Value)0U, FontId = (UInt32Value)0U, FillId = (UInt32Value)0U, BorderId = (UInt32Value)0U }
    ) { Count = (UInt32Value)1U },
    new CellFormats(
        new CellFormat() { NumberFormatId = (UInt32Value)0U, FontId = (UInt32Value)0U, FillId = (UInt32Value)0U, BorderId = (UInt32Value)0U, FormatId = (UInt32Value)0U },
        new CellFormat() { NumberFormatId = (UInt32Value)0U, FontId = (UInt32Value)1U, FillId = (UInt32Value)0U, BorderId = (UInt32Value)0U, FormatId = (UInt32Value)0U },
        new CellFormat() { NumberFormatId = (UInt32Value)0U, FontId = (UInt32Value)0U, FillId = (UInt32Value)2U, BorderId = (UInt32Value)0U, FormatId = (UInt32Value)0U }
    ) { Count = (UInt32Value)3U },
    new CellStyles(
        new CellStyle() { Name = "Normal", FormatId = (UInt32Value)0U, BuiltinId = (UInt32Value)0U }
    ) { Count = (UInt32Value)1U },
    new DifferentialFormats() { Count = (UInt32Value)0U },
    new TableStyles() { Count = (UInt32Value)0U, DefaultTableStyle = "TableStyleMedium9", DefaultPivotStyle = "PivotStyleLight16" });

Ensuite, dans le code, j'applique l'index CellStyle aux cellules que je souhaite formater: (Il y avait déjà des données dans les cellules A2 et A3. La cellule A2 a une taille plus grande, A3 a un fond rouge)

SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>();
sheetData.Descendants<Row>().Where(r => r.RowIndex == 2U).First().Descendants<Cell>().First().StyleIndex = 1U;
sheetData.Descendants<Row>().Where(r => r.RowIndex == 3U).First().Descendants<Cell>().First().StyleIndex = 2U;

Autres conseils

Merci beaucoup pour cet article.

Après beaucoup de difficultés (et de recherche sur Google), j'ai finalement réussi à créer une classe C # très facile à utiliser, qui prend à la fois un DataSet et un nom de fichier, et crée un .xlsx Office 2007. contenant les données du DataSet.

Soudain, le processus d’ajout d’une fonction à votre application dans "Exporter dans Excel". devient aussi facile que ...

DataSet ds = CreateSampleData();                  //  Your code here !
string excelFilename = "C:\\Sample.xlsx";

CreateExcelFile.CreateExcelDocument(ds, excelFilename);

J'ai posté le code source complet, ainsi qu'un exemple d'utilisation, sur le site Web suivant.

Il s'agit d'une application Visual Studio 2008 C # WinForms, mais vous pouvez laisser Visual Studio mettre à niveau ce projet si vous exécutez VS2010.

Profitez.

http://www.mikesknowledgebase.com/pages/CSharp/ExportToExcel.htm

Comment spécifier un style de cellule?

new Cell() { CellReference = "B6", StyleIndex = 11U }

Ici " 11U " est un index à base zéro de StylesPart.Stylesheet.CellFormats, dans lequel chaque CellFormat définit une combinaison de styles NumberFormat, Police, Remplissage et Bordure.

Vous n'avez pas besoin d'ajouter tous les styles par programme. Vous pouvez créer un fichier de modèle xlsx contenant tous les formats nécessaires, puis spécifier l'index de style dans votre programme.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top