2010-07-09 15 views
5

Ho utilizzato il Spreadsheet::ParseExcel per elencare il contenuto del foglio di calcolo. Ho visto diversi esempi su come scaricare l'intero foglio di calcolo. Mi piacerebbe davvero vedere come usare questo script in modo più selettivo.Sono necessari ulteriori esempi su come utilizzare Spreadsheet :: ParseExcel

L'esempio seguente da IBM scarica in pratica il contenuto di tutte le celle che contengono dati.

#!/usr/bin/perl -w 

use strict; 
use Spreadsheet::ParseExcel; 

my $oExcel = new Spreadsheet::ParseExcel; 

die "You must provide a filename to $0 to be parsed as an Excel file" unless @ARGV; 

my $oBook = $oExcel->Parse($ARGV[0]); 
my($iR, $iC, $oWkS, $oWkC); 
print "FILE :", $oBook->{File} , "\n"; 
print "COUNT :", $oBook->{SheetCount} , "\n"; 

print "AUTHOR:", $oBook->{Author} , "\n" 
if defined $oBook->{Author}; 

for(my $iSheet=0; $iSheet < $oBook->{SheetCount} ; $iSheet++) 
{ 
$oWkS = $oBook->{Worksheet}[$iSheet]; 
print "--------- SHEET:", $oWkS->{Name}, "\n"; 
for(my $iR = $oWkS->{MinRow} ; 
    defined $oWkS->{MaxRow} && $iR <= $oWkS->{MaxRow} ; 
    $iR++) 
{ 
    for(my $iC = $oWkS->{MinCol} ; 
     defined $oWkS->{MaxCol} && $iC <= $oWkS->{MaxCol} ; 
     $iC++) 
    { 
    $oWkC = $oWkS->{Cells}[$iR][$iC]; 
    print "($iR , $iC) =>", $oWkC->Value, "\n" if($oWkC); 
    } 
} 
} 

Qualcuno può darmi un esempio di come posso specificare alcune azioni da intraprendere per una determinata colonna per ogni riga?

Ad esempio, ho un foglio di calcolo con 7 colonne e n righe. Voglio riformattare i dati in ciascuna delle colonne in un certo modo. Forse voglio prendere la colonna 6 per ogni riga e aggiungere del testo alla fine della stringa memorizzata nella cella. Come sarebbe impostato?

risposta

8

Per modificare un file Excel, il modulo Spreadsheet::ParseExcel::SaveParser è molto utile. Ti consente di leggere un file, apportare modifiche e quindi scrivere il contenuto modificato in un nuovo file. Ecco un semplice esempio:

use strict; 
use warnings; 

use Spreadsheet::ParseExcel; 
use Spreadsheet::ParseExcel::SaveParser; 

my $excel_file_name = $ARGV[0]; 
my $parser   = Spreadsheet::ParseExcel::SaveParser->new(); 
my $workbook_orig = $parser->Parse($excel_file_name); 

# We will edit column 7 of the first worksheet. 
my $worksheet = $workbook_orig->worksheet(0); 
my $EDIT_COL = 6; 

my ($row_min, $row_max) = $worksheet->row_range(); 
for my $r ($row_min .. $row_max){ 
    my $cell = $worksheet->get_cell($r, $EDIT_COL); 
    unless (defined $cell){ 
     next; # Modify as needed to handle blank cells. 
    } 
    my $val = $cell->value . '_append_text'; 
    $worksheet->AddCell($r, $EDIT_COL, $val, $cell->{FormatNo}); 
} 

# You can save the modifications to the same file, but when 
# you are learning, it's safer to write to a different file. 
$excel_file_name =~ s/\.xls$/_new.xls/; 
$workbook_orig->SaveAs($excel_file_name); 

Per molti altri esempi, vedere l'eccellente documentazione:

+2

Sono il manutentore di Spreadsheet :: ParseExcel e penso che questo sia un esempio chiaro e chiaro. ++ – jmcnamara

+0

Wow, fantastico esempio. Grazie mille! E grazie a tutti i tuoi contributi e a strumenti così fantastici! –

+0

Ho ottenuto quanto segue: Impossibile chiamare il metodo "value" su un valore non definito su ./excel-test-new line 19. –

2

per riformattare i dati in ciascuna delle colonne in un certo modo, è possibile utilizzare la combinazione di Spreadsheet::ParseExcel e Spreadsheet::WriteExcel moduli come

Creare un nuovo excel dal modulo Spreadsheet::WriteExcel e aggiungere foglio di lavoro nella it.Then Analizzare l'Excel esistente e scrivere il contenuto in new excel con la formulazione.

Ecco un esempio di esempio:

use strict; 
use Spreadsheet::ParseExcel; 
use Spreadsheet::WriteExcel; 

die "You must provide a filename to $0 to be parsed as an Excel file" unless @ARGV; 

my $oBook = $oExcel->Parse($ARGV[0]); 
my($iR, $iC, $oWkS, $oWkC); 
my $workbook = Spreadsheet::WriteExcel->new('/root/Desktop/test_simple.xls'); 
my $worksheet = $workbook->add_worksheet(); 
$worksheet->set_column('A:A', 50); 
my $format = $workbook->add_format(); 
      $format->set_size(10); 
      $format->set_bold(); 
      $format->set_color('black'); 
      $format->set_font('Verdana'); 
      $format->set_text_wrap(); 
for(my $iSheet=0; $iSheet < $oBook->{SheetCount} ; $iSheet++) 
     { 
        $oWkS = $oBook->{Worksheet}[$iSheet]; 
      for(my $iR = $oWkS->{MinRow} ;defined $oWkS->{MaxRow} && $iR <= $oWkS->{MaxRow} ;$iR++) 
      { 
       for(my $iC = $oWkS->{MinCol} ;defined $oWkS->{MaxCol} && $iC <= $oWkS->{MaxCol} ;$iC++) 
       { 
        $oWkC = $oWkS->{Cells}[$iR][$iC]; 
        $worksheet->write($iR , $iC, $oWkC->Value, $format) if($oWkC); #writing a new excel from existing excel 
       } 
      } 
     } 

Dopo aver scritto un nuovo Excel dal excel esistente, è possibile utilizzare API di Spreadsheet::WriteExcel per aggiungere dati in it.It risolverà i problemi come

  1. Per prima cosa manterrà il tuo file Excel esistente.
  2. è possibile eseguire la formattazione in un nuovo file excel senza modificare il file Excel originale.
+0

Sapete come possiamo gestire le celle di unione qui? – user1837967

Problemi correlati