Sayıların biçimlendirilmesinde tarih olarak çok yer var.
Numara biçimiyle başlamalısınız. İstediğiniz desene uyan yerleşik formatı ya da özel bir tane oluşturun. Yerleşik biçimler, ECMA-376, İkinci Sürüm, Kısım 1 - Temel Bilgiler ve İşaretleme Dili Başvurususection 18.8.30 (stiller ve <numFmt>
referansı içindir. Özel bir biçim oluşturmanız gerekiyorsa, Kimlik 164 ile başlayın ve bunları ekleyin. bir tarih biçimi belirtir hücre biçimi olması gerekir
doc.WorkbookPart.WorkbookStylesPart.Stylesheet.NumberingFormats
Sonraki hep hayır almanın doğasında vardır hücre biçimi gerekir:. gibi styles.xml
dosya içinde <numFmts>
eleman Bu SDK erişilebilir. Hücre stili, numFmtId
numaralı sayı biçimini ifade eder ve içinde <cellXfs>
içinde tanımlanmıştır. Buna sdk olarak erişilebilir:
doc.WorkbookPart.WorkbookStylesPart.Stylesheet.CellStyles
Hücre stilleri kendilerinin bir kimliği yoktur. Hücre stilleri listesinde sıfır indeks pozisyonu ile anılırlar. Böylece hücrelerinizi oluştururken, stil indekslerini tarihleriniz için istediğiniz stile ayarlayın.
Değer için bunları ISO 8601 biçiminde saklayabilirsiniz, ancak Excel 2010, tarihlerini saklamak için hala tarih seri biçimini kullanır. 1900 tabanlı bir tarih dizisinden başka bir şey kullanırsanız, onu çalışma kitabı özelliklerinde belirtmeniz gerekir.tarih seri değerleri depolamak için iki tarih uyumluluk ayarları
doc.WorkbookPart.Workbook.WorkbookProperties.DateCompatibility
vardır, bunlar temel olabilecek 1900 veya baz 1904. 1900 Ne Excel 2010 kullanır ve 1904 Mac için eski Excel ile geriye dönük uyumluluk içindir.
1900 tarihli dizilerde, 31 Aralık 1899'dan bu yana geçen gün sayısı, 1900'lü yılların teknik olarak bir atlama yılı olmamasına rağmen, 29 Şubat 1900 tarihinde geçerli bir tarih olarak ele almanız gereken ek bir karmaşadır.
Tarih seri değerlerinden DateTime'a dönüştürmek için yazdığım yöntem aşağıdadır. Geriye ihtiyacın var.
/// <summary>
/// Represents the formula used for converting date serial values stored within the workbook into DateTime instances.
/// </summary>
/// <remarks>
/// Information on date serial conversion is available here: http://www.documentinteropinitiative.com/implnotes/ISO-IEC29500-2008/001.018.017.004.001.000.000.aspx
/// </remarks>
public enum XlsxDateCompatibility
{
/// <summary>
/// Standard dates are based on December 30, 1899 and are considered "Standard 1900" dates.
/// </summary>
StandardBase1900,
/// <summary>
/// Excel for Windows backwards compatible dates are based on December 31, 1899 are are considered "Backwards compatible 1900" dates.
/// </summary>
BackwardsCompatibleBase1900,
/// <summary>
/// Excel for Macintos backwards compatible dates are based on January 1, 1904 and are considered "1904" dates.
/// </summary>
BackwardsCompatibleBase1904
}
private static readonly IDictionary<XlsxDateCompatibility, DateTime> _dateSerialBaseDates
= new Dictionary<XlsxDateCompatibility, DateTime>
{
{XlsxDateCompatibility.StandardBase1900, new DateTime(1899, 12, 30)},
{XlsxDateCompatibility.BackwardsCompatibleBase1900, new DateTime(1899, 12, 31)},
{XlsxDateCompatibility.BackwardsCompatibleBase1904, new DateTime(1904, 1, 1)}
};
public static DateTime DateSerialToDateTime(double dateSerial, XlsxDateCompatibility dateCompatibility)
{
// special case for dateCompaitility 1900, Excel thinks 1900 is a leap year
// http://support.microsoft.com/kb/214019
if (dateCompatibility == XlsxDateCompatibility.BackwardsCompatibleBase1900 && dateSerial >= 61.0)
{
dateSerial -= 1;
}
DateTime baseDate;
if (!_dateSerialBaseDates.TryGetValue(dateCompatibility, out baseDate))
{
baseDate = _dateSerialBaseDates[XlsxDateCompatibility.StandardBase1900];
}
return baseDate.AddDays(dateSerial);
}
den Closed XML
gibi bir kütüphane kullanarak sürmüştür? –
Office Open XML özelliklerini okudunuz mu? Sadece 6.000 sayfa var ... :-) jk elbette, şu anda benzer "küçük" konularla mücadele ediyorum. –
nope Hiç yapmadım, bu konuda üzgünüm ... biz sayfaları yapan bir üçüncü parti aracı kullanmaya karar verdik :) –