PDA

View Full Version : [PHP] Creare file excel e modificarlo


Gregor
30-03-2010, 19:00
Ho una textarea dove inserisco in colonna una serie di interi.
Questi dati li memorizzo nel db (mysql) e li recupero quando mi servono, leggendoli sempre nella stessa textarea.
Poichè devo sommare tutti questi valori ed effettuare su essi una serie di conti, mi sono rivolto ad excel e agli header, mediante:


<?php
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: nomefile.xls");
?>

Tutto ok!
Se estraggo tramite una query ottengo nel file xls (che posso aprire senza prima salvarlo) la colonna che mi serve, ma non riesco a fare effettuare nessun conto :(
Nel senso che pur mettendo una banaliiisma

=somma(a1:a20)

non funziona in quanto questa formula si accoda all'ultimo valore della colonna e quindi la vedo come testo :(

qualcosa come

.
.
12
13
45=somma(a1:a20)
.
.

Come posso tramite php fare in modo da posizionarmi su una cella del foglio xls e mettere lì le formule che mi interessano?

Spero di essere stato chiaro :confused:

lupoxxx87
30-03-2010, 19:20
devi guardare com'è la struttura di un foglio xls....
non credo basti scrivere formule qui e lì perchè queste siano giuste...

comunque so che ci sono script già fatti che esportano il contenuto di tabelle sql in fogli excel, puoi usare quelli

Gregor
30-03-2010, 19:33
devi guardare com'è la struttura di un foglio xls....
non credo basti scrivere formule qui e lì perchè queste siano giuste...

Le formule funzionano!
Il punto è che devo tradurre "vai alla cella XX", altrimenti la formula si accoda e non funziona!

comunque so che ci sono script già fatti che esportano il contenuto di tabelle sql in fogli excel, puoi usare quelli

Questo lo faccio tranquillamente!
Ma dopo aver estratto da una tabella sql devo effettuare calcoli! E' qui il problema!
Una soluzione sarebbe quella di fare i calcoli e momorizzare nel db, così facendo poi estraggo tutto in excel senza problemi, ma per il mio lavoro non posso farlo!
Devo poter applicare le formule tramite php dopo aver esportato da sql in excel.

lupoxxx87
30-03-2010, 20:01
Le formule funzionano!

Questo lo faccio tranquillamente!
Ma dopo aver estratto da una tabella sql devo effettuare calcoli! E' qui il problema!
Una soluzione sarebbe quella di fare i calcoli e momorizzare nel db, così facendo poi estraggo tutto in excel senza problemi, ma per il mio lavoro non posso farlo!
Devo poter applicare le formule tramite php dopo aver esportato da sql in excel.

scusa ma
1) operazioni non troppo complicate puoi includerle nella select; per esempio puoi fare select blablabla + blablabla e ti restituirà la somma...o usare operatori aggregati (max, min, avg ...)
2) salvare i valori in php, fare i calcoli in php, e salvare in un file xls pulito senza formule

gdg87
30-03-2010, 20:02
devi usare un pacchetto aggiuntivo di pearl che ti permette di creare dei veri file xls. Ecco cosa devi fare
1. Installare PEAR se non installato ma odvresti averlo sei usi xampp o wamp
2. installare i package OLE e Spreadsheet_Excel_Writer: è possibile farlo a linea di comando(se il comando non viene riconosciuto spostarsi nella cartella php di xampp/wamp) digitando:
- pear install OLE-beta (se non specificate -beta riceverete probabilmente un errore)
- pear install Spreadsheet_Excel_Writer-beta (idem come sopra)
3. riavviate Apache per rendere effettive le modifiche;

per tutte le funzioni della classe ti rimando alla pagina ufficiale

http://pear.php.net/package/Spreadsheet_Excel_Writer/docs

Gregor
30-03-2010, 21:52
scusa ma
1) operazioni non troppo complicate puoi includerle nella select; per esempio puoi fare select blablabla + blablabla e ti restituirà la somma...o usare operatori aggregati (max, min, avg ...)
2) salvare i valori in php, fare i calcoli in php, e salvare in un file xls pulito senza formule

Le cose si complicano in quanto in una variabile ho tutta la colonna di valori!
Ricordo che scrivo e leggo in una textarea.
Dovrei trovare il modo di "spezzettare" la colonna e creare tante variabili quanti sono i numeri della colonna (una ventina). Ma la vedo molto scomoda come soluzione (a cui però ho pensato...)

Gregor
30-03-2010, 21:56
devi usare un pacchetto aggiuntivo di pearl che ti permette di creare dei veri file xls.
Forse è troppo per quello che vorrei ottenere!
Ma è impossibile che via php non si riesca ad andare "a capo" il che equivale a cambiare cella di excel?!?!?
E' tutto qui il problema! Superato questo avrei risolto!

E' interessante il fatto che se creo tramite for una tabella, riesco a mettere una variabile in ogni cella! Ma non posso farlo perchè, come detto, ho una sola variabile (colonna di interi relativi) :(
E se stampo la variabile ogni numero finisce in una cella!
Mi manca davvero poco...

