从CakePHP向Word文档生成报告

时间:2014-02-16 01:28:46

标签: cakephp ms-word

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

是否有任何cakephp插件用于该或其他? 我很高兴,但遗憾的是我没有为我做好准备。

1 个答案:

答案 0 :(得分:0)

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

我的解决方案是创建一个Word模板,并用代码(令牌)替换预定义的字符串,用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();