#!/usr/bin/perl use utf8; use strict; use warnings; use Data::Dumper; use File::MMagic; use Number::Latin; use Excel::Writer::XLSX; use List::Util qw( first ); use Spreadsheet::ParseXLSX; use Spreadsheet::ParseExcel; die "Usage: $0 Primary (excel sheet) Secondary (excel sheet) Name of new (excel sheet)\n" if (scalar @ARGV != 3); sub _checkFilesExtensions { my ( $fileInput ) = @_; foreach my $file (@$fileInput) { # Match a dot, followed by any number of non-dots until the # end of the line. my ($input, $ext) = split('\.', $file); die "Please use striclty excel files format .xls or .xlsx '$file'\n" unless defined $ext; die "Please use striclty excel files format .xls or .xlsx '$file'\n" unless ( $ext eq 'xls' or $ext eq 'xlsx' ); } return; } sub _getObjectSpreadSheet { my ( $FileToOpen ) = @_; my $ft = File::MMagic->new(); my $type = $ft->checktype_filename( $FileToOpen ); my $parser; if ($type =~ /zip/){ $parser = Spreadsheet::ParseXLSX->new(); } else { $parser = Spreadsheet::ParseExcel->new(); } my $workbook = $parser->parse( $FileToOpen ); if ( !defined $workbook ) { die $parser->error(), ".\n"; } return $workbook->worksheet( 0 ); } sub _getDataFromSpreadSheet { my ( $worksheet , $RouterIDColumn , $WanInterfaceColumn ) = @_; my ( $row_min, $row_max ) = $worksheet->row_range(); my $name = $worksheet->get_name(); my %HoH; my %hash; foreach my $row ( $row_min .. $row_max ) { my $cellWanInterface = $worksheet->get_cell( $row, $WanInterfaceColumn ); next unless $cellWanInterface; if ($cellWanInterface->value()) { my $cellRouteID = $worksheet->get_cell( $row, $RouterIDColumn ); if ($WanInterfaceColumn) { $hash{$cellRouteID->value()} = $cellWanInterface->value(); $row = $row+1; # Plus one because row starts from 0 and counting from 1 $HoH{uc int2latin($RouterIDColumn +1).$row} = { 'RouterID' => $cellRouteID->value(), 'Wan Interdace' => $cellWanInterface->value(), }; } else { $hash{$cellWanInterface->value()} = undef; $row = $row+1; # Plus one because row starts from 0 and counting from 1 $HoH{uc int2latin($WanInterfaceColumn +1).$row} = { 'RouterID' => $cellWanInterface->value(), 'Wan Interdace' => undef, }; } } next; } return \%HoH, \%hash; } sub _writeIntoCell { my ( $key, $hashOfHashesWanInterfaceDataValue, $hashTechnicalReportDataValue, $worksheet, $workbook ) = @_; my %formatHash = ( -font => 'Arial', -size => 8, -border => 7, -align => 'center', ); # Add and define a format my $format = $workbook->add_format( %formatHash ); # Write some text $row, $column, $text, $format $worksheet->write( $key, $hashOfHashesWanInterfaceDataValue, $format ); my @characters = split(//, $key); my @columnArray = grep /^[[:alpha:]]+$/, @characters; my @rowArray = grep /^[[:digit:]]+$/, @characters; my $column = join('', @columnArray); my $row = join('', @rowArray); $column++; $key = $column . $row; $worksheet->write( $key, $hashTechnicalReportDataValue, $format ); return; } sub getDataTechicalReport { my ( $FileToOpen ) = @_; my $worksheet = _getObjectSpreadSheet( $FileToOpen ); my $RouterIDColumn = 1; # RouterID my $WanInterfaceColumn = 25; # Wan Interface return _getDataFromSpreadSheet( $worksheet, $RouterIDColumn, $WanInterfaceColumn ); } sub getDataWanInterface { my ( $FileToOpen ) = @_; my $worksheet = _getObjectSpreadSheet( $FileToOpen ); my $RouterIDColumn = undef; # We do not care my $WanInterfaceColumn = 0; # A column return _getDataFromSpreadSheet( $worksheet, $RouterIDColumn, $WanInterfaceColumn ); } sub spreadsheetToWrite { my ( $hashOfHashesWanInterfaceData, $hashTechnicalReportData ) = @_; # Create a new Excel workbook my $workbook = Excel::Writer::XLSX->new( $ARGV[2] ); die "Problems creating new Excel file: $!" unless defined $workbook; # Add a worksheet my $worksheet = $workbook->add_worksheet(); foreach my $key ( keys %$hashOfHashesWanInterfaceData ) { my $RouterID = first { /$hashOfHashesWanInterfaceData->{$key}{'RouterID'}/ } keys %$hashTechnicalReportData; if ( $RouterID ) { _writeIntoCell( $key, $hashOfHashesWanInterfaceData->{$key}{'RouterID'}, $hashTechnicalReportData->{$RouterID}, $worksheet, $workbook ); } else { _writeIntoCell( $key, $hashOfHashesWanInterfaceData->{$key}{'RouterID'}, "undef", $worksheet, $workbook ); } #} } my %headerFormatHash = ( -font => 'Calibri', -size => 11, -bg_color => '#09c8eb', -bold => 1, -border => 7, -align => 'center', ); my $headerFormat = $workbook->add_format( %headerFormatHash ); $worksheet->write( 'A1', 'DNS Name', $headerFormat ); $worksheet->write( 'B1', 'WAN Interface', $headerFormat ); return; } #### main() #### _checkFilesExtensions(\@ARGV); my ( $hashOfHashesTechikalReport, $hashTechnicalReport ) = getDataTechicalReport( $ARGV[0] ); # print Dumper $hashOfHashesTechikalReport; # print Dumper %$hashOfHashesTechikalReport{'B1376'}; my @keysTechicalReport = keys %$hashTechnicalReport; # print Dumper \@keysTechicalReport; my ( $hashOfHashesWanInterface, $hashWanInterface ) = getDataWanInterface( $ARGV[1] ); # print Dumper $hashOfHashesWanInterface; # print Dumper $hashWanInterface; # print Dumper %$hashOfHashesWanInterface{'A13'}; my @keysWanInterface = keys %$hashWanInterface; # print Dumper \@keysWanInterface; spreadsheetToWrite( $hashOfHashesWanInterface, $hashTechnicalReport ); __END__ $ perl test.pl prime.xlsx secondary.xlsx sample.xlsx #### B (column) Z (column) Line 1 (or what ever number) node1 GigabitEthernet0/1 Line 2 (or what ever number) node2 GigabitEthernet0/2 Line 3 (or what ever number) node3 GigabitEthernet0/3 #### A (column) node1 node2 node3 node4 (extra on purpose) #### Column A Column B DNS Name WAN Interface node1 GigabitEthernet0/1 node2 GigabitEthernet0/2 node3 GigabitEthernet0/3 node4 undef