2014-02-16 54 views
1

是否有人在CakePHP和Word文档中工作? 我必须从我的应用程序创建一个微软word文件(.doc),并生成文本,如一些报告: 例如:当我点击某个按钮时,我在word文件(在新标签或下载文件中显示)中获得一些信息。从CakePHP制作报告到Word文档

有没有任何cakephp插件或其他东西? 我是gogole它,但不幸的是我没有welll结果。

+0

你可以使用这个https://phpword.codeplex.com/这是一个通用的PHP库,而不是一个蛋糕插件 – arilia

回答

0

嗨,我有同样的问题,但Word文档需要设计和Word可以做的几乎所有元素,所以创建一个HTML并显示为DOC(简单但难看)或使用库(更复杂和更难) ...

我的解决方案是创建word的模板,并用代码(tokens)替换预定义的字符串,用php可以使用ZIP中的函数,因为de docx是ZIP本身,巫婆php代码我打开(docx)读取XML并替换字符串的结构,然后重新编排。

也许我会发布一个类...这是我的简历代码,首先将模板复制到user_folder,reed XML数据并替换令牌,然后删除复制单词的项目,最后插入XML(巫婆数据)和文件的字符串。

//Abrimos el archivo para leer los encabezados XML del documento de word. 
    //Es importante que los documentos sean docx, nativos. 
    $zip = new ZipArchive(); 
    $res = $zip->open($plantilla); 
       ///Errors  
       /* 
       ZIPARCHIVE::ER_EXISTS - 10 
       ZIPARCHIVE::ER_INCONS - 21 
       ZIPARCHIVE::ER_INVAL - 18 
       ZIPARCHIVE::ER_MEMORY - 14 
       ZIPARCHIVE::ER_NOENT - 9 
       ZIPARCHIVE::ER_NOZIP - 19 
       ZIPARCHIVE::ER_OPEN - 11 
       ZIPARCHIVE::ER_READ - 5 
       ZIPARCHIVE::ER_SEEK - 4 
       */ 
    //Si se encontro y pudo leerse, extraemos el encabezado, cuerpo y pie originales (archivos XML) de la plantilla de Word 
    if ($res === TRUE) 
    { 
     $contenido=$zip->getFromName('word/document.xml'); 

     $pie=$zip->getFromName('word/footer2.xml'); 
     if($pie==false) 
     { 
      $pie=$zip->getFromName('word/footer1.xml'); 
      $unoPie=true; 
     } 
     else 
     $unoPie=false; 

     $encabezado=$zip->getFromName('word/header2.xml'); 
     if($encabezado==false) 
     { 
      $encabezado=$zip->getFromName('word/header1.xml'); 
      $unoHead=true; 
     } 
     else 
      $unoHead=false; 


     //Verificamos la existencia de la carpeta, esta es creada la primera vez al capturar los datos complementarios 
     // del usuario, controller->Userdatas/add, sino estuviera creada la creamos 
     $this->check_folder($id_usuario); 

     //Copiamos la plantilla original a la carpeta del usuario, para en ella realizar las 
     //operaciones de reemplazo y actualización 
     if(copy($plantilla,$copia_plantilla)) 
     { 
      //****REEMPLAZO DE TOKENS 
      //Una vez efectuada la copia de plantillas realizamos los reemplazos de tokens    
      //El extra token era usado para indicar desde donde se obtenia la información que no existe 
      //en la base de datos como los recibos de pago, con cantidades que en su momento son pasados 
      // y reemplazados mediante el uso del extratoken. 
      $extraTokens=false; 

      $contenido=$this->replazeTokens2($contenido,$id_object,$tipo_id,$extraTokens); 
      if($contenido[0]=="false") 
       throw new NotFoundException(__($contenido[1]));        


      $pie=$this->replazeTokens2($pie,$id_object,$tipo_id,$extraTokens); 
      if($pie[0]=="false") 
       throw new NotFoundException(__($pie[1]));        

      $encabezado=$this->replazeTokens2($encabezado,$id_object,$tipo_id,$extraTokens); 
      if($encabezado[0]=="false") 
       throw new NotFoundException(__($encabezado[1]));         


       $zip2 = new ZipArchive(); 
       $res = $zip2->open($copia_plantilla); 
        if ($res === TRUE) 
        {  
         //echo "Se ha abierto correctamente la plantilla clonada para tokens"; 
         //Borramos los encabezados, pie y documento para reemplazarlo con las cadenas ya con tokens       
         $zip2->deleteName('word/document.xml'); 

         if($unoPie==true) 
         $zip2->deleteName('word/footer1.xml'); 
         else 
         $zip2->deleteName('word/footer2.xml');      


         if($unoHead==true) 
         $zip2->deleteName('word/header1.xml'); 
         else    
         $zip2->deleteName('word/header2.xml'); 

         //Sólo si la plantilla es Gafete, eliminamos la imagen barcode.png de la plantilla 
         //Hay que tener cuidado, de que si se agregan más imagenes, no cambie el número de la imagen 
         if($id_plantilla==3) 
          { 
           //Barcode 
           $zip2->deleteName('word/media/image2.png'); 
           //FotoUser 
           $zip2->deleteName('word/media/image1.jpg');         
          } 



         //Agregamos archivo ya con los reemplazos. 
         $zip2->addFromString('word/document.xml', $contenido[1]); 

         if($unoPie==true)  
         $zip2->addFromString('word/footer1.xml', $pie[1]); 
         else 
         $zip2->addFromString('word/footer2.xml', $pie[1]); 

         if($unoHead==true) 
         $zip2->addFromString('word/header1.xml', $encabezado[1]); 
         else 
         $zip2->addFromString('word/header2.xml', $encabezado[1]); 




         //Sólo si la plantilla es Gafete, eliminamos la imagen barcode.png de la plantilla 
         //Hay que tener cuidado, de que si se agregan más imagenes, no cambie el número de la imagen          
         if($id_plantilla==3) 
          { 
           if(file_exists($barcode_user)) 
           { 
            $resultado=$zip2->addFile($barcode_user, 'word/media/image2.png'); 
            if($resultado==false) 
             die("No se pudo agregar el código de barras");          
           } 
           else 
           { 
           echo "No existe el código de barras"; 
           } 

           if(file_exists($foto_user)) 
           { 
            $resultado=$zip2->addFile($foto_user, 'word/media/image1.jpg'); 
            if($resultado==false) 
             die("No se pudo agregar la fotografía del usuario");           
           } 
           else 
           { 
           echo "No existe la fotografía del usuario"; 
           } 


          } 

         $zip2->close(); 
         //echo "Plantilla reemplazada"; 

         $link=$download_document; 
         $this->set(compact('link')); 

        } 
        else 
        { 
         echo 'No se pudo abrir la copia de la plantilla mediante la function zip->open(), verifique que sea un documento XML de Word (.docx) en la carpeta del usuario'."<br>"; 
         echo 'Verifique su existencia en:'.$copia_plantilla."<br>"; 
         echo 'Código de error:'.$res."<br>"; 
        } 

     } 
     else 
     { 
      echo "No se pudo realizar la copia de archivos plantilla original a la carpeta del usuario"; 
     } 
    //Cerramos archivo 
    $zip->close();