Soru OpenXML kullanarak% number formatını bir hücre değerine uygulama


Açık XML C # kullanarak% (yüzde) sayı biçimini uygulamak istiyorum

3.6 nolu sayısal değere sahibim, bu sayıyı excel olarak% 3.6 olarak göstermek istiyorum.

Bunu nasıl başarabilirim?


19
2017-10-24 06:47


Menşei




Cevaplar:


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

Bir stil sayfası oluşturun

 sp.Stylesheet = new Stylesheet();

Bir numara oluşturma

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

Bir hücre formatı oluşturun ve numaralandırma formatı kimliğini uygulayın

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

ve hücrenin değerine eklediğinizde, aşağıdaki orta kodu takip edip stil indeksini uygulayabilirsiniz. Benim durumumda üç stil indeksi vardı, bu yüzden 3 bir benim yüzde stili indeksi oldu.

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

21
2017-10-26 08:37



Bu akış, bu işlemi kullanarak herhangi bir hücre formatına sahip olabileceğimiz için çalıştı. Teşekkürler ssyladin - Selwyn
Telaşa gerek yok. Aslında sadece OpenXML ile "elle" biçimlendirme yapmaya ve sonunda vazgeçmeye ~ 30 dakika harcayın. Bozuk bir çalışma sayfası almayı tuttu. Yani bu benim için iyi bir cevap, çünkü dış kütüphane bağımlılıklarından kaçınmaya yardımcı oluyor. - jklemmack
Excel stil indeksi hakkındaki yorumunuz, varsayılan Excel yüzde stilini kullanmak istiyorsanız, yeni bir biçim eklemeniz gerekmediğini, sadece hücreyi dizin 1'e ayarlamanız gerektiği anlamına mı geliyor? - cidthecoatrack


Ne yazık ki doğru bir cevap yok. Microsoft Office için OpenXML Üretkenlik Aracı'nı indirirseniz, basit bir elektronik tabloyu kesebilir ve sayıyı nasıl biçimlendirdiğini görebilirsiniz. İstediğin şeyi yapman gerekecek:

  • Stil Sayfası Oluştur
  • Özel tanımınızla yeni bir NumberFormat ekleyin
  • Yukarıdaki NumberFormat'a ek olarak, Border, Fill, Font tanımlanmış tüm ile bir CellStyleFormat oluşturun.
  • Yukarıda belirtilen bir CellFormats oluşturun.
  • Son olarak, Cell'in StyleIndex'ini, NumberFormat kullanan CellFormat'ınızın kimliğine ayarlayın.

Süper!

Genel olarak daha iyi bir seçenek de ClosedXML'ye bakmaktır. http://closedxml.codeplex.com/ (horrid adı). OpenXML üzerinde faydalı uzantıları koyan açık bir kaynak (GPL! - lisansı kontrol et) kütüphanesi. Bir çalışma sayfasının bir hücresini biçimlendirmek için şunları yapmak istersiniz:

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

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


GÜNCELLEŞTİRME ClosedXML, GitHub'a taşındı https://github.com/ClosedXML/ClosedXML


15
2017-10-25 06:25



Bu işe yarayabilir, ancak 'düz' OpenXml değil, üçüncü taraf ek gerektirir. - fcm


Excel, dizeleri çeşitli şekillerde biçimlendirmek için önceden tanımlı biçimler içerir. s Bir hücre öğesinin özniteliği, istediğiniz yüzde biçimine karşılık gelen bir sayı biçimine atıfta bulunacak bir stile başvurur. Bunu gör soru cevap daha fazla bilgi için.

Burada,% 0,00 maskenin numaranıza uygulanabilmesi için oluşturmanız gereken CellFormat nesnesi. Bu durumda, önceden tanımlı biçim 10 veya% 0,00 olmasını istersiniz:

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

İşte CellFormat'ı çalışma kitabına eklemek için hızlı bir yol:

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

Daha sonra 3.6 olan hücreyi almanız ve ayarlamanız gerekir. s Yeni eklenen hücre biçimine (StyleIndex) özniteliği:

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

4
2017-10-25 13:20





Bunu basit bir şekilde yapabilirsiniz. Tek hücreye uygulamak istiyorsanız bunu yapın,

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

Ve bunu bir Hücre Aralığında uygulamak istiyorsanız, bunu yapın,

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

daha fazla format da bulabilirsiniz İşteve aynı zamanda Excel'den de aynısını bulabilirsiniz.


2
2017-10-19 15:39



Bu, soruda belirtildiği gibi OpenXml değildir. - fcm