Newsgroup: it.comp.www.asp
Titolo: creare file excel con riconoscimento dati formato numero a 2 cifre decimali

ciao a tutti,
mi trovo di fronte a questa situazione :
ho uno script che permette di salvare su client un file .xls contenente
i dati estratti da un db oracle e caricati in un recordset (scrivo i
dati nel file attraverso una tabella html).
e fin qui tutto ok.
ho notato che sul file così salvato, i campi che contengono dati
numerici vengono riconosciuti da excel come numerici solo se sono degli
interi.
mi spiego meglio: per i dati che sul db sono dei numerici ad una cifra
nel file excel riesco ad eseguire le tipiche funzioni matematiche
(somma, media, ecc.)
mentre per i dati che su db sono dei numerici con due cifre decimali,
sul file excel non sono riconosciuti come numeri e quindi non è
possibile applicarci formule..
c'è qualche metodo che posso utilizzare per far riconoscere
all'applicativo anche questi dati come dei numeri?

 mi spiego meglio: per i dati che sul db sono dei numerici ad una cifra ...
scusate ho scritto male:
i dati che excel riconosce correttamente come numerici sul db sono dei
numerici senza cifre decimali

 interi.
Quello che dici è strano ... come stai restituendo questi numeri? io creo
da tabella html i file xls e non ho di questi problemi (numeri tra l'altro
anche con separatore delle migliaia (.) e separatore decimale (,), nonché
con simbolo dell'euro davanti). Esiste semmai il problema contrario (ho dei
codici, tipo 00001, che excel me li converte in numerici e toglie gli zero
iniziali).
Per "forzare" il dato puoi lavorare con css (cerca in rete documentazione
su mso-number-format, per esempio), ma secondo me non ti risolverà nulla
perché i numeri vengono automaticamente riconosciuti (se formattati
correttamente).
-- 
"E' l' ignoranza che crea l'intolleranza
 di gente cieca e senza coscienza"
									  S.S.S.

spero non sia troppo tardi
solo ora, finalmente, sto rimettendo mano alla funzione

 separatore decimale (,), nonché con simbolo dell'euro davanti).
in dettaglio la mia situazione è questa:
dalla TABELLA2 estraggo i valori del campo FILTRO di cui carico i
valori su un recordset e tramite un ciclo passo questi valori come
filtri per una seconda select che faccio sulla TABELLA1
nella tabella html carico i valori TOTALECAMPO1 estratti con questa
seconda select che è :
select sum(CAMPO1) as TOTALECAMPO1 from TABELLA1 where CAMPO2 rs("FILTRO")
dove CAMPO1 è sul db un campo NUMBER(5,2)
dopo aver salvato il file excel, andandolo ad aprire mi si presenta
questa situazione:
- se TOTALECAMPO1 è un numero intero, riesco a manipolarlo in excel
come numero
- se ha dei valori dopo la virgola, excel non lo riconosce come numero
ho provato a utilizzare la funzione:
formatnumber(rs_tot("TOTALECAMPO1"),2)
ma va peggio perché neanche i numeri senza decimali vengono
riconosciuti come numeri da excel
non so più cosa fare

 riconosciuti come numeri da excel
Versione vecchia di excel?
io gli sparo un formato tipo "€ 1.000,32" e me lo riconosce correttamente
come numero (scrivendolo pure in rosso se è negativo...), versione 2003.
Con la versione 2000 idem (ci sono un paio di cosette che non riconosce ma
comunque sia non queste, anche se io richiedo il 2003 per avere un layout
"perfetto").
Dubbio: stai scrivendo i namespace e i meta corretti per excel, vero?
Io lavoro con .net e quindi il mio codice non ti serve ma, semplicemente,
ecco un esempio di report che a me viene visualizzato perfettamente (puoi
anche evitare tutta la parte all'interno del commento condizionale, che
serve solo per dare nome e altre cosette al foglio):
<html xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns="
http://www.w3.org/TR/REC-html40
">
<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">
<meta name=ProgId content=Excel.Sheet><meta name=Generator
content="Microsoft Excel 9">
<!--[if gte mso 9]>
<xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>
<x:Name>AcquistatoPerMese</x:Name><x:WorksheetOptions><x:Selected/>
<x:ProtectContents>False</x:ProtectContents><x:ProtectObjects>False</x:ProtectObjects>
<x:ProtectScenarios>False</x:ProtectScenarios></x:WorksheetOptions></x:ExcelWorksheet>
</x:ExcelWorksheets><x:ProtectStructure>False</x:ProtectStructure>
<x:ProtectWindows>False</x:ProtectWindows></x:ExcelWorkbook></xml>
<![endif]-->
</head><body>
<table>
<thead>
<tr><th style='text-align:left;'>&nbsp;Mese&nbsp;</th><th
style='text-align:right'>&nbsp;Anno&nbsp;</th><th
style='text-align:right'>&nbsp;Totale Acquistato&nbsp;</th></tr></thead>
<tr><td style=''>Gennaio</td><td style=''>2006</td><td style=''>€
2.431.321,32</td></tr>
<tr><td style=''>Febbraio</td><td style=''>2006</td><td style=''>€
3.432.321,12</td></tr>
</table>
</body></html>
Copiancolla quanto sopra in un file di testo, rinominato in xls e aprilo;
se compare una schifezza o il tuo excel è vetusto (direi <=97), oppure hai
problemi con office.
-- 
"Non sai che ci vuol scienza
 ci vuol costanza
 ad invecchiare senza maturità"
									    F.G.

 problemi con office.
