pugnator

Excel parse

Feb 24th, 2013
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 7.61 KB | None | 0 0
  1. #!/usr/bin/perl -w
  2.  
  3. #Объявляем используемые библиотеки, если при запуске их подгрузить не удается - скрипт отваливается
  4. use warnings;
  5. use strict;
  6. use File::Basename;
  7. use Spreadsheet::ParseExcel;
  8. use Spreadsheet::ParseExcel::SaveParser;
  9. use Spreadsheet::WriteExcel;
  10. use Scalar::Util qw(looks_like_number);
  11.  
  12. #Указываем что данные хранятся в UTF8
  13. use utf8;
  14.  
  15. #И что выводить на экран тоже в UTF8
  16. binmode STDOUT, ":utf8";
  17.  
  18. #Как и отрывать файлы
  19. use open ':encoding(utf8)';
  20.  
  21. #@ARGV - массив содержащий параметры, что ты задаешь в командной строке
  22. my $compare_file;
  23.  
  24. #Если параметров больше нуля
  25. if ( @ARGV > 0 ) {
  26.  
  27. #То предполагается что ты указал файл опорный
  28.     $compare_file = $ARGV[1];
  29.     print "Using: $ARGV[1]\n";
  30. }
  31.  
  32. #Если не указал - используем дефолтный
  33. else {
  34.     $compare_file = "Amstor.xls";
  35.     print "Input file wasn't specified, using 'Amstor.xls'\n";
  36. }
  37.  
  38. #**********READ************
  39.  
  40. #Создаем из конструктора парсер экселя
  41. my $parser = Spreadsheet::ParseExcel->new();
  42.  
  43. #**********WRITE***********
  44.  
  45. my $row_count  = 0;
  46. my $resultName = "Report.xls";
  47.  
  48. #Создаем новый экселевский файл, куда будем все писать
  49. my $result_book = Spreadsheet::WriteExcel->new($resultName);
  50.  
  51. # Добавляем в эксель страницу
  52. my $result_sheet = $result_book->add_worksheet('РЕЗУЛЬТАТ');
  53.  
  54. # Работаем с шириной столбца
  55. $result_sheet->set_column( 1, 1, 60 );
  56. $result_sheet->center_horizontally();
  57.  
  58. #Пишем заголовки столбцов ***DEPRECATED***
  59. #$result_sheet->write( 0, 0, "Заказ",   $order_format );
  60. #$result_sheet->write( 0, 1, "Клиент", $order_format );
  61. #$result_sheet->write( 0, 2, "Цена",     $order_format );
  62.  
  63. #**************************
  64.  
  65. my $cell;
  66. my $old_dir = "";
  67. my $offset  = 0;
  68.  
  69. print "The program is analyzing the data...\n";
  70.  
  71. print "Parsing imported workboks...\n";
  72.  
  73. foreach ( &get_xls(".") ) {
  74.     my $workbook = $parser->parse($_);
  75.     next if ( ( !$workbook ) || ( $_ =~ m/$compare_file/i ) );
  76.     if ( ( dirname($_) ne $old_dir ) && ( dirname($_) ne "." ) ) {
  77.  
  78.         #print dirname($_)."this is new dir\n";
  79.         my @dirs = split( '/', dirname($_) );
  80.         print $dirs[ @dirs - 1 ] . "\n";
  81.         $result_sheet->write( $row_count + $offset, 0, $dirs[ @dirs - 1 ] );
  82.         $result_sheet->write( $row_count + $offset, 1, fileparse($_) );
  83.         $old_dir = dirname($_);
  84.         $offset  = 2;
  85.         $row_count += 3;
  86.     }
  87.     else {
  88.         $result_sheet->write( $row_count, 1, fileparse($_) );
  89.         $row_count++;
  90.  
  91.     }
  92.     my $worksheet = $workbook->worksheet(0) || die("$@$!");
  93.  
  94.     # Find out the worksheet ranges
  95.     my ( $row_min, $row_max ) = $worksheet->row_range();
  96.     my ( $col_min, $col_max ) = $worksheet->col_range();
  97.  
  98.     #Main loop
  99.   ORDERS:
  100.     for my $row ( 24 .. $row_max ) {
  101.         $cell = $worksheet->get_cell( $row, 15 );
  102.         if ( !$cell ) {
  103.             next;
  104.         }
  105.         if ( $cell->value() eq "0" ) {
  106.             last ORDERS;
  107.         }
  108.  
  109.         #Order
  110.         $cell = $worksheet->get_cell( $row, 15 );
  111.  
  112.         #print uc( $cell->value() ), "\t" if $cell;
  113.         $result_sheet->write( $row_count, 0, $cell->value() );
  114.  
  115.         #Name
  116.         $cell = $worksheet->get_cell( $row, 16 );
  117.  
  118.         #print uc( $cell->value() ), "\t" if $cell;
  119.         $result_sheet->write( $row_count, 1, $cell->value() );
  120.  
  121.         #Others
  122.         $cell = $worksheet->get_cell( $row, 19 );
  123.  
  124.         #print "\t", $cell->value(), "\tБЛ\t.\n" if $cell;
  125.         $result_sheet->write( $row_count, 3, $cell->value() );
  126.         $result_sheet->write( $row_count, 5, "БЛ" );
  127.         $result_sheet->write( $row_count, 6, "." );
  128.  
  129.         $row_count++;
  130.     }
  131.  
  132.     #$row_count++;
  133.  
  134. }
  135.  
  136. #Close result book
  137. $result_book->close();
  138. print "Checking for exclusions...\n";
  139. check_exclusions($compare_file);
  140.  
  141. print "Done\n";
  142.  
  143. #----------------------SUBROUTINES-------------------------------------
  144.  
  145. sub get_xls {
  146.     my $path = shift;
  147.  
  148.     opendir( DIR, $path )
  149.       or die "Unable to open $path: $!";
  150.  
  151.     my @files =
  152.       map  { $path . '/' . $_ }
  153.       grep { !/^\.{1,2}$/ } readdir(DIR);
  154.     return grep { (/\.xls$/) && ( !-l $_ ) }
  155.       map { -d $_ ? get_xls($_) : $_ } @files;
  156. }
  157.  
  158. sub check_exclusions {
  159.     my ( $pattern, $subst, $comment );
  160.     my $xlsname   = shift;
  161.     my $parser    = Spreadsheet::ParseExcel->new();
  162.     my $workbook  = $parser->parse($xlsname) || die("$@$!");
  163.     my $worksheet = $workbook->worksheet(0) || die("$@$!");
  164.     my ( $row_min, $row_max ) = $worksheet->row_range();
  165.     my ( $col_min, $col_max ) = $worksheet->col_range();
  166.  
  167.     for my $row ( 0 .. $row_max ) {
  168.         $cell = $worksheet->get_cell( $row, 1 );
  169.         if ($cell) {
  170.             $pattern = $cell->value();
  171.             $cell    = $worksheet->get_cell( $row, 2 );
  172.             $subst   = $cell->value();
  173.             $cell    = $worksheet->get_cell( $row, 4 );
  174.             if   ($cell) { $comment = $cell->value(); }
  175.             else         { $comment = ""; }
  176.  
  177.             #print "Ищем вхождения '$pattern'...\n";
  178.  
  179.             #Finding occurencies
  180.             find_by_name( "Report.xls", $pattern, $subst, $comment );
  181.         }
  182.     }
  183.     for my $row ( 0 .. $row_max ) {
  184.         $cell = $worksheet->get_cell( $row, 3 );
  185.         if ($cell) {
  186.             $pattern = $cell->value();
  187.             $cell    = $worksheet->get_cell( $row, 2 );
  188.             $subst   = $cell->value();
  189.             $cell    = $worksheet->get_cell( $row, 4 );
  190.             if   ($cell) { $comment = $cell->value(); }
  191.             else         { $comment = "ИСКЛЮЧЕНИЕ!"; }
  192.  
  193.             #print "Ищем вхождения '$pattern'...\n";
  194.  
  195.             #Finding occurencies
  196.             find_by_order( "Report.xls", $pattern, $subst, $comment );
  197.         }
  198.     }
  199. }
  200.  
  201. sub find_by_name {
  202.     my ( $xlsname, $name, $subst, $comment ) = @_;
  203.     my $parser    = Spreadsheet::ParseExcel::SaveParser->new();
  204.     my $workbook  = $parser->Parse($xlsname);
  205.     my $worksheet = $workbook->worksheet(0) || die("$@$!");
  206.     my ( $row_min, $row_max ) = $worksheet->row_range();
  207.  
  208.     for my $row ( 0 .. $row_max ) {
  209.         $cell = $worksheet->get_cell( $row, 1 );
  210.         next if ( !$cell );
  211.         if ( $cell->value() =~ m/$name/i ) {
  212.  
  213.             #print "Почта найдена '", $cell->value(), "'\n";
  214.             $worksheet->AddCell( $row, 5, $subst );
  215.             $worksheet->AddCell( $row, 7, $comment );
  216.         }
  217.  
  218.     }
  219.     $workbook->SaveAs( $_[0] );
  220. }
  221.  
  222. sub find_by_order {
  223.     my ( $xlsname, $order, $subst, $comment ) = @_;
  224.     my $parser    = Spreadsheet::ParseExcel::SaveParser->new();
  225.     my $workbook  = $parser->Parse($xlsname);
  226.     my $worksheet = $workbook->worksheet(0) || die("$@$!");
  227.     my ( $row_min, $row_max ) = $worksheet->row_range();
  228.  
  229.     for my $row ( 0 .. $row_max ) {
  230.         $cell = $worksheet->get_cell( $row, 0 );
  231.         next if ( !$cell );
  232.         looks_like_number( $cell->value() ) ? 0 : next;
  233.         if ( $cell->value() == $order ) {
  234.  
  235.             #print "Заказ найден '", $cell->value(), "'\n";
  236.             $worksheet->AddCell( $row, 5, $subst );
  237.             $worksheet->AddCell( $row, 7, $comment );
  238.         }
  239.  
  240.     }
  241.     $workbook->SaveAs( $_[0] );
  242. }
Advertisement
Add Comment
Please, Sign In to add comment