【问题标题】:PHPExcel XLS not recognised as an OLE filePHPExcel XLS 未被识别为 OLE 文件
【发布时间】:2015-12-12 19:11:56
【问题描述】:

我使用 PHPExcel 库开发了一个 PHP Web 应用程序。除了一些奇怪地无法识别为 Excel 文档的 Excel 文档外,一切都正常工作。当我用 Microsoft Excel 打开这些文件并将它们保存为 xls、csv、xlsx 时,一切正常。 所以...我认为某些 Excel 文件与它们的扩展名并不完全一样。也许它们是伪装的 XML?是否可以通过 PHPExcel 获得 XML 支持?

这是错误:

Fatal error: Uncaught exception 'PHPExcel_Reader_Exception' with message 'The filename /tmp/phphrnIR2 is not recognised as an OLE file' in /home/www/text/excel/reader/Classes/PHPExcel/Shared/OLERead.php:89 Stack trace: #0 /home/test/excel/reader/Classes/PHPExcel/Reader/Excel5.php(1164): PHPExcel_Shared_OLERead->read('/tmp/phphrnIR2') #1 /home/www/text/excel/reader/Classes/PHPExcel/Reader/Excel5.php(612): PHPExcel_Reader_Excel5->_loadOLE('/tmp/phphrnIR2') #2 /home/www/test/excel/actions.php(60): PHPExcel_Reader_Excel5->load('/tmp/phphrnIR2') #3 /home/www/test/excel/index.php(77): include_once('/home/www/test/ex...') #4 {main} thrown in /home/www/test/excel/reader/Classes/PHPExcel/Shared/OLERead.php on line 89

以及文件识别的php代码:

 $name     = $_FILES['file']['name'];
                    $tname    = $_FILES['file']['tmp_name'];
                    $type     = $_FILES['file']['type'];

                    if($type == 'application/vnd.ms-excel')
                    {
                            // Excel 97 extension
                            $ext = 'xls';
                    }
                    else if($type == 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
                    {
                            // Excel 2007 and 2010 extension
                            $ext = 'xlsx';
                    }


                    else if($type == 'text/csv')
                    {
                            // Excel CSV extension
                            $ext = 'csv';


                    }else{

                            // Invalid Extension   
                    ?> 
                            <script languaje="javascript">
                                  swal("Bad file...", "A valid extension must be XLS, XLSX o CSV!", "error");
                            </script> 
                            <?php
                            exit();
                    }
 //reader creation
                    $objReader = PHPExcel_IOFactory::createReader($$ext);

                    //uploading file
                    $objPHPExcel = $objReader->load($tname);


                    $dim = $objPHPExcel->getActiveSheet()->calculateWorksheetDimension();

【问题讨论】:

    标签: php excel phpexcel phpexcelreader


    【解决方案1】:

    好吧,尽管它有一个.xls 扩展名,但它完全有可能不是 BIFF 格式的 xls 文件。

    当文件是 csv 格式文件,甚至是 HTML 标记时,很多人给文件一个 xls 扩展名.....从不信任扩展名;由于 mime 类型将基于文件扩展名,因此您也不能从表面上看。

    而不是专门创建基于扩展/mime 类型的阅读器....使用 PHPExcel IOFactory identify() 方法查看 PHPExcel 认为文件是什么文件格式。或者调用 IOFactory 的 load() 方法,让它自己尝试识别文件格式。

    很明显,这个文件不是 BIFF 格式(或者是使用非常早版本的 BIFF 格式创建的,版本 5 之前),否则它会被识别为 OLE 文件

    【讨论】:

    • 非常感谢您的回复。 “奇怪”的 Excel 文件是由外部应用程序生成的(我无法访问它的代码),所以我认为你是完全正确的,也许它使用的是旧的 BIFF 格式版本。虽然我需要阅读有关 identify() 和 load() 的内容。
    • 好吧,经过多次尝试,当我尝试上传“奇怪”的 XLS 文件时,我发现 $type 变量返回一个空值,我不知道为什么。使用我的 Debian Konsole 中的“文件”命令说该文件是“XML 文档文本”。当我对有效文档执行相同操作时,“文件”命令说:“复合文档文件 V2 文档,Little Endian,操作系统:Windows,版本 6.1,代码页:1252,作者:用户我,上次保存者:用户我,创建时间/日期:2015 年 9 月 14 日星期一 10:59:28,最后保存的时间/日期:2015 年 9 月 14 日星期一 10:59:28,安全性:0 任何帮助将不胜感激。谢谢。
    • 不确定它是什么类型的文件,而且很难在没有看到它的情况下分辨出来......但如果它是一个纯 XML 文件(被标识为“XML 文档文本”),那么 PHPExcel 可能不会无法阅读,因为它不被识别为电子表格格式
    • 非常感谢马克。嗯..有没有办法在上传文件之前“导出”或自动“另存为”一个有效的 xls/csv/xlsx 以便能够使用 PXPExcel 处理文件?也许我可以通过这种方式解决问题。但也许我应该打开另一个线程。 :)
    • 忘记我对空文件所说的话。由于 php 限制,服务器正在上传一个空文件。我上传了upload_max_value,现在$type变量返回:“application/vnd.ms-excel”但是“不被识别为OLE文件”的问题仍然存在。
    【解决方案2】:

    匿名用户,我遇到了同样的问题。这就是我修复它的方法:

    让 PHPExcel 发现类型

    快速简单地加载

    require_once('Classes'.DIRECTORY_SEPARATOR.'PHPExcel.php');
    
    // Tell PHPExcel to load this file and make its best guess as to its type.
    $objPHPExcel = PHPExcel_IOFactory::load($_FILES['uploaded_file']['tmp_name']);
    

    使用选项加载

    require_once('Classes'.DIRECTORY_SEPARATOR.'PHPExcel.php');
    
    // Tell PHPExcel that you will be loading a file.
    $objReader = PHPExcel_IOFactory::createReaderForFile($_FILES['uploaded_file']['tmp_name']);
    
    // Set your options.
    $objReader->setReadDataOnly(true);
    
    // Tell PHPExcel to load this file and make its best guess as to its type.
    $objPHPExcel = $objReader->load($_FILES['uploaded_file']['tmp_name']);
    

    source

    现在您有了一个 PHPExcel 对象,您可以通过这种方式处理工作表:

        foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
            $worksheets[] = $worksheet->toArray();
        }
    
        foreach($worksheets as $sheet) {
    
            foreach($sheet as $row) {
                print_r($row);
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-19
      • 1970-01-01
      • 2017-04-09
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      相关资源
      最近更新 更多