2010-07-22 10 views
6

Bunu bulmakta zorlanıyorum.C# Açık Xml SDK 2.0 Elektronik Tablo Ayarı Hücre DateTime Formatı

benim durum:

  • SDK 2.0
  • hiçbir şablon tablo
  • VS2010 C# 4,0

benim problem: Ben inşa etmek isteyen excel dosyalarında
Belirli veriler var DateTime formatında. Sadece dizeleri kullanmamaya başladığımdan (telli dosyalar düzgün şekilde sıralanamıyor) Excel'de DateTime'ı içeren hücreleri, Excel'de yaptığım gibi bir formatta seçmek istiyorum.
Anlayışım için o noktaya ulaşmak için bir Stil Sayfası kullanmalıyım. Bu soruna basit bir açıklama yapan birisini bulmak için bir süredir internette dolaşıyorum, ancak bulunması zor görünüyor.

Zaten sayfa içinde veri ekleme yeteneğiyle SheetData aracılığıyla bir e-tablo var. Eksik olduğum tek şey, hücrelerin biçimlendirilmesi/stillenmesidir.

bu bende ne kadar geçerli:

DocumentFormat.OpenXml.Packaging.SpreadsheetDocument doc = SpreadsheetDocument.Create("test.xlsx", SpreadsheetDocumentType.Workbook); 

WorkbookPart wbPart = doc.AddWorkbookPart(); 
wbPart.Workbook = new Workbook(); 

SheetData data = new SheetData(
      new Row(...etc)); 

WorksheetPart wsPart = wbPart.AddNewPart<WorksheetPart>(); 
wsPart.Worksheet = new Worksheet(data); 

Sheets sheets = doc.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets()); 

Sheet sheet = new Sheet() { Id = doc.WorkbookPart.GetIdOfPart(wsPart), SheetId = 1, Name = "TestSheet" }; 
sheets.Append(sheet); 

wbPart.Workbook.Save(); 

doc.Close(); 

ve nasıl tarih zaman gibi stil özellikleri (ör, "dd-AA-yyyy") ve belki daha gelişmiş stil basit eklemeler ekleyebilir sonradan ?

Ben ... Ben aramaya devam edeceğiz arada yeterli :) spesifik oldu

THX umut !!!

+0

den Closed XML

gibi bir kütüphane kullanarak sürmüştür? –

+0

Office Open XML özelliklerini okudunuz mu? Sadece 6.000 sayfa var ... :-) jk elbette, şu anda benzer "küçük" konularla mücadele ediyorum. –

+1

nope Hiç yapmadım, bu konuda üzgünüm ... biz sayfaları yapan bir üçüncü parti aracı kullanmaya karar verdik :) –

cevap

3

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); 
    } 
İlgili konular