错误描述:phpexcel导入excel文件报the filename xxx is not recognised as an OLE file错误。
这个错误其实不是什么大事。只因为今天用微擎框架写项目的时候发现导入Excel文件出错了。所以记录下来,如果有其他人再遇到此类问题,可以参考下面的方法去解决。
微擎phpexcel原始代码:
- public function import($excefile)
- {
- global $_W;
- require_once IA_ROOT . '/framework/library/phpexcel/PHPExcel.php';
- require_once IA_ROOT . '/framework/library/phpexcel/PHPExcel/IOFactory.php';
- require_once IA_ROOT . '/framework/library/phpexcel/PHPExcel/Reader/Excel5.php';
- $path = IA_ROOT . '/addons/ewei_shopv2/data/tmp/';
- if (!(is_dir($path)))
- {
- load()->func('file');
- mkdirs($path, '0777');
- }
- $filename = $_FILES[$excefile]['name'];
- $tmpname = $_FILES[$excefile]['tmp_name'];
- if (emptyempty($tmpname))
- {
- message('请选择要上传的Excel文件!', '', 'error');
- }
- $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
- if (($ext != 'xlsx') && ($ext != 'xls'))
- {
- message('请上传 xls 或 xlsx 格式的Excel文件!', '', 'error');
- }
- $file = time() . $_W['uniacid'] . '.' . $ext;
- $uploadfile = $path . $file;
- $uploadfile = iconv("utf-8", "gb2312", $uploadfile); //强制转码
- $result = move_uploaded_file($tmpname, $uploadfile);
- if (!($result))
- {
- message('上传Excel 文件失败, 请重新上传!', '', 'error');
- }
- $reader = PHPExcel_IOFactory::createReader(($ext == 'xls' ? 'Excel5' : 'Excel2007'));
- $excel = $reader->load($uploadfile);
- $sheet = $excel->getActiveSheet();
- $highestRow = $sheet->getHighestRow();
- $highestColumn = $sheet->getHighestColumn();
- $highestColumnCount = PHPExcel_Cell::columnIndexFromString($highestColumn);
- $values = array();
- $row = 1;
- while ($row <= $highestRow)
- {
- $rowValue = array();
- $col = 0;
- while ($col < $highestColumnCount)
- {
- $rowValue[] = (string) $sheet->getCellByColumnAndRow($col, $row)->getValue();
- ++$col;
- }
- $values[] = $rowValue;
- ++$row;
- }
- return $values;
- }
对于题目中报的错误经过排查是因为创建的解析器无法解析上传的文件导致的。这行代码就是上面的第32行。
那么解决方法一共有两种:
方法一:先检查下文件类型,然后根据文件类型创建解析器。即把32行代码位置改为:
- $readertype = PHPExcel_IOFactory::identify($uploadfile);
- $reader = PHPExcel_IOFactory::createReader($readertype);
方法二:直接为上传的文件创建解析器。
- $reader = PHPExcel_IOFactory::createReaderForFile($uploadfile);
其实根据文件扩展名创建解析器一般情况下是没有问题的,遇到部分文件可能会出现解析错误。所以大家在开发过程中一定要灵活选择方法。