Newsgroup: it.comp.lang.perl
Titolo: Spreadsheet::ParseExcel

Ottimo modulo, funziona egregiamente e mi sta risolvendo non pochi
problemi, tanto che posso evitare il passaggio ad un csv. Però accade
una cosa strana e non sono sicuro che sia a causa di quel modulo.
il programmino in basso mi restituisce una tabella così come la
desidero, ma all'inizione mi inserisce tutta una serie di <tr>
<table><tr><tr><tr><tr><tr><tr><tr><tr><tr><tr><tr><tr><tr><tr><tr><tr>
ecc.. (va avanti parecchio) quindi mi costruisce la tabella in modo
corretto, cioè con tr e td aperti e chiusi ed il valore all'interno.
Da notare che all'inizio il tag è aperto ma non c'è chiusura.
Per me risulta ancora un mistero da dove vengano tutti i <tr>, capirei
se invece ci fosse una serie <tr></tr>
A proposito buon anno a tutti.
use strict;
use warnings;
use Encode;
use Spreadsheet::ParseExcel;
my $file = 'file.xls';
my $celle = '';
my $exc = Spreadsheet::ParseExcel->new(CellHandler =>
\&cell_handler,NotSetCell => 1);
$exc->Parse($file);
print '<table>'.$celle.'</table>';
sub cell_handler {
my ($workbook, $sheet_index, $row, $col, $cell) = @_;
my $worksheet = $workbook->Worksheet(0);
my @cc = $worksheet->ColRange();
$celle .= '<td>'.encode("utf8", $cell->Value).'</td>';
if ($col==$cc[1]) { $celle = "<tr>$celle</tr>" }
}`


In realtà mi chiedo come faccia a funzionare nella parte "che
funziona". Non sono molto al corrente di come lavori
Spreadsheet::ParseExcel, però l'uso di $celle variabile globale dà
luogo al fenomeno che tu vedi:
Inizio ''
1 cella r. 1 '<td>blah</td>'
2 cella r. 1 '<td>blah</td><td>aloha</td>'
fine r. 1 '<tr><td>blah</td><td>aloha</td></tr>'
1 cella r. 2 '<tr><td>blah</td><td>aloha</td></tr><td>hey</td>'  -- Da
notare che già ti si è "storto" qualcosa...
2 cella r. 2 '<tr><td>blah</td><td>aloha</td></tr><td>hey</td><td>tu</
td>'
fine r. 2 '<tr><tr><td>blah</td><td>aloha</td></tr><td>hey</td><td>tu</
td></tr>'
e cominciamo con due <tr>! Via così... ad ogni riga l'intero blocco
viene incluso in <tr>...</tr>
Per questo tipo di situazioni, probabilmente qualche print messa in
punti opportuni, oppure l'uso del debugger, possono farti evitare
perdite di tempo.

 perdite di tempo.
Spreadsheet::ParseExcel calcola automaticamente l'area disponibile e
restituisce i valori
$worksheet->ColRange()
$worksheet->RowRange()
dipende da come il foglio Excel è organizzato, vale a dire se le
colonne contengono un valore sulla prima riga e sull'ultima, in questo
caso Spreadsheet::ParseExcel riesce a determinare l'area che include i
dati correttamente.
Però è interessante la tua osservazione sulla variabile globale,
perché se uso il comando print senza passare da una variabile, non
osservo lo strano fenomeno della lunga serie di <tr>
Esiste il modulo Spreadsheet::ParseExcel::Dump che devo ancora
studiare, ma non trovo la documentazione nemmeno in cpan.
Saluti e grazie per la risposta.

Ho usato una variabile per la riga e ora funziona, anche se usare
variabili non locali alla sub mi rabbrividisce ;)
use strict;
use warnings;
use Encode;
use Spreadsheet::ParseExcel;
my $file = 'file.xls';
my $celle = '';
my $riga = '';
my $exc = Spreadsheet::ParseExcel->new(
		CellHandler => \&cell_handler,NotSetCell => 1
	);
$exc->Parse($file);
print '<table>'.$celle.'</table>';
sub cell_handler {
	my ($workbook, $sheet_index, $row, $col, $cell) = @_;
	my $worksheet = $workbook->Worksheet(0);
	my @cc = $worksheet->ColRange();
	$riga.='<td>'.encode("utf8", $cell->Value).'</td>';
	if ($col==$cc[1]) {
		$celle.= "<tr>$riga</tr>\n";
		$riga='';
	}
}


È una soluzione elegante, complimenti. La soluzione è porre $riga=''
ad ogni passaggio.
Cero che hai ragione sulla variabile locale.
Io poi ho modificato nel modo seguente:
my $exc = Spreadsheet::ParseExcel->new(CellHandler =>
\&cell_handler_01,NotSetCell => 1);
print $q->header(-charset=>'UTF-8');
print '<table>';
$exc->Parse($d);
print '</table>';
sub cell_handler_01 {
my ($workbook, $sheet_index, $row, $col, $cell) = @_;
my $worksheet = $workbook->Worksheet(0);
my @cc = $worksheet->ColRange();
if ($col==0) { print '<tr>' };
print '<td>'.encode("utf8", $cell->Value).'</td>';
if ($col==$cc[1]) { print '</tr>' };
}
In questo modo ho eliminato la variabile colpevole di rendere lo
script "dubbioso"
inoltre ora è più facile usare lo script in un contesto XMLHttpRequest
Grazie