检查Excel文件是否在兼容模式下保存而不使用Excel

时间:2018-03-13 10:40:59

标签: excel perl

我最近一直在尝试使用perl和一些模块来读取Excel文件,特别是它们的格式。

例如,我编写了一段使用模块ParseExcel读取单元格背景颜色的perl代码。然而,在测试时,我注意到对于某些文件,我的perl程序返回的颜色与Excel报告的颜色不匹配。最终我发现原因是我正在阅读的文件是以兼容模式保存的.xls文件。基本上,该文件的创建者使用Excel .xlsx类型文件(2007+)的功能为某些单元格着色,然后使用不支持所选颜色的旧.xls文件扩展名保存文件。

所以我的问题:有没有办法判断一个给定的.xls文件(或任何其他旧的Excel文件格式)是否已经在兼容模式下保存而没有用Excel来查找?我问的原因是我在linux环境下工作,不能使用任何Windows工具来分析文件。

此外,如果可以确定某个给定的Excel文件确实已经以兼容模式保存,那么有没有办法知道原始颜色是如何映射到我的程序告诉我的那些?

非常感谢您提供任何帮助。

1 个答案:

答案 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));