Discussione:
creare file excel con riconoscimento dati formato numero a 2 cifre decimali
(troppo vecchio per rispondere)
fenice
2006-02-24 14:14:00 UTC
Permalink
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?
fenice
2006-02-24 15:39:32 UTC
Permalink
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
Cristiano Larghi
2006-02-28 08:45:19 UTC
Permalink
Post by fenice
ho notato che sul file così salvato, i campi che contengono dati
numerici vengono riconosciuti da excel come numerici solo se sono degli
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.
fenice
2006-03-06 11:12:09 UTC
Permalink
spero non sia troppo tardi
solo ora, finalmente, sto rimettendo mano alla funzione
fenice
2006-03-06 13:52:39 UTC
Permalink
non so perché il messaggio è stato troncato.
ci riprovo...
Post by Cristiano Larghi
Quello che dici è strano ... come stai restituendo questi numeri? io creo
da tabella html i file xls e non ho di questi problemi
anch'io creo il file xls "impaginando" in una tabella html i dati
estratti da db
Post by Cristiano Larghi
(numeri tra l'altro anche con separatore delle migliaia (.) e
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
Cristiano Larghi
2006-03-06 14:16:07 UTC
Permalink
Post by fenice
dopo aver salvato il file excel, andandolo ad aprire mi si presenta
- 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
formatnumber(rs_tot("TOTALECAMPO1"),2)
ma va peggio perché neanche i numeri senza decimali vengono
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.
fenice
2006-03-07 08:42:53 UTC
Permalink
Post by Cristiano Larghi
Versione vecchia di excel?
Beh probabilmente sì, sto usando Office2000
Post by Cristiano Larghi
Copiancolla quanto sopra in un file di testo, rinominato in xls e aprilo;
se compare una schifezza o il tuo excel è vetusto (direi <-), oppure hai
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
ys
2006-03-09 14:42:27 UTC
Permalink
Post by fenice
Beh probabilmente sì, sto usando Office2000
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>
ys
2006-03-09 10:37:11 UTC
Permalink
Post by fenice
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).
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?
Cristiano Larghi
2006-03-09 11:07:35 UTC
Permalink
Post by ys
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
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.
ys
2006-03-09 15:53:07 UTC
Permalink
Post by Cristiano Larghi
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 ***
response.flush
response.end
%>

</body>
</html>
Cristiano Larghi
2006-03-09 16:52:01 UTC
Permalink
Post by ys
Post by Cristiano Larghi
state mettendo gli header che ho indicato?
Non è un problema di header, o meglio non riesco a vedere il problema.
Prova a metterli che male non fa, no?
Post by ys
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.
fenice
2006-03-21 08:01:00 UTC
Permalink
Sei riuscito a risolvere il problema della diversa visualizzazione fra
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

Loading...