2010-07-09 12 views
5

He estado usando el Spreadsheet::ParseExcel para enumerar los contenidos de la hoja de cálculo. He visto varios ejemplos sobre cómo volcar toda la hoja de cálculo. Realmente me gustaría ver cómo usar este script de forma más selectiva.Necesito más ejemplos sobre cómo usar Spreadsheet :: ParseExcel

El siguiente ejemplo de IBM básicamente descarga el contenido de todas las celdas que tienen datos.

#!/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); 
    } 
} 
} 

¿Puede alguien darme un ejemplo de cómo puedo especificar alguna acción para una determinada columna por cada fila?

Por ejemplo, tengo una hoja de cálculo con 7 columnas yn filas. Quiero volver a formatear los datos en cada una de las columnas de cierta manera. Quizás quiera tomar la columna 6 por cada fila y anexar texto al final de la cadena almacenada en la celda. ¿Cómo se establecería eso?

Respuesta

8

Para modificar un archivo de Excel, el módulo Spreadsheet::ParseExcel::SaveParser es muy útil. Le permite leer un archivo, hacer modificaciones y luego escribir el contenido modificado en un nuevo archivo. Aquí está un ejemplo sencillo:

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); 

Durante muchos otros ejemplos, véase la excelente documentación:

+2

Soy el responsable del mantenimiento de Spreadsheet :: ParseExcel y creo que este es un buen y claro ejemplo. ++ – jmcnamara

+0

Guau, ejemplo fantástico. ¡Muchas gracias! ¡Y agradece todas tus contribuciones y herramientas tan increíbles! –

+0

Obtuve lo siguiente: No puedo llamar al método "valor" en un valor indefinido en ./excel-test-new línea 19. –

2

Para volver a formatear los datos en cada una de las columnas de una manera determinada, puede utilizar la combinación de Spreadsheet::ParseExcel y Spreadsheet::WriteExcel módulos como

Crear un nuevo Excel Spreadsheet::WriteExcel módulo y añadir hoja de cálculo de Excel it.Then Analizar el existente y escribir el contenido en nuevos excel con formato.

Aquí está un ejemplo de muestra:

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 
       } 
      } 
     } 

Después de escribir un nuevo Excel desde Excel existente, puede utilizar la API de de Spreadsheet::WriteExcel para añadir datos en it.It va a resolver problemas como

  1. Primero retendrá su archivo Excel existente.
  2. puede formatear en el nuevo archivo de Excel sin modificar el archivo original de Excel.
+0

¿Sabes cómo podemos manejar las celdas de combinación aquí? – user1837967