2009-06-18 10 views
15

J'ai créé un document Excel en utilisant OpenXml SDK 2.0, maintenant je dois le styliser, mais je ne peux pas.Création de document Excel avec OpenXml sdk 2.0

Je ne sais pas comment peindre la couleur de fond ou changer 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; 
} 

Répondre

18

Note: 2.0 SDK OpenXML est actuellement en CTP et n'a pas de licence pour l'utilisation de la production jusqu'à Office2010. Ma méthode générale pour faire face à OpenXML SDK est de créer un document vierge et un document avec les fonctionnalités que vous souhaitez apprendre à implémenter (comme la couleur de fond) et d'utiliser OpenXmlDiff du SDK pour voir les changements nécessaires être fait pour implémenter la fonctionnalité.

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

A 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 (Indexé valeur 64), et a ajouté de nouvelles CellFormats qui font référence à l'indice du nouveau Font et Fill. (Assurez-vous de mettre à jour les Comtes trop)

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, je demande l'indice de CellStyle aux cellules que je veux formater. (Il y avait déjà des données dans les cellules A2 et A3 cellule A2 obtient la taille plus grande, A3 devient 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; 
+0

+1 Merci beaucoup. Votre message m'a vraiment donné un bon départ. – horgh

2

Comment spécifier un style de cellule?

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

Ici « 11U » est un indice de base zéro de StylesPart.Stylesheet.CellFormats, dans lequel chaque CellFormat définit une combinaison de NumberFormat, police, Fill et styles frontaliers.

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

+0

Bonjour Hailaing Wang. Je ne suis pas sûr de ce que vous avez mentionné sur la façon de modifier un style d'une cellule. Comment obtenez-vous StyleIndex = 11U. Ce dont j'ai besoin dans mon cas, c'est que la cellule ait des bordures. J'ai aussi besoin d'avoir un fond bleu. Pouvez-vous répondre à http://stackoverflow.com/questions/15791732/openxml-sdk-having-borders-for-cell. Merci d'avance –

9

Un grand merci pour cet article.

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

Tout à coup, le processus d'ajout d'une fonction à votre application « Exporter vers 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, plus 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 utilisez VS2010.

Profitez-en.

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

+0

De votre blog: * Je n'ai pas ajouté de licence, car il s'agit d'un code gratuit, à utiliser comme vous le souhaitez. * Réalité légale: * l'absence de licence signifie que les lois de copyright par défaut s'appliquent * (disclaimer - IANAL - Je ne suis pas avocat –

Questions connexes