it-swarm.com.de

Masseneinfügungsdatensätze in der Datenbank von Excel

Ich entwickle eine Komponente, von der aus Benutzer Excel-Tabellen hochladen können und die Daten in einer Datenbank gespeichert werden müssen. Wenn Excel-Tabellenzeilen den Wert 250 Haben, funktioniert das Einfügen problemlos. Wenn die Zeilen jedoch den Wert 2500 Oder mehr haben, wird eine leere Seite ohne Fehler angezeigt und die Zeilen werden nicht vollständig in die Datenbank eingefügt. Ich verwende die Bibliothek PHPExcel zum Importieren von Excel-Tabellen. Es folgt der Code:

  1. controller/fileuploads.php :

    public function uploadData($fileData, $data,$tablename){
    
    //Validate file by checking if Excel sheet is uploaded
    $isValid = $this->validateFileType($fileData);
    
    if($isValid){
    
        $inputFilename = $fileData['excelfile']['tmp_name'];
        try {
            $objPHPExcel    = PHPExcel_IOFactory::load($inputFilename); //read the spreadsheet workbook
        } catch (Exception $e) {
            die('Error loading file "'.pathinfo($inputFilename,PATHINFO_BASENAME).'": '.$e->getMessage());
        }
    
        //  Get worksheet dimensions
        $sheet = $objPHPExcel->getSheet(0);
        $highestRow = $sheet->getHighestRow();
        $highestColumn = $sheet->getHighestColumn();
        for ($row = 4; $row <= $highestRow; $row++){
          // Read a row of data into an array
          $rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row);
    
          if(!empty($rowData[0][0])){ //if row is null
               //  Insert row data array into database
               $isInserted = $this->insertData($rowData, $data);
          }
    
         }// Excel for loop ends
    
       if($isInserted){
        //redirect after importing the data from Excel into database
        $this->setRedirect(JRoute::_('index.php?option=com_mycomponent&view=fileuploads', false), 'File uploaded successfully','message');
       }
    
    }//if($isValid)
    }
    
  2. controller/fileuploads - insertData-Methode: Diese Methode ruft verschiedene Modellmethoden auf, je nachdem, welches Abschnittsblatt hochgeladen wird. Ex. Section Test Ruft eine Methode getInsertSectionTest() aus dem Modell auf. Es gibt 6 verschiedene Abschnitte.

  3. models/fileupload.php: Es folgt der Code zum Einfügen von Daten

    public function getInsertSectionTest($rowData, $data){
      $objData = new stdClass();
      $objData->section_id = $data['section'][0];
      $objData->category = str_replace("'","",$rowData[0][0]);
      $objData->subcategory = str_replace("'","",$rowData[0][6]);
      $objData->year = $data['year'];
      $objData->number_type = $rowData[0][7];
      .
      . // and so on
      .
      $objData->region_northwest = $rowData[0][43];
      $objData->region_southwest = $rowData[0][44];
      $objData->region_unknown = $rowData[0][45];
    
      $insertResult = JFactory::getDbo()->insertObject('#__testsection_tablename', $objData);
    
      if( $insertResult){
        return true;
      }
      else{
        $this->setRedirect(JRoute::_('index.php?option=com_mycomponent&view=fileuploads', false), 'Data could not be imported. Please try again' ,'error');
        return false;
      }
    }
    

Bitte lassen Sie mich wissen, wie mehr als 2000 Zeilen gleichzeitig eingefügt werden. Ich habe auch auf dieses Frage verwiesen, aber nicht in der Lage, das einzufügende Array von Werten zu bilden.

2
Liz.

Ich habe das Problem gelöst. Das Problem bestand darin, dass beim 2000-maligen Aufruf der Einfügeabfrage ein Deadlock auftrat und eine leere Seite zurückgegeben wurde. Die Lösung hierfür besteht darin, eine einzelne Einfügeabfrage zu erstellen und dann die Werte einzufügen. Im Folgenden ist der Code, den ich in der Modelldatei hinzugefügt habe:

Anstatt die Methode insert in der Schleife aufzurufen, habe ich das Array insert values ​​gebildet:

$getValues = array();

for ($row = 4; $row <= $highestRow; $row++){
    //  Read a row of data into an array
    $rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row);
    if(!empty($rowData[0][0])){ //if row is null
        //  Insert row data array into database
        $getValues[] = $this->getValuesModel($rowData, $data);
    }

}// Excel for loop ends

$columns = $this->getColumns($data); //call columns method to fetch different section's columns

$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->insert($db->quoteName($tablename));
$query->columns($columns);
$query->values($getValues);
$db->setQuery($query);
$isInserted = $db->query();

if($isInserted){
    //redirect after importing the data from Excel into database
    $this->setRedirect(JRoute::_('index.php?option=com_componentname&view=fileuploads', false), 'File uploaded successfully','message');
}

Für vollständigen Code und Dateien verweisen Sie auf Github .

3
Liz.