3

PHPExcel 1.7.8用来读取.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 文件?

谢谢你。

4

2 回答 2

19

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

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

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

$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
}

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

于 2014-01-23T09:04:46.663 回答
12

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

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

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

从 identify()/load() 的回退稍微不太令人满意:如果 canRead() 对所有其他读取器返回 false,则文件被视为 CSV。

于 2012-11-29T13:25:03.557 回答