我的Perl脚本如何确定Excel文件是XLS还是XLSX格式?

Dav*_*Kub 6 excel perl zip file-format

我有一个Perl脚本从Excel(xls)二进制文件中读取数据.但是向我们发送这些文件的客户端XLSX有时会开始向我们发送格式文件.我已经更新了脚本以便能够阅读这些内容.但是,客户端有时喜欢XLSX使用.xls扩展名来命名文件,因为它使用文件名来确定它的文件类型,因此目前会混淆我的脚本.

一个XLSX文件是一个包含XML的东西的zip文件.我的脚本是否有一种简单的方法来查看文件并判断它是否是zip文件?如果是这样,我可以让我的脚本而不仅仅是文件名.

Ala*_*avi 17

是的,可以通过检查幻数来实现.

Perl中有很多模块用于检查文件中的幻数.

使用File :: LibMagic的示例:

use strict;
use warnings;

use File::LibMagic;

my $lm = File::LibMagic->new();

if ( $lm->checktype_filename($filename) eq 'application/zip; charset=binary' ) {
    # XLSX format
}
elsif ( $lm->checktype_filename($filename) eq 'application/vnd.ms-office; charset=binary' ) {
    # XLS format
}
Run Code Online (Sandbox Code Playgroud)

另一个例子,使用File :: Type:

use strict;
use warnings;

use File::Type;

my $ft = File::Type->new();

if ( $ft->mime_type($file) eq 'application/zip' ) {
    # XLSX format
}
else {
    # probably XLS format
}
Run Code Online (Sandbox Code Playgroud)

  • File :: Type是一个相当大的模块.由于您只对一种文件类型感兴趣,我可能会从那里复制测试.它只是检查文件的前4个字节是否为"PK\003\004". (4认同)

Bru*_*ong 16

.xlsx文件的前2个字节为'PK',因此对前2个字符进行简单的打开和检查即可.

  • 更具体地说,前4个字节是"PK\003\004"`. (5认同)

wei*_*mat 6

编辑:Archive :: Zip是更好的

solution
 # Read a Zip file
   my $somezip = Archive::Zip->new();
   unless ( $somezip->read( 'someZip.zip' ) == AZ_OK ) {
       die 'read error';
   }
Run Code Online (Sandbox Code Playgroud)