Search code examples
drupal-8phpspreadsheet

Why does PhpSpreadsheet fail to identify my Xlsx file in public://?


I'm working on a Drupal module that imports a Xlsx file and inserts the rows to database. Everything works fine, except PhpSpreadsheet throws the error "PHP message: Uncaught PHP Exception InvalidArgumentException: "File "" does not exist." at File.php line 137" when my uploaded file is in public. This error doesn't happen when the file is in base_path(). Line 137 throws an exception saying it's not a file, but \dpm(is_file($uri)) returns TRUE. Why is this happening? Below is my code:

public function submitForm(array &$form, FormStateInterface $form_state) {
    $connection = \Drupal::database();
    $fid = $form_state->getValue("xlsx_upload");
    $input = File::load(reset($fid));
    $input->setPermanent();
    $uri = \Drupal::service('file_system')->realpath($input->getFileUri());
    //$uri = '/home/joe/file.xslx'; <--- this works perfectly.
    $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReaderForFile($uri);
    $spreadsheet = $reader->load($filename);
    $dataArray = $spreadsheet->getActiveSheet()->toArray();
    $connection->truncate("mitacan")->execute();
    $connection->query("SET NAMES utf8");
    foreach ($dataArray as $dataItem) {
      $connection->insert('mitacan')
      ->fields([
        'stokkodu'      => $dataItem[0],
        'logo'          => $dataItem[1],
        'resim1'        => $dataItem[2],
        'grupkodu'      => $dataItem[3],
        'grupadi'       => $dataItem[4],
        'grupindex'     => $dataItem[5],
        'paketadedi'    => $dataItem[6],
      ])
      ->execute();
    }
    drupal_set_message('Excel verisi veritabanına eklendi.');
  }

Solution

  • $spreadsheet = $reader->load($filename);
    

    $filename is undefined. Use $uri instead.