2011-10-24 22 views

risposta

21
WorkbookStylesPart sp = workbookPart.AddNewPart<WorkbookStylesPart>(); 

Creare un foglio di stile,

sp.Stylesheet = new Stylesheet(); 

Creare un numberingformat,

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

Creare un formato di cella e applicare l'id formato di numerazione

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

e quando si aggiunge il valore alla cella avere il seguente codice del centro hereonversion e applicare l'indice di stile nel mio caso ho avuto tre indice di stile quindi il 3 è stato il mio indice di stile percentuale 2 poiché gli indici iniziano da 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); 
+0

Questo flusso ha funzionato, potremmo avere una formattazione di celle con questo processo. Grazie ssyladin – Selwyn

+0

Nessun problema. In realtà trascorrono circa 30 minuti cercando di eseguire la formattazione "manualmente" solo con OpenXML e alla fine si arrendono. Continuava a ottenere un foglio di lavoro corrotto. Quindi questa è una buona risposta a me, dal momento che aiuta a evitare le dipendenze della libreria esterna. – jklemmack

+1

Il commento sull'indice di stile Excel indica che, se si desidera utilizzare lo stile percentuale di Excel predefinito, non è necessario aggiungere un nuovo formato, è sufficiente impostare la cella sull'indice di stile 1? – cidthecoatrack

14

Purtroppo non c'è una risposta diretta. Se scarichi OpenXML Productivity Tool per Microsoft Office, puoi sezionare un semplice foglio di calcolo e vedere come formatta il numero. Per fare solo ciò che si vuole si avrebbe bisogno di:

  • Creare un foglio di stile
  • Aggiungi un nuovo NumberFormat con la definizione personalizzata
  • Creare un CellStyleFormat, completo di bordo, riempire, Font tutti definiti, in aggiunta al NumberFormat sopra
  • Creare un CellFormats, che si riferisce a quanto sopra
  • Infine imposta lo StyleIndex della tua cella sull'ID del tuo CellFormat che utilizza NumberFormat.

WHEW!

Un'opzione generalmente migliore è guardare ClosedXML a http://closedxml.codeplex.com/ (nome horrid). È una libreria open source (NON GPL! - controlla la licenza) che mette utili estensioni su OpenXML. Per formattare una cella di un foglio di lavoro, devi invece fare:

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

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


UPDATE ClosedXML si è spostato a GitHub a https://github.com/ClosedXML/ClosedXML

+0

questo può funzionare, tuttavia richiede un'aggiunta di terze parti, non "semplice" OpenXml. – fcm

4

Excel contiene predefinito formati per formattare le stringhe in vari modi. L'attributo s su un elemento di cella farà riferimento a uno stile che farà riferimento a un formato numerico che corrisponderà al formato percentuale desiderato. Vedere questo question/answer per ulteriori informazioni.

Ecco l'oggetto CellFormat che dovrai creare per applicare la maschera 0.00% al tuo numero. In questo caso si desidera che il numero di formato predefinito 10 o 0,00%:

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

Ecco un modo veloce per inserire il CellFormat nella cartella di lavoro:

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

Sarà quindi necessario per ottenere la cella che ha il 3.6 in esso e impostare è s attributo (StyleIndex) al formato della cella appena inserito:

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

Si può fare in un modo semplice. Se si desidera applicare su singola cellula poi fare questo,

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

e se si desidera applicare su un intervallo di celle, allora fare questo,

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

si possono anche trovare altri formati Here e anche tu puoi trovare lo stesso da Excel.

+1

Questo non è OpenXml come indicato nella domanda. – fcm

Problemi correlati