2016-05-20 5 views
0

Я пишу скрипт, который читает файлы .xls и .xlsx из почтовых вложений. Я пытаюсь заставить скрипт переключаться между считывателями на основе расширения файла с помощью метода идентификации.PHPExcel переключатель между xls и xlsx

$strSheetNameResult = 'QA Result'; 
$strSheetNameComments = 'QA Comments'; 

foreach($aPaths as $strPath) { 
    try { 
     $strFileType = PHPExcel_IOFactory::identify($strPath); 
     echo $strFileType; 

     $oReader = PHPExcel_IOFactory::createReader($strFileType); 

     $oReader->setLoadSheetsOnly($strSheetNameResult); 

     $oSheetData = $oReader->load($strPath)->getActiveSheet(); 

.xls работает просто отлично, но как только он встречает .xlsx файл, он не использует правильного чтения и дает мне сообщение об ошибке: `Фатальная ошибка:

Call to a member function getCell() on a non-object in C:\xampp\htdocs\cronjob\Test.php on line 37`

линии 37 :

$aSheetData['strProjectName'] = $oSheetData->getCell('B4')->getValue(); 

Я думаю, эта ошибка вызвана тем, что она не использует правильный считыватель.

$aPaths:

Array(
    [0] => C:\xampp\tmp\105943-632345.xls 
    [1] => C:\xampp\tmp\112047-634744.xlsx 
    [2] => C:\xampp\tmp\112069-634917.xls 
    [3] => C:\xampp\tmp\113840-634955.xls 
    [4] => C:\xampp\tmp\115760-635374.xlsx 
    [5] => C:\xampp\tmp\120294-637780.xls 
    [6] => C:\xampp\tmp\120801-638144.xls 
    [7] => C:\xampp\tmp\121098-638118.xls 
    [8] => C:\xampp\tmp\124831-641137.xlsx 
    [9] => C:\xampp\tmp\127680-642962.xls 
    [10] => C:\xampp\tmp\127689-642665.xls 
    [11] => C:\xampp\tmp\127692-642784.xls 
    [12] => C:\xampp\tmp\127700-643048.xls 
    [13] => C:\xampp\tmp\127708-643096.xls 
    [14] => C:\xampp\tmp\128771-642241.xls 
    [15] => C:\xampp\tmp\129082-647219.xls 
    [16] => C:\xampp\tmp\129629-647241.xls 
    [17] => C:\xampp\tmp\134488-647334.xls 
    [18] => C:\xampp\tmp\134500-646313.xls 
    [19] => C:\xampp\tmp\134508-644581.xls 
    [20] => C:\xampp\tmp\134511-646521.xls 
    [21] => C:\xampp\tmp\134512-646136.xls 
    [22] => C:\xampp\tmp\134561-650010.xls 

)

Кто-нибудь есть идея, почему это не работает, или другой способ переключения между читателями?

+0

Отдельные вызовы, такие как '$ oSheetData = $ oReader-> load ($ strPath) -> getActiveSheet();' в отдельные строки кода, а не доверять тому, что читатель будет успешным и даст вам активный лист; добавить обработку ошибок; проверьте, что Reader на самом деле возвращается 'ident()' для каждого файла (вы его эхом, но не сообщая нам, что отображается) –

+0

В принципе, ваш код должен работать: но если он не работает, e на самом деле не предоставляет нам никакой информации, чтобы диагностировать проблему любым способом. –

+0

Спасибо за быстрый ответ. Я перепроверял файл, и он был идентифицирован как файл xls, когда он был файлом xlsx. Я удалил файл, и теперь он отлично работает! –

ответ

0

Был поврежденный файл в списке, который идентифицирован как файл XLS, но был файл XLSX. Я удалил файл, и теперь он отлично работает!

+0

Вот почему вы не должны доверять расширению файла; хотя чаще вы обнаруживаете csv или html с расширением xls –

0

вы можете попробовать:

 


    $file_types = explode(".", 'C:\xampp\tmp\105943-632345.xls'); 
    $file_type = strtolower($file_types [count($file_types) - 1]); 

    if($file_type=='xls') { 
     $objReader = PHPExcel_IOFactory::createReader('Excel5'); 
    }elseif($file_type=='xlsx'){ 
     $objReader = PHPExcel_IOFactory::createReader('Excel2007'); 
    }else{ 
     echo 'file type error!'; 
     exit; 
    } 

 
+0

Не рекомендуется .... Я всегда советую людям использовать метод 'ident()', потому что он смотрит на фактическое содержимое файла, а не просто на расширение, и поэтому часто расширение не соответствует реальному формату. ... Именно поэтому метод 'ident()' был обнародован –

+0

спасибо за ваше предложение. Я попробую. – dongdong

Смежные вопросы