web-dev-qa-db-fra.com

Application du format% number à une valeur de cellule à l'aide d'OpenXML

Je souhaite appliquer le format numérique% (pourcentage) à l'aide de XML ouvert C #

J'ai la valeur numérique 3.6 que je veux afficher ce nombre dans Excel comme `3,6%.

Comment puis-je y parvenir?

20
Selwyn
  WorkbookStylesPart sp = workbookPart.AddNewPart<WorkbookStylesPart>();

Créez une feuille de style,

 sp.Stylesheet = new Stylesheet();

Créez un format de numérotation,

sp.Stylesheet.NumberingFormats = new NumberingFormats();
// #.##% is also Excel style index 1


NumberingFormat nf2decimal = new NumberingFormat();
nf2decimal.NumberFormatId = UInt32Value.FromUInt32(3453);
nf2decimal.FormatCode = StringValue.FromString("0.0%");
sp.Stylesheet.NumberingFormat.Append(nf2decimal);

Créez un format de cellule et appliquez l'ID du format de numérotation

cellFormat = new CellFormat();
cellFormat.FontId = 0;
cellFormat.FillId = 0;
cellFormat.BorderId = 0;
cellFormat.FormatId = 0;
cellFormat.NumberFormatId = nf2decimal.NumberFormatId;
cellFormat.ApplyNumberFormat = BooleanValue.FromBoolean(true);
cellFormat.ApplyFont = true;

//append cell format for cells of header row
sp.Stylesheet.CellFormats.AppendChild<CellFormat>(cellFormat);


//update font count 
sp.Stylesheet.CellFormats.Count = UInt32Value.FromUInt32((uint)sp.Stylesheet.CellFormats.ChildElements.Count);


//save the changes to the style sheet part   
sp.Stylesheet.Save();

et lorsque vous ajoutez la valeur à la cellule, ayez le code central suivant dans la version et appliquez l'index de style dans mon cas, j'avais trois index de style, donc le 3 était mon index de style en pourcentage, c'est-à-dire 2 puisque les index commencent à partir de 0

string val = Convert.ToString(Convert.ToDecimal(value)/100);
Cell cell = new Cell();
cell.DataType = new EnumValue<CellValues>(CellValues.Number);
cell.CellValue = new CellValue(val);
cell.StyleIndex = 2;
row.Append(cell);
25
Selwyn

Malheureusement, il n'y a pas de réponse simple. Si vous téléchargez l'Outil de productivité OpenXML pour Microsoft Office, vous pouvez disséquer une simple feuille de calcul et voir comment elle met en forme le nombre. Pour faire exactement ce que vous voulez, vous devez:

  • Créer une feuille de style
  • Ajoutez un nouveau NumberFormat avec votre définition personnalisée
  • Créez un CellStyleFormat, complet avec Border, Fill, Font tous définis, en plus du NumberFormat ci-dessus
  • Créer un CellFormats, qui fait référence à ce qui précède
  • Enfin, définissez StyleIndex de votre cellule sur l'ID de votre CellFormat qui utilise le NumberFormat.

OUF!

Une option généralement meilleure consiste à regarder ClosedXML à http://closedxml.codeplex.com/ (nom horrible). C'est une bibliothèque open source (PAS GPL! - vérifiez la licence) qui met des extensions utiles sur OpenXML. Pour formater une cellule d'une feuille de calcul, vous devez plutôt:

worksheet.Cell(row, col).Value = "0.036";
worksheet.Cell(row, col).Style.NumberFormat.Format = "0.0%";

(depuis http://closedxml.codeplex.com/wikipage?title=Styles%20-%20NumberFormat&referringTitle=Documentation )


[~ # ~] mise à jour [~ # ~] ClosedXML est passé à GitHub à https://github.com/ClosedXML/ClosedXML

16
jklemmack

Excel contient des formats prédéfinis pour formater les chaînes de différentes manières. L'attribut s sur un élément de cellule fera référence à un style qui fera référence à un format numérique qui correspondra au format de pourcentage souhaité. Voir ceci question/réponse pour plus d'informations.

Voici l'objet CellFormat que vous devrez créer pour que le masque de 0,00% soit appliqué à votre numéro. Dans ce cas, vous voulez le numéro de format prédéfini 10 ou 0,00%:

CellFormat cellFormat1 = new CellFormat(){ NumberFormatId = (UInt32Value)10U, FontId = (UInt32Value)0U, FillId = (UInt32Value)0U, BorderId = (UInt32Value)0U, FormatId = (UInt32Value)0U, ApplyNumberFormat = true };

Voici un moyen rapide d'insérer le CellFormat dans le classeur:

CellFormats cellFormats = workbookPart.WorkbookStylesPart.Stylesheet.Elements<CellFormats>().First();
cellFormats.Append(cellFormat);
uint styleIndex =  (uint)cellFormats.Count++;

Vous devrez ensuite récupérer la cellule contenant le 3.6 et définir son attribut s (StyleIndex) au format de cellule nouvellement inséré:

Cell cell = workSheetPart.Worksheet.Descendants<Cell>().SingleOrDefault(c => cellAddress.Equals("A1"));
cell.StyleIndex = styleIndex;
4
amurra

Vous pouvez le faire de manière simple. Si vous souhaitez l'appliquer sur une seule cellule, faites-le,

worksheet.Cell(9, 10).Style.NumberFormat.Format = "#,##0.00\\%"; 

Et si vous voulez l'appliquer sur une gamme de cellules, faites-le,

worksheet.Range(9, 10, 15, 10).Style.NumberFormat.Format = "#,##0.00\\%"; 

vous pouvez également trouver plus de formats ici , et vous pouvez également trouver la même chose dans Excel.

1
Smit Patel