【问题标题】:PHPExcel plugin does not import file in cakephpPHPExcel插件不会在cakephp中导入文件
【发布时间】:2015-02-09 09:21:25
【问题描述】:

我正在尝试将 2010 xlsx 文件导入 CAKEPHP 中的 mysql db。 PHPExcel插件用于excel操作。

我面临以下问题。

问题 1:: 我的视图启动时看到以下错误

Notice (8): Undefined index: Program
[APP\Controller\ProgramsController.php, line 83]

问题 2:: 在从视图中浏览 xlsx 文件并单击提交按钮时,我看到以下错误。 无法打开 import.xlsx 进行阅读!文件不存在。

Error: An Internal Error Has Occurred. Stack Trace

APP\Vendor\PHPExcel\IOFactory.php line 268 → PHPExcel_Reader_Excel2007->canRead(string)

APP\Vendor\PHPExcel\IOFactory.php line 205 → PHPExcel_IOFactory::createReaderForFile(string)

APP\Controller\ProgramsController.php line 87 → PHPExcel_IOFactory::identify(string)

[internal function] → ProgramsController->importexcel()

CORE\Cake\Controller\Controller.php line 490 → ReflectionMethod->invokeArgs(ProgramsController, array)

CORE\Cake\Routing\Dispatcher.php line 191 → Controller->invokeAction(CakeRequest)

CORE\Cake\Routing\Dispatcher.php line 165 → Dispatcher->_invoke(ProgramsController, CakeRequest)

APP\webroot\index.php line 108 → Dispatcher->dispatch(CakeRequest, CakeResponse)

下面是我的控制器代码

<?php

App::import('Helper', 'Number'); 

include '../vendor/PHPExcel.php';

include '../vendor/PHPExcel/IOFactory.php';

class ProgramsController extends AppController {

var $name = 'Programs';

var $helpers = array('Html', 'Form', 'Time','PhpExcel','Js' => array('Jquery') );

var $uses = array('Program','Customer');

public $components = array('PhpExcel');   

    function importexcel()
       {

        $inputFileName = $this->data['Program']['uploadFile'];
        if ($inputFileName!='')
        {

            $inputFileType = PHPExcel_IOFactory::identify($inputFileName);  
            $objReader = PHPExcel_IOFactory::createReader($inputFileType); 
            $objReader->setReadDataOnly(true);
            $objPHPExcel = $objReader->load($inputFileName);   
            $objWorksheet = $objPHPExcel->setActiveSheetIndex(0); 
            $highestRow = $objWorksheet->getHighestRow(); 

            for ($row = 2; $row <= $highestRow; ++$row) 
            {

            $this->data['Program']['cycle_month']=$objWorksheet->getCellByColumnAndRow(1, $row)->getValue();
            $this->data['Program']['cycle_year']=$objWorksheet->getCellByColumnAndRow(2, $row)->getValue();
            $this->data['Program']['media_partnum']=$objWorksheet->getCellByColumnAndRow(3, $row)->getValue();


            $resultarray[$row-2]=$this->data['Program'];


            } 
        if ($this->Program->saveAll($resultarray)) {      


                $this->Session->setFlash(__('The Program have been saved', true));

            }

        }

    }
}
?>

我的视图代码如下。

<?php

echo $this->Form->create('Program',array('id' =>'importexcel','type'=>'post','action'=>'importexcel','url' => array('controller' => 'programs')));

?>
<table>
        <tbody>
        <tr>

        <td>Choose Your File:</td>
        <td><input width=200 type="file" name="data[Program][uploadFile]"></td>
         <td>
                <div>
                <?php echo $this->Form->submit('Import Program', array('div'=>false,'name'=>'importexcel'));
                ?>
                </div>
            </td>
            </tr>

        </tbody>
</table>

谁能帮忙解决这个问题,我搜索了使用 PHPExcel 将 Excel 上传到 mysql 数据库的在线教程,但也找不到任何有意义的内容。

如果您能解释修复步骤或任何其他方法,那将非常有帮助。

谢谢。

【问题讨论】:

  • “无法打开 import.xlsx 进行阅读!文件不存在。” very clear 错误消息有什么不清楚的地方?调试路径和文件权限。
  • 我已授予输入文件的完全权限,但仍然出现相同的错误。我是编程新手,请详细说明
  • 你可以关注这个stackoverflow.com/a/17190330/2460470,可能会对你有所帮助。
  • 不知道为什么大多数人不使用PHPExcel将数据导入cakephp,它实际上可以用于从Excel中导入数据。
  • 嗨朋友们,需要一些帮助来解决我的问题。

标签: php cakephp phpexcel


【解决方案1】:

您看到的错误是因为文件路径不正确。它来自这里:https://github.com/PHPOffice/PHPExcel/blob/develop/Classes/PHPExcel/Reader/Excel2007.php#82

因此,请确保将正确的路径传递给 identify() 函数。 $inputFileName 变量中有什么?要确定错误来自此,您可以添加 if (!file_exists($inputFileName)) { echo "NOT_THERE"; } 语句(或如果可以使用断点。

另外,我不确定 CakePHP 是如何工作的,但是在上传文件时,您需要使用创建的临时文件的路径。试试这个:

$this->data['Program']['uploadFile']['tmp_name']

【讨论】:

  • 感谢您查看问题,但添加 ['tmp_name'] 也无济于事。
  • 你能把$this->data['Program']['uploadFile']的内容贴在这里吗?添加var_dump($this-&gt;data['Program']['uploadFile']); 并在此处复制内容
  • 再次感谢 Adrien 的回复,位于“var_dump($this->data['Program'] 'uploadFile']);”的输出下方输出字符串“import.xlsx”(长度=11)
  • 根据文档,定义表单时需要使用type="file"。您可以像这样定义您的输入:$this-&gt;Form-&gt;file('Program.uploadFile');。然后您应该能够使用$this-&gt;request-&gt;data['DocuPrograment']['uploadFile']['tmp_name'] 检索文件路径
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 1970-01-01
  • 2012-09-07
相关资源
最近更新 更多