ho fatto ed anche sul file cosě creato ho gli stessi problemi
nell'applicare funzioni tipo somma se, media, ecc.. e a creare
grafici..
arrivato a questo punto ho decisamente problemi con office

 dati nel file attraverso una tabella html).
Ho lo stesso problema...
Svariati client con excel 2000 e 2003: se sul file .asp  i numeri sono
in formato xx,yy  con 2003 tutto ok e problemi con 2000 .... se in
formato xx.yy  problema inverso
Tu hai trovato qualcosa?

 formato xx.yy  problema inverso
state mettendo gli header che ho indicato?
-- 
"Run rabbit run
 dig that hole, forget the sun
 and when at last the work is done
 don't sit down, it's time to dig another one"
									    P.F.

 arrivato a questo punto ho decisamente problemi con office
Non č un problema di office... ma che per qualche oscuro motivo il
client con Excel2000 lavora in modo diverso da quello con 2003.   Ti
assicuro che se sistemi il codice (inteso come formato dei numeri
xx.yy invece di xx,yy)  per il 2000 dopo avrai problemi con il 2003...
Bisognerebbe capire il metodo per scrivere un codice .asp  funzionante
per entrambi
Fai delle prove partendo da codice sotto:
====== codice .asp =======<html>
<head>
</head>
<body>
<%
 '*** prepara excel  ***
Response.Buffer = True
Response.ContentType = "application/vnd.ms-excel"
Response.AddHeader "Content-Disposition", "attachment;filename=pippo" &
Right(CLng(timer),6) & ".xls"
%>
<table border=1>
<tr>
<td> separatore decimale .asp PUNTO</td>
<td>1.1</td><td>333.333</td>
</tr>
<tr>
<td> separatore decimale .asp VIRGOLA</td>
<td>1,1</td><td>333,333</td>
</tr>
</table>
<%
'***  fine excel  ***
response.flush
response.end
%>
</body>
</html>

> state mettendo gli header che ho indicato?
Non è un problema di header, o meglio non riesco a vedere il problema.
Guarda il file che allego sotto: è senza meta & affini
Se lo rinomini come .xls  funziona con tutti gli excel (i numeri in
formato xx,yy vengono interpretati correttamente)
Se lo rinomini in .asp (ovvero esegui anche il codice <% ... %>)  ci
sono problemi sotto excel2000
PS ho fatto una marea di prove in .asp cambiando header css etc ... ma
non ho mai risolto nulla!
======================<html>
<head>
</head>
<body>
<%
 '*** start excel  ***
Response.Buffer = True
Response.ContentType = "application/vnd.ms-excel"
Response.AddHeader "Content-Disposition", "attachment;filename=EC" &
Right(CLng(timer),6) & ".xls"
%>
<table border=1>
<tr>
<td> number separator COMMA </td>
<td>1</td>
<td>1,1</td>
<td>22,22</td>
<td>333,333</td>
<td>9999.999,9999</td>
</tr>
</table>
<%
'***  end excel  ***


 Guarda il file che allego sotto: è senza meta & affini
Provato e a me visualizza correttamente (2003) salvato su desktop (non ho
tempo di fare una prova con asp).
io lavoro con aspx (ma non capisco dove possa essere la differenza);
ricordo che con IE succedevano comportamenti strani se non si pulivano gli
header (anzi, se vedi sotto me lo ero anche scritto); inoltre io invio
anche la contentLength.
Ti riporto come mi comporto io (è in aspx ma gli header sono ovviamente gli
stessi, l'unico problema è la pulitura degli header, non ricordo se esiste
il ClearHeaders in asp e se esiste qualcosa di equivalente).
Io non genero mai direttamente la pagina ma la salvo in un file tmp.
Ti assicuro che questa procedura funziona correttamente e senza problemi su
circa una cinquantina di client con installato excel 2003 e (tranne
dettagli irrilevanti se non per l'estetica) con excel 2000 (l'xls ha però
gli header che ti ho indicato, senza aveva comportamenti strani che però
non ricordo a memoria).
		public void GetFile(string path) {
			System.Web.HttpResponse Response=HttpContext.Current.Response;
			FileInfo File=new FileInfo(HttpContext.Current.Server.MapPath(path));
			Response.Clear();
			Response.ClearHeaders(); //importante, altrimenti IE fa casini!
			Response.AddHeader("content-disposition", "attachment;
filename="+File.Name); 
			Response.AddHeader("Content-Length",File.Length.ToString());
			Response.ContentType="application/vnd.ms-excel"; 
			FileStream Fs = new FileStream(File.FullName,FileMode.Open);
			long FileSize = Fs.Length;
			byte[] bBuffer = new Byte[FileSize];
			Fs.Read(bBuffer,0,Convert.ToInt32(FileSize));
			Fs.Close();
			Response.BinaryWrite(bBuffer);
			Response.End();
		} //GetFile
-- 
"Emancipate yourselves from mental slavery;
None but ourselves can free our minds"
									    B.M.

 excel 2000/2003 ??
Sono arrivata a questa soluzione: formatto i valori con 2 cifre
decimali e poi sostituisco la virgola con il punto come separatore
interi-decimali:
replace(formatnumber(rs("importo"),2),",",".")
in questo modo riesco ad ottenere files excel che riconoscono
correttamente i numeri con decimalli sia su 2000 che 2003.
l'unico nèo, insignificante però ai fini pratici, è che così
facendo in excel valori senza decimali tipo 120,00 vengono riportati
senza formattazione ovvero come 120