Я только начал программировать на Perl и просто пытаюсь выяснить, можно ли сделать приведенный ниже код более эффективным или его можно сделать в меньше строк.
Я немного изучил модульWin32::OLE
и модульText::CSV
, но из того, что я читал до сих пор, мне кажется, что это единственный путь.
По сути, это вопрос новичка, который спрашивает старшего: «Эй, как мне стать лучшим программистом на Perl?»
Целью кода является получение данных из указанных диапазонов на указанных листах рабочей книги Excel и запись содержимого этих диапазонов в файлы CSV.
Кроме того, я знаю, что мне нужно реализовать общие проверки, например убедиться, что мое $cellValue
определено перед добавлением его в массив и тому подобное, но я ищу больше общей структуры. Например, есть ли способ сгладить цикл, поместив сразу всю строку в массив или весь диапазон в массив или ссылку или что-то в этом роде?
Спасибо
use strict;
use warnings;
use Spreadsheet::XLSX;
my $excel = Spreadsheet::XLSX -> new ('C:\scott.xlsm',);
my @sheets = qw(Fund_Data GL_Data);
foreach my $sheet (@sheets) {
my $worksheet = $excel->Worksheet($sheet);
my $cell = $worksheet->get_cell(25,0);
if ($cell) { # make sure cell value isn't blank
my $myFile = "C:/$sheet.csv";
open NEWFILE, ">$myFile" or die $!;
# write all cells from Range("A25:[MaxColumn][MaxRow]") to a csv file
my $maxCol = $worksheet->{MaxCol};
my $maxRow = $worksheet->{MaxRow};
my @arrRows;
my $rowString;
# loop through each row and column in defined range and string together each row and write to file
foreach my $row (24 .. $maxRow) {
foreach my $col (0 .. $maxCol) {
my $cellValue = $worksheet->{Cells} [$row] [$col]->Value();
if ($rowString) {
$rowString = $rowString . "," . $cellValue;
} else {
$rowString = $cellValue;
}
}
print NEWFILE "$rowString\n";
undef $rowString;
}
}
}