2016-01-20 78 views
0

我仍然在學習Yii 2框架的過程。我能夠創建一個上傳Excel文件然後使用phpexcel保存到數據庫的表單。我想通過這樣一種方式來增強它,即上傳的Excel中的數據將顯示在查看的表中,以便用戶可以檢查數據是否與Excel文件相同。檢查後,用戶將有兩個選項,無論是取消還是繼續。Yii2在保存到數據庫之前顯示phpexcel中的數據

這裏是我的控制器方法來讀取文件並保存:

public function importExcel($model, $readFile, $dir) 
{ 
    try { 
     $readFileType = \PHPExcel_IOFactory::identify($readFile); 
     $objReader = \PHPExcel_IOFactory::createReader($readFileType); 
     $objPHPExcel = $objReader->load($readFile); 
    } 
    catch(Exception $e) { 
     die('Error reading data from excel file.'); 
    } 

    $sheet = $objPHPExcel->getSheet(0); 
    $highestRow = $sheet->getHighestRow(); 
    $highestCol = $sheet->getHighestColumn(); 

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

     $rowData = $sheet->rangeToArray('A'. $row . ':' . $highestCol . $row, NULL, TRUE, FALSE); 
     $objPHPExcel->getActiveSheet() 
      ->getStyle('A'. $row . ':' . $highestCol . $row) 
      ->getNumberFormat()->setFormatCode('0000'); 
     // ->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_TEXT); 
     if($row == 9) { 
      continue; 
     } 

     $document = new Document(); 
     $document->type_id = ($rowData[0][0] == 'Ordinance' ? 1 : 2); 
     $document->no = $rowData[0][1]; 
     $document->series = $rowData[0][2]; 
     $document->title = $rowData[0][3]; 
     $document->author = $rowData[0][5]; 
     $document->date_approved = date('Y-m-d', strtotime($rowData[0][8].' '.$rowData[0][9].' '.$rowData[0][10])); 
     $document->region_c = $model->region_c; 
     $document->province_c = $model->province_c; 
     $document->citymun_c = $model->citymun_c; 
     $document->catParent = 1; 
     $document->category_id = 1; 
     $document->file_url = $dir . '/unzip/' . $rowData[0][13]; 
     $document->save(); 

    } 
}  
+0

請添加一些代碼,你已經嘗試過。 – arogachev

+0

我只想知道是否可以在arraydataprovider中加載$ rowData並將其傳遞給GridView。 –

回答

0

如果rowData包含的數據,是該行讀形式的數組Excel您可以做到這一點

$provider = new ArrayDataProvider([ 
    'allModels' => $rowData, 
    'pagination' => [ 
    'pageSize' => 10, 
    ], 
]); 


    return $this->render('your:view', [ 
     'provider'    => $provider, 
    ]); 

和在你grdi查看

<?= GridView::widget([ 
    'dataProvider' => $provider, 
    ...... 
+0

如何在'sort'和gridview中的列中獲得這些屬性?數據來自excel,而不是來自數據庫表。 –

+0

那麼重要的部分是關於如何創建一個合適的ArrayDataProvider ..這似乎是對我來說(排序是最終排序),但任何方式,我已經更新答案你的答案只是我顯示的方式安排..那麼我認爲是公平的我的答案作爲一個權利answwr .. – scaisEdge

0

我這樣做,它的工作。

try { 
     $readFileType = \PHPExcel_IOFactory::identify($readFile); 
     $objReader = \PHPExcel_IOFactory::createReader($readFileType); 
     $objPHPExcel = $objReader->load($readFile); 

    } 
    catch(Exception $e) { 
     die('Error reading data from excel file.'); 
    } 

    $sheet = $objPHPExcel->getSheet(0); 
    $highestRow = $sheet->getHighestRow(); 
    $highestCol = $sheet->getHighestColumn(); 


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

     $rowData = $sheet->rangeToArray('A'. $row . ':' . $highestCol . $row, NULL, TRUE, FALSE); 
     $objPHPExcel->getActiveSheet() 
      ->getStyle('A'. $row . ':' . $highestCol . $row) 
      ->getNumberFormat()->setFormatCode('0000'); 

     if($row == 9) { 
      continue; 
     } 

     $data[] = array(
      'type' => $rowData[0][0], 
      'no' => $rowData[0][1], 
      'series' => $rowData[0][2], 
      'title' => $rowData[0][3], 
      'author' => $rowData[0][5], 
      'dateapproved' => date('Y-m-d', strtotime($rowData[0][8].' '.$rowData[0][9].' '.$rowData[0][10])), 
      'file' => $rowData[0][13] 
     ); 

    } 

    $dataProvider = new ArrayDataProvider([ 
     'allModels' => $data, 
     'pagination' => [ 
      'pageSize' => 10, 
     ], 
    ]); 

    return $this->render('display', [ 
     'dataProvider' => $dataProvider, 
    ]); 

}