PHPOffice/Word - 从模板生成多个文件时出错

PHPOffice/Word - Error when generate multiple files from template

我正在使用 PHPOffice/Word 包从模板生成 word 文件,我在 PHP 服务器 7.3.29 上使用 Laravel 5.8 版本 运行。

当我只下载一个 word 文档时,生成效果很好,但是当我想在 foreach 循环中生成多个 word 文件时,我得到了那个错误:ZipArchive::getFromName(): Invalid or uninitialized Zip object.

代码如下(错误在saveAs方法那一行):

      $template_path = $request->FILE_PATH;
      try {
        $templateProcessor = new TemplateProcessor($template_path);
      }
      catch(\Exception $e) {
        return back()->with('danger',"Erreur lors de l'export - Vérifier le nom et le chemin de la maquette");
      }
      foreach(explode(",",$request->IDS_CONTACT) as $idContact) {
        $contact = Contact::find($idContact);
        $templateProcessor->setValue('date_jour',$request->DT_ENVOI_PACK);
        $templateProcessor->setValue('IDENTITE','Test');
        $templateProcessor->setValue('ADRESSE','Test');
        $templateProcessor->setValue('projet','Test');
        $templateProcessor->setValue('ADRESSE_BIS','Test');
        $templateProcessor->setValue('CODE_POSTAL','Test');
        $templateProcessor->setValue('VILLE','Test');
        $templateProcessor->setValue('form_politesse','Test');
        $templateProcessor->setValue('object_pack',$request->OBJ_PACK);
        $templateProcessor->setValue('form_politesse2','Test');
        $filename = time() . "PackBienvenue.docx";
        $templateProcessor->saveAs(storage_path('exports\'.$filename));
        sleep(1);
      }

令人惊讶的是,它在第​​一代上仍然可以正常工作,并且在它引发我之前提出的异常之前我得到了我的 word 文档。但它就此止步,后代不起作用。

我首先想到的是被覆盖的文件名有问题,所以我使用了 time 方法来确保每个文档都有不同的文件名。

而且,我有一个旧版本的 Word(Word 2010 版本 14),不认为这是问题所在,但我怀疑我更愿意精确...

如果有人以前做过这样的事情,我将不胜感激。提前致谢

对于那些感兴趣的人,我通过在每次循环游览时(重新)创建一个 TemplateProcessor 对象来解决这个问题。 不确定这是修复此错误的最佳方法,但它有效!

完整代码如下:

// code 
      foreach(explode(",",$request->IDS_CONTACT) as $idContact) {
        try {
          $templateProcessor = new TemplateProcessor($template_path);
        }
        catch(\Exception $e) {
          return back()->with('danger',"Erreur lors de l'export - Vérifier le nom et le chemin de la maquette");
        }
        $contact = Contact::find($idContact);
        $templateProcessor->setValue('date_jour',$request->DT_ENVOI_PACK);
        $templateProcessor->setValue('IDENTITE',$contact->identite);
        $templateProcessor->setValue('ADRESSE',$contact->ADRESSE1);
        $templateProcessor->setValue('projet',$projet->LIBELLE_PROJ);
        $templateProcessor->setValue('ADRESSE_BIS',$contact->ADRESSE2);
        $templateProcessor->setValue('CODE_POSTAL',$contact->CDPOST);
        $templateProcessor->setValue('VILLE',$contact->COMMUNE);
        $templateProcessor->setValue('form_politesse',$contact->getFormulePolitesse());
        $templateProcessor->setValue('object_pack',$request->OBJ_PACK);
        $templateProcessor->setValue('form_politesse2',strtolower($contact->getFormulePolitesse()));
        $filename = time() . "PackBienvenue.docx";
        $templateProcessor->saveAs(storage_path('exports\'.$filename));
      }