Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/perl -w
- #Объявляем используемые библиотеки, если при запуске их подгрузить не удается - скрипт отваливается
- use warnings;
- use strict;
- use File::Basename;
- use Spreadsheet::ParseExcel;
- use Spreadsheet::ParseExcel::SaveParser;
- use Spreadsheet::WriteExcel;
- use Scalar::Util qw(looks_like_number);
- #Указываем что данные хранятся в UTF8
- use utf8;
- #И что выводить на экран тоже в UTF8
- binmode STDOUT, ":utf8";
- #Как и отрывать файлы
- use open ':encoding(utf8)';
- #@ARGV - массив содержащий параметры, что ты задаешь в командной строке
- my $compare_file;
- #Если параметров больше нуля
- if ( @ARGV > 0 ) {
- #То предполагается что ты указал файл опорный
- $compare_file = $ARGV[1];
- print "Using: $ARGV[1]\n";
- }
- #Если не указал - используем дефолтный
- else {
- $compare_file = "Amstor.xls";
- print "Input file wasn't specified, using 'Amstor.xls'\n";
- }
- #**********READ************
- #Создаем из конструктора парсер экселя
- my $parser = Spreadsheet::ParseExcel->new();
- #**********WRITE***********
- my $row_count = 0;
- my $resultName = "Report.xls";
- #Создаем новый экселевский файл, куда будем все писать
- my $result_book = Spreadsheet::WriteExcel->new($resultName);
- # Добавляем в эксель страницу
- my $result_sheet = $result_book->add_worksheet('РЕЗУЛЬТАТ');
- # Работаем с шириной столбца
- $result_sheet->set_column( 1, 1, 60 );
- $result_sheet->center_horizontally();
- #Пишем заголовки столбцов ***DEPRECATED***
- #$result_sheet->write( 0, 0, "Заказ", $order_format );
- #$result_sheet->write( 0, 1, "Клиент", $order_format );
- #$result_sheet->write( 0, 2, "Цена", $order_format );
- #**************************
- my $cell;
- my $old_dir = "";
- my $offset = 0;
- print "The program is analyzing the data...\n";
- print "Parsing imported workboks...\n";
- foreach ( &get_xls(".") ) {
- my $workbook = $parser->parse($_);
- next if ( ( !$workbook ) || ( $_ =~ m/$compare_file/i ) );
- if ( ( dirname($_) ne $old_dir ) && ( dirname($_) ne "." ) ) {
- #print dirname($_)."this is new dir\n";
- my @dirs = split( '/', dirname($_) );
- print $dirs[ @dirs - 1 ] . "\n";
- $result_sheet->write( $row_count + $offset, 0, $dirs[ @dirs - 1 ] );
- $result_sheet->write( $row_count + $offset, 1, fileparse($_) );
- $old_dir = dirname($_);
- $offset = 2;
- $row_count += 3;
- }
- else {
- $result_sheet->write( $row_count, 1, fileparse($_) );
- $row_count++;
- }
- my $worksheet = $workbook->worksheet(0) || die("$@$!");
- # Find out the worksheet ranges
- my ( $row_min, $row_max ) = $worksheet->row_range();
- my ( $col_min, $col_max ) = $worksheet->col_range();
- #Main loop
- ORDERS:
- for my $row ( 24 .. $row_max ) {
- $cell = $worksheet->get_cell( $row, 15 );
- if ( !$cell ) {
- next;
- }
- if ( $cell->value() eq "0" ) {
- last ORDERS;
- }
- #Order
- $cell = $worksheet->get_cell( $row, 15 );
- #print uc( $cell->value() ), "\t" if $cell;
- $result_sheet->write( $row_count, 0, $cell->value() );
- #Name
- $cell = $worksheet->get_cell( $row, 16 );
- #print uc( $cell->value() ), "\t" if $cell;
- $result_sheet->write( $row_count, 1, $cell->value() );
- #Others
- $cell = $worksheet->get_cell( $row, 19 );
- #print "\t", $cell->value(), "\tБЛ\t.\n" if $cell;
- $result_sheet->write( $row_count, 3, $cell->value() );
- $result_sheet->write( $row_count, 5, "БЛ" );
- $result_sheet->write( $row_count, 6, "." );
- $row_count++;
- }
- #$row_count++;
- }
- #Close result book
- $result_book->close();
- print "Checking for exclusions...\n";
- check_exclusions($compare_file);
- print "Done\n";
- #----------------------SUBROUTINES-------------------------------------
- sub get_xls {
- my $path = shift;
- opendir( DIR, $path )
- or die "Unable to open $path: $!";
- my @files =
- map { $path . '/' . $_ }
- grep { !/^\.{1,2}$/ } readdir(DIR);
- return grep { (/\.xls$/) && ( !-l $_ ) }
- map { -d $_ ? get_xls($_) : $_ } @files;
- }
- sub check_exclusions {
- my ( $pattern, $subst, $comment );
- my $xlsname = shift;
- my $parser = Spreadsheet::ParseExcel->new();
- my $workbook = $parser->parse($xlsname) || die("$@$!");
- my $worksheet = $workbook->worksheet(0) || die("$@$!");
- my ( $row_min, $row_max ) = $worksheet->row_range();
- my ( $col_min, $col_max ) = $worksheet->col_range();
- for my $row ( 0 .. $row_max ) {
- $cell = $worksheet->get_cell( $row, 1 );
- if ($cell) {
- $pattern = $cell->value();
- $cell = $worksheet->get_cell( $row, 2 );
- $subst = $cell->value();
- $cell = $worksheet->get_cell( $row, 4 );
- if ($cell) { $comment = $cell->value(); }
- else { $comment = ""; }
- #print "Ищем вхождения '$pattern'...\n";
- #Finding occurencies
- find_by_name( "Report.xls", $pattern, $subst, $comment );
- }
- }
- for my $row ( 0 .. $row_max ) {
- $cell = $worksheet->get_cell( $row, 3 );
- if ($cell) {
- $pattern = $cell->value();
- $cell = $worksheet->get_cell( $row, 2 );
- $subst = $cell->value();
- $cell = $worksheet->get_cell( $row, 4 );
- if ($cell) { $comment = $cell->value(); }
- else { $comment = "ИСКЛЮЧЕНИЕ!"; }
- #print "Ищем вхождения '$pattern'...\n";
- #Finding occurencies
- find_by_order( "Report.xls", $pattern, $subst, $comment );
- }
- }
- }
- sub find_by_name {
- my ( $xlsname, $name, $subst, $comment ) = @_;
- my $parser = Spreadsheet::ParseExcel::SaveParser->new();
- my $workbook = $parser->Parse($xlsname);
- my $worksheet = $workbook->worksheet(0) || die("$@$!");
- my ( $row_min, $row_max ) = $worksheet->row_range();
- for my $row ( 0 .. $row_max ) {
- $cell = $worksheet->get_cell( $row, 1 );
- next if ( !$cell );
- if ( $cell->value() =~ m/$name/i ) {
- #print "Почта найдена '", $cell->value(), "'\n";
- $worksheet->AddCell( $row, 5, $subst );
- $worksheet->AddCell( $row, 7, $comment );
- }
- }
- $workbook->SaveAs( $_[0] );
- }
- sub find_by_order {
- my ( $xlsname, $order, $subst, $comment ) = @_;
- my $parser = Spreadsheet::ParseExcel::SaveParser->new();
- my $workbook = $parser->Parse($xlsname);
- my $worksheet = $workbook->worksheet(0) || die("$@$!");
- my ( $row_min, $row_max ) = $worksheet->row_range();
- for my $row ( 0 .. $row_max ) {
- $cell = $worksheet->get_cell( $row, 0 );
- next if ( !$cell );
- looks_like_number( $cell->value() ) ? 0 : next;
- if ( $cell->value() == $order ) {
- #print "Заказ найден '", $cell->value(), "'\n";
- $worksheet->AddCell( $row, 5, $subst );
- $worksheet->AddCell( $row, 7, $comment );
- }
- }
- $workbook->SaveAs( $_[0] );
- }
Advertisement
Add Comment
Please, Sign In to add comment