从CakePHP到Word文档制作报告

从CakePHP到Word文档制作报告,cakephp,ms-word,Cakephp,Ms Word,这里有人使用过cakePHP和word文档吗? 我必须从我的应用程序中创建一个microsoft word文件.doc,并生成文本,如某些报告: 示例:当我单击某个按钮时,我在word文件中获得了一些信息,显示在“新建”选项卡或下载的文件中 是否有任何cakephp插件用于此或其他用途? 我是gogole it,但不幸的是,结果对我来说并不理想。我也有同样的问题,但Word文档需要设计,几乎需要Word可以完成的所有元素,因此创建HTML并显示为文档很容易但很难看,或者使用更复杂和困难的库 我的

这里有人使用过cakePHP和word文档吗? 我必须从我的应用程序中创建一个microsoft word文件.doc,并生成文本,如某些报告: 示例:当我单击某个按钮时,我在word文件中获得了一些信息,显示在“新建”选项卡或下载的文件中

是否有任何cakephp插件用于此或其他用途?
我是gogole it,但不幸的是,结果对我来说并不理想。

我也有同样的问题,但Word文档需要设计,几乎需要Word可以完成的所有元素,因此创建HTML并显示为文档很容易但很难看,或者使用更复杂和困难的库

我的解决方案是创建一个Word模板,用CodeToken替换预定义的字符串,使用php您可以使用ZIP中的函数,因为de docx本身就是一个ZIP,使用php代码我打开了docx的结构,读取XML并替换字符串,然后重新压缩

也许我会发布一个类。。。这是我在简历中的代码,首先将模板复制到user_文件夹,读取XML数据并替换令牌,然后删除复制的word项目,最后将字符串作为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();
您可以使用它,它是一个通用的PHP库,而不是一个蛋糕插件