是否有人在使用cakePHP和word docs? 我必须从我的应用程序创建一个微软word文件(.doc)并生成一些报告: 例如:当我点击某个按钮时,我会在word文件中显示一些信息(在新标签或下载的文件中显示)。
是否有任何cakephp插件用于该或其他? 我很高兴,但遗憾的是我没有为我做好准备。
答案 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();