我正在使用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文件?
谢谢。
答案 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。