我最近一直在尝试使用perl和一些模块来读取Excel文件,特别是它们的格式。
例如,我编写了一段使用模块ParseExcel读取单元格背景颜色的perl代码。然而,在测试时,我注意到对于某些文件,我的perl程序返回的颜色与Excel报告的颜色不匹配。最终我发现原因是我正在阅读的文件是以兼容模式保存的.xls文件。基本上,该文件的创建者使用Excel .xlsx类型文件(2007+)的功能为某些单元格着色,然后使用不支持所选颜色的旧.xls文件扩展名保存文件。
所以我的问题:有没有办法判断一个给定的.xls文件(或任何其他旧的Excel文件格式)是否已经在兼容模式下保存而没有用Excel来查找?我问的原因是我在linux环境下工作,不能使用任何Windows工具来分析文件。
此外,如果可以确定某个给定的Excel文件确实已经以兼容模式保存,那么有没有办法知道原始颜色是如何映射到我的程序告诉我的那些?
非常感谢您提供任何帮助。
答案 0 :(得分:1)
我不认为您可以使用 Spreadsheet::ParseExcel
来做到这一点。我曾尝试使用 .xlsx 中的颜色保存 xls 文件,并将其保存为 2003 兼容性。然后将它与 2003 年的空 .xls 进行比较,我没有发现我的文件有任何不同。
您可以尝试使用以下代码使用您自己的文件进行调试,以找出可以使用的差异:
use strict;
use warnings;
use Spreadsheet::ParseExcel;
use Data::Dumper;
use JSON;
use Test::More tests => 1;
my $file_1 = 'test_xls.xls';
my $file_2 = 'compat_xls.xls';
my @files = (
$file_1,
$file_2,
);
my @workbooks;
foreach my $file (@files){
print("\n\nReading $file\n");
my $parser = Spreadsheet::ParseExcel->new();
my $workbook = $parser->parse($file);
# print Dumper($workbook->{PkgStr});
delete $workbook->{PkgStr};
delete $workbook->{File};
delete $workbook->{Worksheet}->[0]->{MinRow};
delete $workbook->{Worksheet}->[0]->{RowHeight};
delete $workbook->{Worksheet}->[0]->{_Pos};
delete $workbook->{Worksheet}->[0]->{MinCol};
delete $workbook->{Worksheet}->[0]->{MaxCol};
delete $workbook->{Worksheet}->[0]->{MaxRow};
delete $workbook->{Worksheet}->[0]->{Cells};
delete $workbook->{Format}->[62];
push @workbooks, $workbook;
}
my ($ok, $stack) = is_deeply($workbooks[0], $workbooks[1]);
my $diag = explain($stack);
print(Dumper($diag));