Newsgroup: it.comp.lang.perl
Titolo: writeExcel

Salve a tutti, sto cercando di scrivere una tabella di access su un 
foglio di excel...
Probabilmente devo dire che il fie su cui scrivo è binario ma... non 
so come fare.
O forse il problema è un altro :-)
<code>
use DBI;
use DBD::ODBC;
use Spreadsheet::WriteExcel::FromDB;
my $dbh = DBI->connect('dbi:ODBC:db1', '', '');
my $ss = Spreadsheet::WriteExcel::FromDB->read($dbh, "prova");
#$ss->ignore_columns(qw/foo bar/); 
# or
$ss->include_columns(qw/MKASS_08_RAG_SOC1 MKASS_08_INDIR1 
MKASS_08_CAP/); 
#$ss->restrict_rows('age > 10');
open FILE, ">prova.xls";
print FILE $ss->as_xls;
close FILE;
</clode>
Il sistema non da errori ma quando cerco di aprire in excel mi dice 
che il file potrebbe essere rovinato.
Qualche idea?
Grazie,
nathanvi
Inviato da 
www.mynewsgate.net

 "prova"); #$ss->ignore_columns(qw/foo bar/);
Ho usato diverse volte l'ottimo WriteExcel ma non ho mai usato quei metodi.
Ti mando cmq un pezzo di codice di uno script che estrae dati da un DB e li
mette in un foglio excel ($dbh è un handler DBI a un database ottenuto da
una connect come fai tu):
#----- CREAZIONE FILE EXCEL
my $excel_filename ="../data/pcs/pcscurtxt_$oggi.xls";
print "Creo il file Excel: $excel_filename\n";
my $workbook = Spreadsheet::WriteExcel->new($excel_filename);
#----- Definizione formati -----
$boldformat = $workbook->add_format();
$boldformat->set_bold();
$boldformat->set_color('black');
$boldformat->set_align('left');
$boldformat->set_bg_color('white');
$topformat1 = $workbook->add_format();
$topformat1->set_color('black');
$topformat1->set_align('center');
$topformat1->set_bg_color(45);
$topformat1->set_border(1);
$topformat2 = $workbook->add_format();
$topformat2->set_color('black');
$topformat2->set_align('center');
$topformat2->set_bg_color(49);
$topformat2->set_border(1);
#----- FOGLIO 1 -----
$worksheet = $workbook->add_worksheet("PCS_REMIF");
$worksheet->write(0, 0, "PCS MEDI PER REMI FISICO", $boldformat);
$worksheet->write(2, 0, "IDREMIF", $topformat1);
$worksheet->write(2, 1, "CLANNO", $topformat1);
$worksheet->write(2, 2, "CLMESE", $topformat1);
$worksheet->write(2, 3, "CNMC", $topformat1);
$worksheet->write(2, 4, "CNPCS", $topformat1);
$worksheet->write(2, 5, "CNGJ", $topformat1);
$worksheet->write(2, 6, "DSFILE", $topformat1);
$sql = "SELECT * FROM PCSREMIFM WHERE CLANNO=$opt_y ORDER BY IDREMIF,
CLANNO, CLMESE";
$sth = $dbh->prepare($sql);
$sth->execute() || die $DBI::errstr;
$riga=3;
while ( $row = $sth->fetchrow_hashref ) {
    $worksheet->write($riga, 0, $row->{IDREMIF});
    $worksheet->write($riga, 1, $row->{CLANNO});
    $worksheet->write($riga, 2, $row->{CLMESE});
    $worksheet->write_number($riga, 3, $row->{CNMC});
    $worksheet->write_number($riga, 4, $row->{CNPCS});
    $worksheet->write_number($riga, 5, $row->{CNGJ});
    $worksheet->write($riga, 6, $row->{DSFILE});
    $riga = $riga+1;
}
$worksheet->set_column(0, 4,  9); #Larghezza colonne
$worksheet->set_column(5, 5,  14); #Larghezza colonne
$worksheet->set_column(6, 6,  40); #Larghezza colonne
#----- FINE FOGLIO 1 -----
ecc...

O forse il problema è un altro :-)
Questo lo ignoro.
Ciao.

 [MEGA CUT...]
Ciao Icestorm e grazie per la risposta.
E grazie anche a Giovanni, il problema era proprio quello...
Per Icestorm, ti consiglio assolutamente di utilizzare questo metodo 
perchè risparmi un sacco di codice.
In pratica basta connettersi a un db e liu riversa automaticamente le 
righe e colonne che vuoi tu senza colpo ferire!!
Quello che non mettevo io era il fatto del file binario che non sapevo 
come si facesse (scusate l'italiano ma ho dormito poco e sono rinco :-)
Ti mando come esempio il mio codice per darti una idea:
<code>
use DBI;
use DBD::ODBC;
use Spreadsheet::WriteExcel::FromDB;
my $dbh = DBI->connect('dbi:ODBC:db1', '', '');
my $ss = Spreadsheet::WriteExcel::FromDB->read($dbh, "prova");
#---- Qui puoi dirgli di ignorare o inserire solo alcuni campi
#$ss->ignore_columns(qw/foo bar/); 
# or
$ss->include_columns(qw/MKASS_08_RAG_SOC1 MKASS_08_INDIR1 
MKASS_08_CAP/); 
#----- Qui puoi fare delle restrizioni come una sorta di query.
#$ss->restrict_rows('age > 10');
#----- ZAK. Scrive il file! Dimenticavo solamente il binmode.
open FILE, ">prova.xls";
binmode FILE;
print FILE $ss->as_xls;
close FILE;
</code>
Molto interessante questo modulo!!!
Inviato da 
www.mynewsgate.net

 colpo ferire!!
Eh eh, hai ragione è comodo ma non mi capita mai di riversare una tabella in
maniera così semplice come ti ho mostrato nell'esempio. Mi è sempre capitato
di fare cose con JOIN particolari, trasformazioni e/o raggruppamenti da
fare, ecc... :-)