如何在yii 1.16中将excel数据导入mySQL

时间:2016-02-24 06:54:57

标签: php mysql excel csv yii

我在MySQL数据库中有客户表。我有excel csv中的客户列表,我想将excel数据导入MySQL客户表。我希望有人一步一步地向我展示我如何做到这一点,并告诉模型视图和控制器。

我已经写了一个客户表的MySQL查询,告诉你我将在excel csv中使用相同的颜色。

(`CustomerID`, `FirstName`, `LastName`, `JobTitle`, `BusinessPhone`, `MobilePhone`, `FaxNumber`, `Address`, `Area`, `State`, `ZipCode`, `Country`, `Email`, `Webpage`, `Notes`, `CustomerInvoice`, `Status`)

您想告诉我如何将csv数据导入MySQL表,或者Yii有任何插件可以将Excel数据导入MySQL数据库吗?

4 个答案:

答案 0 :(得分:0)

这是最好的插件,包含适当的文档和示例

http://phpexcel.codeplex.com/

使用此插件,您可以在mysql中导入excel数据。

答案 1 :(得分:0)

您可以使用" LOAD DATA"命令。 以下是yiiframework文档中的示例。

http://www.yiiframework.com/wiki/336/importing-csv-file-to-mysql-table-using-load-data-command/

答案 2 :(得分:0)

您可以从YII获得参考:http://www.yiiframework.com/forum/index.php/topic/23536-upload-data-excel-to-mysql/

** step1:**定义表单模型,即

class UserImportForm extends CFormModel
{
    public $file;
    /**
     * @return array validation rules for model attributes.
     */
    public function rules()
    {
        // NOTE: you should only define rules for those attributes that
        // will receive user inputs.
        return array(  
             array('file', 'file', 
                                            'types'=>'csv',
                                            'maxSize'=>1024 * 1024 * 10, // 10MB
                                            'tooLarge'=>'The file was larger than 10MB. Please upload a smaller file.',
                                            'allowEmpty' => false
                              ),
                   );
    }

    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels()
    {
        return array(
            'file' => 'Select file',
        );
    }

}

第2步:现在您需要在view.ie

中定义表单

注意:我在这里使用了bootstrap表单小部件。您可以根据需要进行更改。

<div class="form">

<?php
$form = $this->beginWidget('bootstrap.widgets.BootActiveForm', array(
    'id'=>'service-form',
    'enableAjaxValidation'=>false,
    'method'=>'post',
    'type'=>'horizontal',
    'htmlOptions'=>array(
        'enctype'=>'multipart/form-data'
    )
)); ?>

    <fieldset>
        <legend>
            <p class="note">Fields with <span class="required">*</span> are required.</p>
        </legend>

        <?php echo $form->errorSummary($model, 'Opps!!!', null, array('class'=>'alert alert-error span12')); ?>

        <div class="control-group">     
            <div class="span4">
                                <div class="control-group <?php if ($model->hasErrors('postcode')) echo "error"; ?>">
        <?php echo $form->labelEx($model,'file'); ?>
        <?php echo $form->fileField($model,'file'); ?>
        <?php echo $form->error($model,'file'); ?>
                            </div>


            </div>
        </div>

        <div class="form-actions">
            <?php $this->widget('bootstrap.widgets.BootButton', array('buttonType'=>'submit', 'type'=>'primary', 'icon'=>'ok white', 'label'=>'UPLOAD')); ?>
            <?php $this->widget('bootstrap.widgets.BootButton', array('buttonType'=>'reset', 'icon'=>'remove', 'label'=>'Reset')); ?>
        </div>

    </fieldset>

<?php $this->endWidget(); ?>

</div><!-- form -->

** step3:**现在您需要在控制器中编写一个动作来导入file.ie

public function actionImportCSV()
        {
           $model=new UserImportForm;

           if(isset($_POST['UserImportForm']))
             {

               $model->attributes=$_POST['UserImportForm'];

               if($model->validate())
                 {

                  $csvFile=CUploadedFile::getInstance($model,'file');  
                  $tempLoc=$csvFile->getTempName();

                    $sql="LOAD DATA LOCAL INFILE '".$tempLoc."'
        INTO TABLE `tbl_user`
        FIELDS
            TERMINATED BY ','
            ENCLOSED BY '\"'
        LINES
            TERMINATED BY '\n'
         IGNORE 1 LINES
        (`name`, `age`, `location`)
        ";

                    $connection=Yii::app()->db;
                    $transaction=$connection->beginTransaction();
                        try
                            {

                                $connection->createCommand($sql)->execute();
                                $transaction->commit();
                            }
                            catch(Exception $e) // an exception is raised if a query fails
                             {
                                print_r($e);
                                exit;
                                $transaction->rollBack();

                             }
                      $this->redirect(array("user/index"));


                 }
             }  

           $this->render("importcsv",array('model'=>$model));
        }

答案 3 :(得分:0)

如果我理解正确,您可以在控制器操作中执行某些操作

public function actionYourActionName(){
   if (isset($_FILES['csv_file']) && !empty($_FILES['csv_file'])) {
    $csv = array();
    $file = fopen($_FILES['csv_file']['tmp_name'], 'r');
    while (($line = fgetcsv($file)) !== FALSE) {
       //$line is an array of the csv elements
        $csv[] = $line;
    }
    fclose($file);
    for ($i = 1; $i < count($csv); $i++) {
       $model = new YourmodelName();
      foreach ($csv[0] as $key => $value) {
         $model->$value = $csv[$i][$key];
     }
        if($model->save()){
          //do here what you want to do after saving model
       }else{return $model->getErrors();}
    }
}
}else{
    $this->render('your view name');
}

并在您的视图文件中,例如,

echo CHtml::form('', 'post', array('id' => "verticalForm", 'class' => 'well form-vertical', 'enctype' => 'multipart/form-data'));
echo CHtml::fileField('csv_file[]', '', array('id' => 'csv_file', 'multiple' => 'multiple'));
echo '<p class="help-block">Please upload .csv files only.</p>';
echo CHtml::submitButton('Submit', array('class' => 'btn btn-primary'));
echo CHtml::endForm();

我想你已经为你的mysql表创建了一个模型,希望这会对你有帮助