Gregor
31-03-2010, 09:10
BINGO! :)

Per la tabulazione:
print("\t");

mentre per andare a capo;
print("\n");


Così posso "muovermi" tra le celle di excel ;)

Chissà se posso anche formattare il testo!

Dovrei passare tramite php il code per la formattazione di excel :confused:

Sarebbe il massimo, ma già così ho ottenuto il risultato sperato! :Prrr: :D

zuper
31-03-2010, 11:23
BINGO! :)

Per la tabulazione:
print("\t");

mentre per andare a capo;
print("\n");


Così posso "muovermi" tra le celle di excel ;)

Chissà se posso anche formattare il testo!

Dovrei passare tramite php il code per la formattazione di excel :confused:

Sarebbe il massimo, ma già così ho ottenuto il risultato sperato! :Prrr: :D

guarda che excel riesce a gestire dei file xls (appunto :D:D) anche solo con una banale formattazione HTML delle tabelle :)

quindi se col php fai una cosa del genere


print("<table border='1'>\n");
print("<tr>\n");
print(" <td><FONT COLOR='#FF8000'>100</td>\n");
print(" <td BGCOLOR='#FF8000'>200</td>\n");
print(" <td>300</td>\n");
print("</tr>\n");
print("</table>\n");

e generi un file xls lui te lo apre :)

Gregor
31-03-2010, 14:41
guarda che excel riesce a gestire dei file xls (appunto :D:D) anche solo con una banale formattazione HTML delle tabelle :)


Guarda, ho scritto un semplice
print("<b>$var</b>")
è mi ha stampato in una cella sul file di excel <b>xxx</b> :(

Cioè i tag me li ha stampati e non li ha interpretati :(

zuper
31-03-2010, 15:18
Guarda, ho scritto un semplice
print("<b>$var</b>")
è mi ha stampato in una cella sul file di excel <b>xxx</b> :(

Cioè i tag me li ha stampati e non li ha interpretati :(

bisognerebbe vedere il resto del file creato...


<table border='1'>
<tr>
<td><FONT COLOR='#FF8000'>100</td>
<td BGCOLOR='#FF8000'>200</td>
<td><b>300</b></td>
</tr>
</table>

funziona!

Gregor
01-04-2010, 07:35
bisognerebbe vedere il resto del file creato...

Mettendo in coda questa tabella formatatta a quanto già stampo, effettivamente la formattazione resta, però mi sballa tutto quello che c'era prima :(

Il mio file xls che creo al volo contiene solamente un paio di righe di testo, poi la colonna con i valori che ho preso dalla textarea ed infine delle operazioni su questi numeri.
Se provo a formattare, senza usare alcuna tabella, non formatta ma stampa il codice :(
Di sicuro la soluzione c'è...:confused:

(P.S.: Non è che devo per forza passare attraverso una tabella (creata dal php)? Perchè effettivamente io stampo solo i valori nelle celle :confused:)

zuper
01-04-2010, 08:32
Mettendo in coda questa tabella formatatta a quanto già stampo, effettivamente la formattazione resta, però mi sballa tutto quello che c'era prima :(

Il mio file xls che creo al volo contiene solamente u napi od irighe di testo, poi la colonna con i valori che ho preso dalla textarea ed infine delle operazioni su questi numeri.
Se provo a formattare, senza usare alcuna tabella, non formatta ma stampa il codice :(
Di sicuro la soluzione c'è...:confused:

(P.S.: Non è che devo per forza passare attraverso una tabella (creata dal php)? Perchè effettivamente io stampo solo i valori nelle celle :confused:)

nn è che devi ;)

però se vuoi pure formattare il testo, secondo me è + comodo :)

alla fine devi printare solo un paio di tag in +...

e per le celle

print("<td BGCOLOR='#FF8000'>");
print("$var");
print("</td>\n");

Gregor
01-04-2010, 09:39
...
print("<td BGCOLOR='#FF8000'>");
print("$var");
print("</td>\n");
...

Se printo una cosa simile, cioè una tabella 1x1 ,con $var contenente la colonna della textarea, mantiene la formattazione, ma non mi inserisce più i numeri in colonna (uno per cella), bensì tutti su una riga...:muro:
Dovrei fare una tabella 30x1 (ho circa 30 righe) e mettere in ogni riga un numero, ma non posso mettere mano alla stringa (della textarea) formata da 30 numeri interi relativi :(

Gregor
01-04-2010, 09:45
Ecco come genero al momento il file xls:


$query = "select.....";

$dbResult = mysql_query($query, $db);
$not = mysql_fetch_row($dbResult);

$int = "=INT(SOMMA(A9:A30)/..)";
$somma = "=SOMMA(A9:A30)-(....)";

print("CONTEGGIO TOTALE");
print("\n"); // a capo
print("\n");
print($int);
print("\t"); // tab
print("INT:");
print("\t");
print($somma);
print("\t");
print("SOMMA:");
print("\n");
print("\n");
print("Colonna interi relativi della textarea");
print("\n");
print("\n");
print($not[0]);

E ottengo correttamente elenco interi (in colonna) e operazioni richieste!
Naturalmente senza formattazione...

zuper
01-04-2010, 12:26
nn avevo capito che avevi tutti i valori in una sola variabile...

scusa come esegui la query?

hai provato ad eseguire la query in modo che ti tiri fuori i dati già intabellati?

se il risultato della tua query invece che:

100 200 300

fosse qualcosa tipo

<td>100</td><td>200</td><td>300</td>

a quel punto potresti mettere direttamente la stringa :)

sorry se sparo cavolate...ma nn sapendo esattamente come è strutturato il tuo processo...nn è facile azzeccare la soluzione migliore :)

Gregor
01-04-2010, 14:24
nn avevo capito che avevi tutti i valori in una sola variabile...

Già, è il contenuto di una textarea.
Sono interi volutamente inseriti in colonna!

scusa come esegui la query?
E' una normalissima select che mi restituisce, nella textarea, i valori incolonnati.

hai provato ad eseguire la query in modo che ti tiri fuori i dati già intabellati?

se il risultato della tua query invece che:

100 200 300

fosse qualcosa tipo

<td>100</td><td>200</td><td>300</td>

a quel punto potresti mettere direttamente la stringa :)
Questo non ho provato a farlo...però mi pare un pò incasinato, dato che per far ciò dovrei "spezzettare" la serie numerica.
Considerato che i numeri vanno da 1 cifra a 3 e che possono avere anche segno negativo, la vedo dura :(

sorry se sparo cavolate...ma nn sapendo esattamente come è strutturato il tuo processo...nn è facile azzeccare la soluzione migliore :)
Capisco ;)
Forse una soluzione esiste, ma non è semplice come credevo :mbe:
Mi aspettavo di formattare in php style....

zuper
01-04-2010, 18:33
Questo non ho provato a farlo...però mi pare un pò incasinato, dato che per far ciò dovrei "spezzettare" la serie numerica.
Considerato che i numeri vanno da 1 cifra a 3 e che possono avere anche segno negativo, la vedo dura :(


se vuoi prova a postare la query e il risultato...

nn mi pare così incasinato concatenare quei tag :)

Gregor
02-04-2010, 07:47
se vuoi prova a postare la query e il risultato...

nn mi pare così incasinato concatenare quei tag :)

