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

时间:2010-10-27 18:09:25

标签: perl excel zip file-format

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

XLSX文件是包含XML内容的zip文件。我的脚本是否有一种简单的方法来查看文件并判断它是否是zip文件?如果是这样,我可以使用我的脚本而不仅仅是文件名。

7 个答案:

答案 0 :(得分:17)

是的,可以通过查看magic number

Perl中有相当多的模块用于检查文件中的magic number

使用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
}

另一个例子,使用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
}

答案 1 :(得分:16)

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

答案 2 :(得分:6)

编辑:Archive :: Zip是一个更好的

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

答案 3 :(得分:2)

使用File::Type

my $file = "foo.zip";
my $filetype = File::Type->new( );

if( $filetype->mime_type( $file ) eq 'application/zip' ) {
  # File is a zip archive.
  ...
}

我刚刚使用.xlsx文件对其进行了测试,mime_type()返回了application/zip。同样,对于.xls文件,mime_type()application/octet-stream

答案 4 :(得分:1)

您可以通过检查Excel头文件的第一个字节来检测xls文件。

可以从此处获取有效的旧Excel标题列表(除非您知道其Excel的确切版本,请检查所有适用的可能性):

http://toorcon.techpathways.com/uploads/headersig.txt


此处描述了Zip标头:http://en.wikipedia.org/wiki/ZIP_(file_format)#File_headers 但我不确定.xlsx文件是否具有相同的标题。

File :: Type的逻辑似乎是“PK \ 003 \ 004”作为决定zip文件的文件头...但是我不确定这个逻辑是否会起作用.xlsx,没有要测试的文件。

答案 5 :(得分:-1)

The-Evil-MacBook:~ ivucica$ file --mime-type --brief file.zip 
application/zip

因此,可能比较

`file --mime-type --brief $filename`
使用application/zip

可以检测到拉链。当然,您需要安装file,这在UNIX系统上很常见。我恐怕无法提供Perl示例,因为Perl的所有知识都从我的记忆中消失了,而且我手头没有例子。

答案 6 :(得分:-2)

我不能说Perl,但是对于我使用的框架.Net,有许多库可以操作你可以使用的zip文件。

我见过人们使用的另一件事是WinZip的命令行版本。它提供的返回值在文件解压缩时为0,在出现错误时为非零。

这可能不是最好的方法,但这是一个开始。