PHPExcel:如何检查XLS文件是否有效?

时间:2012-11-29 13:15:39

标签: php phpexcel

我正在使用PHPExcel 1.7.8来阅读由radom用户上传的.xls个文件。所有这些都与有效的.xls文件一起正常工作,但现在我想对无效文件进行一些测试,以检查程序是否显示错误消息。

所以我拿了一个.csv文件,并用.xls重命名(没有转换任何东西,只是更改名称)到最后,只是为了检查...
破碎! :)

DOM ELEMENT: HTML
DOM ELEMENT: BODY
DOM ELEMENT: P
START OF PARAGRAPH: 
END OF PARAGRAPH:
FLUSH CELL: A1 => block,date,hour...

array
  1 =>
    array
      'A' => string  'block,date,hour...' (length=2777)

{"step":"error","errors":[],"warnings":[]}

就像你看到的那样,显示一条错误信息,我没有要求,然后是我经常写的JSON。

它发生在这一行:

<?php
echo "Loading file\n";
try {
    if (!($objPHPExcel = PHPExcel_IOFactory::load('path'))) {
        echo "Failed\n";
        return;
        // ...
    }
} catch(Exception $e) {
    echo 'Exception !';
}
echo "Done\n";

此代码显示:

Loading file
/!\ ERROR MESSAGE ABOVE /!\
Done

我的问题是,在尝试解析之前,有没有办法用PHPExcel或其他任何方法来检查文件是否是有效的XLS文件

谢谢。

2 个答案:

答案 0 :(得分:18)

即使这是一年多的问题,我仍然觉得弄清楚如何处理这个问题很麻烦,我会尝试在这里发布我的答案。

如果使用try / catch块不起作用(在我的情况下,我将jpg文件重命名为xls并且错误处理程序不起作用,而不是抛出错误,无效文件只会抛出警告)< / em>,您可以考虑使用canRead()进行手动检查,如Mark所说,这是一个如何使用此功能的示例。

如果你知道你的文件类型是什么,你可以手动定义它并检查它们:

$valid = false;
$types = array('Excel2007', 'Excel5');
foreach ($types as $type) {
    $reader = PHPExcel_IOFactory::createReader($type);
    if ($reader->canRead($file_path)) {
        $valid = true;
        break;
    }
}

if ($valid) {
  // TODO: load file
  // e.g. PHPExcel_IOFactory::load($file_path)
} else {
  // TODO: show error message
}

希望这可以帮助任何有同样问题的人。

答案 1 :(得分:11)

PHPExcel中的每个阅读器都有一个canRead()方法,该方法验证传入read的文件是否为该阅读器的适当格式 - 该方法返回一个简单的布尔值True或False。从调用PHPExcel_Reader_Excel5类的canRead()方法返回True将确认该读取器可以读取该文件,而不管文件扩展名如何。

IOFactory identify()方法使用此调用,依次针对每个支持的格式对读者进行测试,直到它从canRead()调用获得真正的返回。反过来,IOFactory load()方法使用identify()来确定哪个Reader应该用于指定的文件。

当您想为读者设置其他参数时,验证文件类型的能力(不依赖于通常会产生误导的文件扩展名)特别有用。

来自identify()/ load()的回退略微不令人满意:如果canRead()为所有其他读者返回false,则该文件将被视为CSV。