Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP无法通过COM打开Excel工作簿_Php_Excel_File Io_Com - Fatal编程技术网

PHP无法通过COM打开Excel工作簿

PHP无法通过COM打开Excel工作簿,php,excel,file-io,com,Php,Excel,File Io,Com,这段代码工作正常,直到到达打开的工作簿行,然后失败 <?PHP $file = "C:\\xampp\\htdocs\\php\\test.xls"; openWorkbook($file); function openWorkbook($file) { $excel = new COM("Excel.Application") or die ("ERROR: Unable to instantaniate COM!\r\n"); echo "Application name: {$

这段代码工作正常,直到到达打开的工作簿行,然后失败

 <?PHP

$file = "C:\\xampp\\htdocs\\php\\test.xls";
openWorkbook($file);

function openWorkbook($file)
{
$excel = new COM("Excel.Application") or die ("ERROR: Unable to instantaniate COM!\r\n");
echo "Application name: {$excel->Application->value}\r\n";
echo "Loaded version: {$excel->Application->version}\r\n";

// FAILS ON THIS LINE!
$Workbook = $excel->Workbooks->Open($file) or die("ERROR: Unable to open " . $file . "!\r\n");
}

我假设您需要使用COM而不是像这样的第三方库是有原因的。如果没有一个具体的原因,考虑切换到一个这些尝试,测试和更好地支持的替代品。

您的代码似乎是正确的,我只能想象您有某种权限问题

通过COM从PHP中的MSO应用程序中提取合理的错误消息可能非常困难,因此您可以尝试以下几点:

  • 验证文件扩展名(
    .xls
    在您的情况下)是否与文件中的数据匹配-例如,确保没有具有错误文件扩展名的CSV文件。Excel(即使通过COM访问)应该能够处理此问题,但如果您在Excel应用程序中打开文件,它将发出警告
  • 在Excel中打开文件,键入一个空单元格,删除刚才键入的内容,然后保存。这将导致Excel重新编码并将整个文件写回磁盘,这也可能有助于解决任何损坏的文件问题
  • 确保该文件具有相应的权限。最好的方法是将文件设置为“Everyone”组的完全权限,如果这解决了问题,则可以将权限调整为所需的限制


这不太可能解决这个特定的问题(文件打开代码似乎相同),但它可能会对您有所帮助:不久前,我为Excel编写了一个非常小的包装库,可通过COM访问,可以找到它。它的功能非常有限,但是可以很容易地添加更多的方法;它给聚会带来的主要好处是略微干净的API和稍好的错误处理。

首先感谢您的帮助。我试过你的建议,但没有用。我得到的具体或不太具体的错误是“致命错误:在C:\xampp\htdocs\php\ExcelReader.php的第22行”。第22行是尝试打开工作簿的行。php.ini文件如下所示…[COM\u DOT\u NET]扩展名=php\u COM\u dotnet.dll[COM]COM.allow\u dcom=true COM.autoregister\u typelib=true COM.autoregister\u casesensitive=false;com.autoregister\u verbose=true@user3032510如果您的问题与ini设置有关,我会感到惊讶。如果您的扩展本身有问题,并且您的设置没有创建区分大小写的方法,我希望它在
新COM
行失败,这是我在这个简单的操作中看到的唯一其他潜在问题。请注意,COM会在出错时抛出异常,因此您
或die()
没有多大意义-请尝试将函数体包装在try/catch中并回显异常消息。根据我的经验,抛出的消息仍然是相当无用的,但你永远不知道。