Category: Win32
Author/Contact Info Bryan Mc bryancmi@yahoo.com
Description: Mass conversion of *.xls files to *.csv, without the overhead (or memory leak) of Spreadsheet::ParseExcel.
#!C:\Perl\bin/perl.exe
# -----------------------------------*
use strict;
use File::DosGlob 'glob';
use Win32::OLE qw(in with);
use Win32::OLE::Const;
use Win32::OLE::Const 'Microsoft Excel';
$Win32::OLE::Warn = 3; # Die on Errors.
# -----------------------------------*
# Main Program                       *
# -----------------------------------*
my $count = 0;
my @xfiles = (glob "c:\\temp\\*.xls");
my $Excel = Win32::OLE->GetActiveObject('Excel.Application')
    || Win32::OLE->new('Excel.Application', 'Quit');
$Excel->{DisplayAlerts} = 0;
foreach my $xname (@xfiles)  {  
   my $suf = $count++ . ".csv";
   (my $savename = $xname) =~ s/xls/$suf/;
   my $Book = $Excel->Workbooks->Open($xname);
   foreach my $Sheet (in $Book->Sheets) {
      $Sheet->SaveAs($savename, xlCSV);
   }
   $Book->Close;
}
$Excel->{DisplayAlerts} = 1;
#
print "Press any key to quit.";
  until (<STDIN>) {}
Replies are listed 'Best First'.
Re: xls2csv-ole.pl
by sacco (Beadle) on Mar 13, 2005 at 15:40 UTC
    I would add a sub_count for those that have more than 1 worksheet.
    #!C:\Perl\bin/perl.exe # -----------------------------------* use strict; use File::DosGlob 'glob'; use Win32::OLE qw(in with); use Win32::OLE::Const; use Win32::OLE::Const 'Microsoft Excel'; $Win32::OLE::Warn = 3; # Die on Errors. # -----------------------------------* # Main Program * # -----------------------------------* my $count = 0; my @xfiles = (glob "e:\\run\\dlm\\*.xls"); my $Excel = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application', 'Quit'); $Excel->{DisplayAlerts} = 0; foreach my $xname (@xfiles) { #my $suf = $count++ . ".csv"; #(my $savename = $xname) =~ s/xls/$suf/; $count++; my $sub_count = 1; my $Book = $Excel->Workbooks->Open($xname); foreach my $Sheet (in $Book->Sheets) { my $suf = $count .".". $sub_count++ .".csv"; (my $savename = $xname) =~ s/xls/$suf/; $Sheet->SaveAs($savename, xlCSV); } $Book->Close; } $Excel->{DisplayAlerts} = 1; # print "Press any key to quit."; until (<STDIN>) {}