Excel DateSerial in NET
Esempio C# di come trasformare un DateTime in un double (DateSerial) utile per generare dei file html in formato compatibile con Excel.
Ecco due funzioni utili
Usando la funzione GetExcelDateSerialString per generare il valore da assegnare all'attributo x:num si rende indipendente il file generato dalle impostazioni internazionali in quanto Excel usa solo questo valore.
La data contenuta tra i tag td viene usata solo per la visualizzazione del file quando lo si apre con il browser.
XML
<td height="17" class="xl24" x:num="59.999305555555559">28/02/1900 23.59</td>
C#
/* ritorna nella parte intera i giorni trascorsi dal 1-1-1900
* e nella parte decimale le frazioni di ora
* 1900-01-01 00:00:00 = 1 prima data gestita
* 1900-02-28 23:59:00 = 59.9993055555556
* 1900-02-29 00:00:00 = 60 **** bug di excel, la data non esiste
* 1900-03-01 = 61
* 2050-21-31 = 55153.6567708333
*/
public static double GetExcelDateSerial(DateTime dt)
{
DateTime DT_START_BUG = new DateTime(1899,12,30);
TimeSpan ts = dt.Subtract(DT_START_BUG);
double d = ts.TotalDays;
return d >= 61.0 ? d : d-1;
}
/* ritorna la data in formato stringa con il
* punto come separatore decimale
* ex attributo x:num
*/
public static string GetExcelDateSerialString(DateTime dt)
{
System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("en-US");
return GetExcelDateSerial(dt).ToString(ci);
}
La data contenuta tra i tag td viene usata solo per la visualizzazione del file quando lo si apre con il browser.
Stesso discorso per i valori numerici, vanno codificati in x:num con sempre il punto come separatore decimale. Per impostare formattazioni particolari usare la classe (nell'esempio xl24)