package Interfaces::ExcelBinary; use strict; use Spreadsheet::ParseExcel; warn "Spreadsheet::ParseExcel $Spreadsheet::ParseExcel::VERSION"; use vars qw($Headers $rowcount); $Headers = []; # cell_handler (Workbook, Sheet_index, Row, Col, Cell) # Called by Spreadsheet::ParseExcel for every cell encountered. sub cell_handler { my ($workbook, $sheet_index, $row, $col, $cell) = @_; if ($row == 0) { push(@{$Interfaces::ExcelBinary::Headers}, $cell->value); $rowcount = 0; } if ($row > 0) { $rowcount++; #Data::Dump::dd($Interfaces::ExcelBinary::Headers); #$workbook->ParseAbort(1); #exit; } } # ReadData (Filename, [WorkSheetID]) returns $ar_data # Reads data from the given file (which should be a BIFF-formatted .xls-file) and the given worksheet (by name or number (0-based)). # If the supplied worksheetID is a number, a negative number -n will refer to the n-to-last worksheet. sub ReadData { my ($self, $FileName, $WorkSheetID) = @_; my $ExcelParser = Spreadsheet::ParseExcel->new( CellHandler => \&cell_handler, NotSetCell => 1, ); print("Parsing $FileName\n"); main::mem_usage(); my $WorkBook = $ExcelParser->parse($FileName); print("Done parsing\n"); main::mem_usage(); []; #exit; }; package main; use strict; use File::Basename; use Benchmark; sub ReadXLS { my ($interface,$file) = @_; my $ar_data; print("Reading from xls..."); my $benchmark = Benchmark::timeit(1, sub { $ar_data = $interface->ReadData($file); }); print("$Interfaces::ExcelBinary::rowcount records in [" . $benchmark->real . " seconds], [" . (scalar @{$ar_data} / ($benchmark->real+1)) . " records/s]\n"); return $ar_data; } sub mem_usage { print for grep {/^perl.exe\s+$$\b/i} `tasklist`; }; @ARGV = map { glob $_ } @ARGV; for my $file (@ARGV) { printf "%s %d bytes\n", basename($file), -s $file; mem_usage(); ReadXLS(Interfaces::ExcelBinary::, $file); };