【问题标题】:PHPExcel generate data to array from defined sheetPHPExcel从定义的工作表生成数据到数组
【发布时间】:2012-10-31 03:25:39
【问题描述】:

我想先从我的 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不好,谢谢

【问题讨论】:

    标签: php mysql phpexcel


    【解决方案1】:

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

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

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

    我会考虑修补计算引擎代码以防止出现此错误;但这确实意味着如果公式引用的工作表不可访问,则无法正确评估该公式。

    【讨论】:

    • 嗨,马克,我刚刚在其他人的问题中阅读了您的回答。你能告诉我为什么会出现这个错误吗?链接:pastebin.com/c5VFX4z2。我认为错误发生在“rangeToArray”中,谢谢
    • 啊,已经修好了,先生,谢谢。但是为什么每个 php excel 类(如 phpexcel 或 simplexlsx)总是有“内存不足”的问题呢?这让我发疯了,我已经尝试了一切,但没有解决:(
    • @您是否尝试过使用任何单元缓存方法来减少内存需求?
    • 阅读开发者文档的第 4.2.1 节(标题为“单元缓存”)应该可以帮助您入门
    • 哇,好的,我会学习的,谢谢。顺便说一句,还有其他方法可以将数据从 xlsx 转换为数组吗?
    【解决方案2】:

    您可以从设置 Xdebug 开始,这样可以更清楚地了解错误的来源。从这段代码中,我可以假设,由于某些错误或应该读取的工作表存在问题,xlsx 文件没有被读取。

    【讨论】:

    • 我现在认为错误不是来自阅读,但我认为问题是如何将其变为数组?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    相关资源
    最近更新 更多