首先参考 Stack Overflow 问题Using Spreadsheet::WriteExcel。
数据结构如下所示:
col1 col2 col3 col4 col5
row1 School 1
row2 Dean John
row3 No.stu. 55
row4 some irrelevant stuff
row5 School2 2
row6 Dean Tony
row7 No. stu. 60
row8 some irrelevant stuff
row9 School 3
row10 Dean James
row11 No.stu. 56
row12 No. teacher 20
row13 School 4
row14 Dean Tom
row15 No.stu. 79
row16 No. teacher 21
row17 course
row18 math 2
row19 eng 4
row20 teacher name age gender race
row21 Jane 20 female white
row22 student name Lee
row23 SAT 1434
row24 gender male
我想要实现的输出是:
col1 col2 col3 col4 col5 col6 col7 col8 col9
row1 School Dean No.stu. No. teacher course_math course_eng teacher_name teacher_age teacher_gender teacher_race student_name student_SAT student_gender
row2 1 John 55
row3 2 Tony 60
row4 3 James 56 20
row5 4 Tome 79 21 2 4 Jane 20 female white Lee 1434 male
多亏了gangabas,我得到的代码是:
use strict;
use warnings;
use Spreadsheet::ParseExcel;
use FindBin qw($Bin);
my ($infile) = @ARGV;
my $parser = Spreadsheet::ParseExcel->new();
my $workbook = $parser->parse("$Bin/Test.xls");
die $parser->error unless defined $workbook;
my ($worksheet) = $workbook->worksheets();
my %data;
my $row = 0;
my $school = "";
while (1) {
my $cell = $worksheet->get_cell($row, 0);
last unless defined($cell);
my $key = $cell->value();
my $value = $worksheet->get_cell($row++, 1)->value();
if ($key eq "School") {
$school = $value;
next;
}
$data{$school}->{$key} = $value;
}
sleep 1;
我从解析row17-row19开始。我遇到的第一个问题是 (row17, col3) 中的空单元格。代码到达这里时出错。知道 Excel 单元格区分“空”和“空白”,我可以通过将原始 XLS 文件的单元格格式设置为“常规”以外的其他格式来玩弄它。但是,这只是一个临时解决方案。我想知道是否有任何命令可以用来获取空单元格。我已经尝试unformatted()
添加:
my $unformattedvalue = $worksheet->get_cell( $row++, 1 )->unformatted();
然而,它行不通。
然后我尝试使用以下代码指定“课程”状态下的数据结构:
my %data;
my $row = 0;
my $school = "";
my $course = ""; #Initial value for the state of course
while (1) {
my $cell = $worksheet->get_cell($row, 0);
last unless defined($cell);
my $key = $cell->value();
my $value = $worksheet->get_cell( $row++, 1 )->value();
my $value1 = $worksheet->get_cell( $row++, 2 )->value(); #Fetching the value in column 3
if ($key eq "School") {
$school = $value;
next;
}
if ($key eq "course") { #Just mimicking the how we construct the structure of 'School'
$course = $value1;
next;
}
$data{$school}->{$key} = $value; #Must be something wrong here, but can not figure out
}
代码没有通过并给出Can't call method "value" on an undefined value at xxx line of 'my $value1 = $worksheet->get_cell( $row++, 2 )->value()';
简而言之,我的问题是:
- 一般来说,如何在不干预过程的情况下获取 XLS 中的空单元格?
如何使用 Spreadsheet::ParseExcel 解析如下结构
row17 course row18 math 2 row19 eng 4