Büyük excel dosyalarını ayrıştırmak için C# kullanarak Open XML 2.0 ile çalışma. Çalıştığım sorun, ayrıştıracağım hücrenin bir DataType I içermemesi ve ondalık, sayı veya tarih olup olmadığını belirlemek için NumberFormatId değerini kontrol etmektir. Sayılar/ondalık sayılar ve tarihler için tam NumberFormatId aralığını arıyorum. Bazı sayıların/ondalıkların 189,212,214,305 biçiminde ve 185, 194, 278 değerlerine sahip tarihler gibi yerlerin her yerinde olduğu görülüyor. Şartnamenin bu aralıkları tanımlayıp tanımlamadığını bilen var mı?C# Açık XML 2.0 NumberFormatId aralığı
Düzenlendi - Fazla Bilgi Aşağıda
xl klasörünün içindeki style.xml dosyasından 194 sayısının biçiminin bir örneğidir.
Excel sayfaları dünyanın farklı bölgelerinden geliyor, bu yüzden sayı biçimlerinin farklı olduğunu düşünüyorum, fakat çakışıyor mu? NumFmtId 194, farklı kültür ayarlarında bir tarih dışında bir şey olacak mı?
"40574" gibi c.CellValues'ı tarihlere nasıl dönüştürdüğüm aşağıda açıklanmıştır, ancak sorun "40574" bir tarih değil, bir sayı olup olmadığını nasıl anlarım? NumberFormatId bazıları benim kontrol altında olmadığında CellFormat kontrol ama sorunlar vardır daha VeriTürü varsa
DateTime.FromOADate(Convert.ToDouble(c.CellValue.Text));
Şu anda kontrol ederek yapıyorum. Ben nasıl sorum olacak bu Yani
<numFmt numFmtId="323" formatCode="mmm/yy;@"/>
:
private Object FormatCellValue(Cell c, SharedStringTable ssTable, CellFormats cellFormats)
{
if (c.CellValue != null)
{
// If there is no data type, this must be a string that has been formatted as a number
if (c.DataType == null)
{
CellFormat cf;
if (c.StyleIndex == null)
{
cf = cellFormats.Descendants<CellFormat>().ElementAt<CellFormat>(0);
}
else
{
cf = cellFormats.Descendants<CellFormat>().ElementAt<CellFormat>(Convert.ToInt32(c.StyleIndex.Value));
}
if ((cf.NumberFormatId >= 14 && cf.NumberFormatId <= 22) ||
(cf.NumberFormatId >= 165 && cf.NumberFormatId <= 180) ||
cf.NumberFormatId == 278 || cf.NumberFormatId == 185 || cf.NumberFormatId == 196 ||
cf.NumberFormatId == 217 || cf.NumberFormatId == 326) // Dates
{
try
{
DateTime dt;
dt = DateTime.FromOADate(Convert.ToDouble(c.CellValue.Text));
...CODE CONTINUES
Düzenleme benim güncellenen gönderide
ben style.xml dosyasında bulunan değeri yazılan unuttum formatCode olsun ve bir tarih olup olmadığını belirlemek için ayrıştırmak? Aşağıda
NumberFormat derhal ayıklama penceresinden çıkışı 323{DocumentFormat.OpenXml.Spreadsheet.CellFormat}
base {DocumentFormat.OpenXml.OpenXmlCompositeElement}: {DocumentFormat.OpenXml.Spreadsheet.CellFormat}
Alignment: {DocumentFormat.OpenXml.Spreadsheet.Alignment}
ApplyAlignment: "1"
ApplyBorder: "1"
ApplyFill: "1"
ApplyFont: "1"
ApplyNumberFormat: "1"
ApplyProtection: "1"
BorderId: "64"
ExtensionList: null
FillId: "0"
FontId: "83"
FormatId: "37992"
LocalName: "xf"
NumberFormatId: "323"
PivotButton: null
Protection: {DocumentFormat.OpenXml.Spreadsheet.Protection}
QuotePrefix: "1"
Tamsayı değerleri ve karşılık gelen biçimleri olan bir tablo içeren sayfalara bakın: http://closedxml.codeplex.com/wikipage?title=NumberFormatId%20Lookup%20Table veya http://lateral8.com/articles/2010 /6/11/openxml-sdk-20-formatting-excel-values.aspx. –
Bu konuda daha fazla yardım ister misiniz, yoksa bu bağlantılar sorununuzu çözmek için yeterliydi? Eğer öyleyse, bunu bir çözüm olarak gönderebilirim :). Daha fazla bilgi isterseniz veya farklı bir şey arıyorsanız, bana bildirin ve yardım etmeye çalışacağım. –
Bunun hakkında daha fazla bilgiye ihtiyacınız var. Sağlanan bağlantılar, 189,212,214,305 numaralı sorgumda listelediğim formatları kapsamaz. Tüm tarihler ile sayı/ondalık veya dizge için bir aralık aradığımdan. – maguy