Dunque, la cosa è molto semplice, una volta riempita la textarea con valori del tipo:
...
10
12
-30
450
...
Inserisco i dati nella tabella sql (tramite UPDATE), quindi vengono memorizzati come
...1012-30450...

Quando recupero questi valori (tramite SELECT) li inserisco nella textarea e automaticamente li ritrovo incolonnati.

Quindi ci sarebbe da mettere mani nella stringa ...1012-30450...per poter inserire tag da mandare nella tabella SQL....il che non mi pare comodissimo.
Che dici? Tnx! :)

zuper
02-04-2010, 08:04
Dunque, la cosa è molto semplice, una volta riempita la textarea con valori del tipo:
...
10
12
-30
450
...
Inserisco i dati nella tabella sql (tramite UPDATE), quindi vengono memorizzati come
...1012-30450...

Quando recupero questi valori (tramite SELECT) li inserisco nella textarea e automaticamente li ritrovo incolonnati.

Quindi ci sarebbe da mettere mani nella stringa ...1012-30450...per poter inserire tag da mandare nella tabella SQL....il che non mi pare comodissimo.
Che dici? Tnx! :)
nn mi è molto chiaro come passi dai dati incolonnati alla stringa unica con l'update :)

ma soprattutto non capisco DOPO come fai a rimetterli incolonnati :D

bisognerebbe vedere le query :)

cmq come soluzione così al volo...mi viene in mente che cmq potresti fare 2 query...una coi dati che ti servono per la textarea e l'altra per i dati che ti servono sul foglio xls ;)

Gregor
02-04-2010, 08:14
nn mi è molto chiaro come passi dai dati incolonnati alla stringa unica con l'update :)
Semplice:
UPDATE tab SET campo = '$_POST[textarea]'....

ma soprattutto non capisco DOPO come fai a rimetterli incolonnati :D
Avviene in automatico!
Quando faccio la SELECT e inserisco il risultato nella textarea, me li ritrovo incolonnati! E se tra un numero e l'altro c'è uno spazio vuoto me lo ritrovo!
Potrebbe essere una variabile del php che permetta ciò!

cmq come soluzione così al volo...mi viene in mente che cmq potresti fare 2 query...una coi dati che ti servono per la textarea e l'altra per i dati che ti servono sul foglio xls ;)
Indago :D

zuper
02-04-2010, 08:36
Semplice:
UPDATE tab SET campo = '$_POST[textarea]'....

Avviene in automatico!
Quando faccio la SELECT e inserisco il risultato nella textarea, me li ritrovo incolonnati! E se tra un numero e l'altro c'è uno spazio vuoto me lo ritrovo!
Potrebbe essere una variabile del php che permetta ciò!

Indago :D

boh...aspettiamo qualcuno che ne sappia + di me :)

davvero nn mi è chiaro come faccia a capire che te li deve reincolonnare :D:D