2009-09-02 25 views
7

Con Spreadsheet::WriteExcel, puedo crear un nuevo libro de trabajo, pero ¿qué ocurre si quiero abrir un libro existente y modificar ciertas columnas? ¿Cómo podría lograr eso?¿Cómo puedo modificar un libro de Excel existente con Perl?

Podría analizar todos los datos fuera de la hoja usando Spreadsheet::ParseExcel y luego volver a escribir con nuevos valores en ciertas filas/columnas usando Spreadsheet::WriteExcel. ¿Hay un módulo que ya combina los dos?

Principalmente solo quiero abrir un .xls, sobrescribir ciertas filas/columnas, y guardarlo.

Respuesta

13

Spreadsheet::ParseExcel habrá leído en los archivos de Excel existentes:

my $parser = Spreadsheet::ParseExcel->new(); 
# $workbook is a Spreadsheet::ParseExcel::Workbook object 
my $workbook = $parser->Parse('Book1.xls'); 

Pero lo que realmente desea es Spreadsheet::ParseExcel::SaveParser, que es una combinación de Spreadsheet::ParseExcel y Spreadsheet::WriteExcel. Hay un example cerca de la parte inferior de la documentación.

+0

No veo ninguna forma de escribir en un libro de Excel usando ParseExcel – user105033

+0

Hoja de cálculo :: ParseExcel :: SaveParser lo hará. venciste mi edición :) – Ether

3

Hay una sección de la hoja de cálculo :: WriteExcel docs que cubre Modifying and Rewriting Spreadsheets.

Un archivo de Excel es un archivo binario dentro de un archivo binario. Contiene varias sumas de comprobación interconectadas y cambiar incluso un byte puede dañarlo.

Como tal, no puede simplemente anexar o actualizar un archivo de Excel. La única forma de lograr esto es leer todo el archivo en la memoria, realizar los cambios o adiciones necesarios y luego volver a escribir el archivo.

Puede leer y volver a escribir un archivo de Excel utilizando el módulo Spreadsheet :: ParseExcel :: SaveParser que es un contenedor de Spreadsheet :: ParseExcel y Spreadsheet :: WriteExcel. Es parte del paquete Spreadsheet::ParseExcel.

También hay un ejemplo.

1

El módulo Spreadsheet::ParseExcel::SaveParser es un contenedor alrededor de Spreadsheet :: ParseExcel y Spreadsheet :: WriteExcel.

Recientemente actualicé la documentación con, lo que espero, is a clearer example of how to do this.

+0

Todavía no entiendo este ejemplo. No puedo encontrar la documentación de lo que acepta SaveAs. ¿Es posible pasar identificadores de archivo o escalar ref en lugar de un nombre de archivo? – Myforwik

+0

Vaya, me di cuenta de que John McNamara incluía un archivo write_to_scalar.pl en el paquete.Al usarlo, pude hacer una memoria para modificar la memoria de un archivo XLS :-D – Myforwik

9

Si tiene Excel instalado, entonces es casi trivial hacerlo con Win32::OLE. Aquí está el ejemplo de la propia documentación Win32::OLE 's:

use Win32::OLE; 

# use existing instance if Excel is already running 
eval {$ex = Win32::OLE->GetActiveObject('Excel.Application')}; 
die "Excel not installed" if [email protected]; 
unless (defined $ex) { 
    $ex = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;}) 
      or die "Oops, cannot start Excel"; 
} 

# get a new workbook 
$book = $ex->Workbooks->Add; 

# write to a particular cell 
$sheet = $book->Worksheets(1); 
$sheet->Cells(1,1)->{Value} = "foo"; 

# write a 2 rows by 3 columns range 
$sheet->Range("A8:C9")->{Value} = [[ undef, 'Xyzzy', 'Plugh' ], 
            [ 42, 'Perl', 3.1415 ]]; 

# print "XyzzyPerl" 
$array = $sheet->Range("A8:C9")->{Value}; 
for (@$array) { 
    for (@$_) { 
     print defined($_) ? "$_|" : "<undef>|"; 
    } 
    print "\n"; 
} 

# save and exit 
$book->SaveAs('test.xls'); 
undef $book; 
undef $ex; 

Básicamente, Win32::OLE le da todo lo que está disponible a un VBA o aplicación de Visual Basic, que incluye una gran variedad de cosas - todo, desde la automatización de Excel y Word enumerar y montar unidades de red a través de Windows Script Host. Ha venido de manera estándar con las últimas ediciones de ActivePerl.

+1

Además, puede escribir matrices enteras en columnas \ filas a la vez y esto afecta la velocidad de escritura. Si eso no es suficiente, también puede escribir en un Excel que tenga una macro y ejecute con ese módulo. –

+0

Gracias. Noté que Spreadsheet :: ParseXLSX :: SaveParser no existe, así que esto funciona mucho mejor para mí. –

+0

@ usr-bin-drinking: Me alegro de que haya sido útil :) –

Cuestiones relacionadas