PHPExcel从定义的工作表生成数据到数组

时间:2012-10-31 03:25:40

标签: php mysql phpexcel

我想首先从我的xlsx文件生成一个数组,然后将其插入到Mysql中,所以我使用的是phpexcel因为这个很好(我从每个网站的评论中都知道它)。但是当我尝试从xlsx定义的工作表创建数组时出现问题,这是我的脚本:

<?php

error_reporting(E_ALL);
set_time_limit(0);

date_default_timezone_set('Europe/London');

?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<title>Automatic Importer</title>

</head>
<body>

<h1>PHPExcel Reader Example #07</h1>
<h2>Simple File Reader Loading a Single Named WorkSheet</h2>
<?php

/** PHPExcel_IOFactory */
include 'Classes/PHPExcel/IOFactory.php';


//$inputFileType = 'Excel5';
    $inputFileType = 'Excel2007';
//  $inputFileType = 'Excel2003XML';
//  $inputFileType = 'OOCalc';
//  $inputFileType = 'Gnumeric';
$inputFileName = 'file.xlsx';
$sheetname = 'My Sheet 4';

echo 'Loading file ',pathinfo($inputFileName,PATHINFO_BASENAME),' using IOFactory with a defined reader type of ',$inputFileType,'<br />';
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
echo 'Loading Sheet "',$sheetname,'" only<br />';
$objReader->setLoadSheetsOnly($sheetname);
$objPHPExcel = $objReader->load($inputFileName);


echo '<hr />';

echo $objPHPExcel->getSheetCount(),' worksheet',(($objPHPExcel->getSheetCount() == 1) ? '' : 's'),' loaded<br /><br />';
$loadedSheetNames = $objPHPExcel->getSheetNames();
$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);
var_dump($sheetData);


?>
<body>
</html>

这就是错误说:

Fatal error: Call to a member function cellExists() on a non-object in C:\xampp\htdocs\chi\import\Classes\PHPExcel\Calculation.php on line 3241

有人能说出错误在哪里吗?我的OOP不好,谢谢

2 个答案:

答案 0 :(得分:1)

当您使用第三个参数调用toArray()并告诉方法评估工作表中的所有公式时,PHPExcel正在评估问题的电子表格公式之一存在问题。我确实在昨晚添加了一个修复程序,其中包含对不存在的单元格的引用的命名范围在公式中使用...将触发此消息的错误;但在这种情况下(具有该特定行号的错误),它看起来好像是一个引用不存在的工作表的公式。您只加载一个命名工作表的事实使这很有可能。

如果可能,您可以“遍历电子表格”,在每个单元格上使用getCalculatedValue()来查找哪个单元格包含触发错误的公式;然后看看那个公式是什么?

或者,加载整个工作簿而不只是单个工作表,然后查看错误是否仍然存在。

我将看看修补计算引擎代码以防止此错误;但它确实意味着如果无法访问它引用的工作表,则无法正确评估公式。

答案 1 :(得分:0)

您可以从设置Xdebug开始,这将更清晰地显示错误来自哪里。从这段代码中,我可以假设xlsx文件由于某些错误而无法读取,或者应该读取的工作表存在一些问题。