Esempio C# di come trasformare un DateTime in un double (DateSerial) utile per generare dei file html in formato compatibile con Excel.

XML

<td height="17" class="xl24" x:num="59.999305555555559">28/02/1900 23.59</td>
Ecco due funzioni utili

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);
}
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.
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)
Per vedere il formato dei file di html, in Excel vai in salva con nome e seleziona il formato Pagina Web
Tags:
C#236 .NET66 Excel11
Potrebbe interessarti anche: