Hola, parece que la idea del script es bastante buena, pero tiene algunas fallas, por ahi antes del while tiene unos detalles la conexion, sustituyanlo por
mysql_select_db("data_base");
$result = mysql_query($sql);
y al momento de recuperar el dato de la base de datos sería de la siguiente forma
$datosql = $row[$dato[1]];
en vez de
$datosql = $row->$dato[1];
Saludos
El churris
BUeno ya me funciono el codigo correstamente, le hice algunos cambios pequeños que estan contemplados por otos participantes de este articulo,
Solo cambie un poco la sentencia SQL por una mas basica y puse la ruta completa de la plantilla. Tuve un problema por que no me reeemplazaba los campos en la plantilla por los datos de la BD, intenten primero solo colocabdo en la platilla el #*NOMBRE*#, y cuando ya reeemplace pongan el texto que deseen..
//codigo....
<?php
function leef($fichero)
{
$texto= file($fichero);
$tamleef = sizeof($texto);
for ($n=0; $n<$tamleef;$n++)
{ $todo = $todo.$texto[$n];}
return $todo;
}
function rtf($sql, $plantilla, $fsalida, $matequivalencias)
{
$pre=time();
$fsalida="C:/AppServ/www/1/".$pre.$fsalida;
$link=mysql_connect('localhost','tu_usurio','tu_clave');
$txtplantilla=leef($plantilla);
$matriz=explode("sectd",$txtplantilla);
$cabecera=$matriz[0]."sectd";
$inicio=strlen($cabecera);
$final=strrpos($txtplantilla,"}");
$largo=$final-$inicio;
$cuerpo=substr($txtplantilla,$inicio,$largo);
$punt = fopen($fsalida ,"w");
fputs($punt,$cabecera);
mysql_select_db("tu_db",$link);
$result=mysql_query($sql,$link);
while($row=mysql_fetch_array($result)){
$despues=$cuerpo;
foreach($matequivalencias as $dato){
$datosql=$row[$dato[1]];
$datosql=stripslashes($datosql);
$datortf=$dato[0];
$despues=str_replace($datortf,$datosql,$despues);
}
fputs($punt,$despues);
$saltopag="par page par";
fputs($punt,$saltopag);
}
fputs($punt,"}");
fclose($punt);
return $fsalida;
}
$plantilla="plantilla.rtf";
$sql = "SELECT usuario,contrase FROM usuarios ORDER BY usuario";
$equivalencia[0][0]="#*NOMBRE*#";
$equivalencia[0][1]="usuario";
$equivalencia[1][0]="#*CLAVE*#";
$equivalencia[1][1]="contrase";
$salida=rtf($sql,$plantilla,"certificado.rtf",$equivalencia);
$salida="<A href='$salida'>Obtener</A>";
echo("<p>$salida</p>");
?>
Ha tengan presente el orden enque estan la equivalencias una hace referencia al nombre en la plantilla $equivalencia[0][0]="#*algo*#"; y la otra al campo en la DB $equivalencia[0][1]="nombre campo base de datos";
espero ke les sirva.
BUeno ya me funciono el codigo correstamente, le hice algunos cambios pequeños que estan contemplados por otos participantes de este articulo,
Solo cambie un poco la sentencia SQL por una mas basica y puse la ruta completa de la plantilla. Tuve un problema por que no me reeemplazaba los campos en la plantilla por los datos de la BD, intenten primero solo colocabdo en la platilla el #*NOMBRE*#, y cuando ya reeemplace pongan el texto que deseen..
//codigo....
<?php
function leef($fichero)
{
$texto= file($fichero);
$tamleef = sizeof($texto);
for ($n=0; $n<$tamleef;$n++)
{ $todo = $todo.$texto[$n];}
return $todo;
}
function rtf($sql, $plantilla, $fsalida, $matequivalencias)
{
$pre=time();
$fsalida="C:/AppServ/www/1/".$pre.$fsalida;
$link=mysql_connect('localhost','tu_usurio','tu_clave');
$txtplantilla=leef($plantilla);
$matriz=explode("sectd",$txtplantilla);
$cabecera=$matriz[0]."sectd";
$inicio=strlen($cabecera);
$final=strrpos($txtplantilla,"}");
$largo=$final-$inicio;
$cuerpo=substr($txtplantilla,$inicio,$largo);
$punt = fopen($fsalida ,"w");
fputs($punt,$cabecera);
mysql_select_db("tu_db",$link);
$result=mysql_query($sql,$link);
while($row=mysql_fetch_array($result)){
$despues=$cuerpo;
foreach($matequivalencias as $dato){
$datosql=$row[$dato[1]];
$datosql=stripslashes($datosql);
$datortf=$dato[0];
$despues=str_replace($datortf,$datosql,$despues);
}
fputs($punt,$despues);
$saltopag="par page par";
fputs($punt,$saltopag);
}
fputs($punt,"}");
fclose($punt);
return $fsalida;
}
$plantilla="plantilla.rtf";
$sql = "SELECT usuario,contrase FROM usuarios ORDER BY usuario";
$equivalencia[0][0]="#*NOMBRE*#";
$equivalencia[0][1]="usuario";
$equivalencia[1][0]="#*CLAVE*#";
$equivalencia[1][1]="contrase";
$salida=rtf($sql,$plantilla,"certificado.rtf",$equivalencia);
$salida="<A href='$salida'>Obtener</A>";
echo("<p>$salida</p>");
?>
Ha tengan presente el orden enque estan la equivalencias una hace referencia al nombre en la plantilla $equivalencia[0][0]="#*algo*#"; y la otra al campo en la DB $equivalencia[0][1]="nombre campo base de datos";
espero ke les sirva.
BUeno ya me funciono el codigo correstamente, le hice algunos cambios pequeños que estan contemplados por otos participantes de este articulo,
Solo cambie un poco la sentencia SQL por una mas basica y puse la ruta completa de la plantilla. Tuve un problema por que no me reeemplazaba los campos en la plantilla por los datos de la BD, intenten primero solo colocabdo en la platilla el #*NOMBRE*#, y cuando ya reeemplace pongan el texto que deseen..
//codigo....
<?php
function leef($fichero)
{
$texto= file($fichero);
$tamleef = sizeof($texto);
for ($n=0; $n<$tamleef;$n++)
{ $todo = $todo.$texto[$n];}
return $todo;
}
function rtf($sql, $plantilla, $fsalida, $matequivalencias)
{
$pre=time();
$fsalida="C:/AppServ/www/1/".$pre.$fsalida;
$link=mysql_connect('localhost','tu_usurio','tu_clave');
$txtplantilla=leef($plantilla);
$matriz=explode("sectd",$txtplantilla);
$cabecera=$matriz[0]."sectd";
$inicio=strlen($cabecera);
$final=strrpos($txtplantilla,"}");
$largo=$final-$inicio;
$cuerpo=substr($txtplantilla,$inicio,$largo);
$punt = fopen($fsalida ,"w");
fputs($punt,$cabecera);
mysql_select_db("tu_db",$link);
$result=mysql_query($sql,$link);
while($row=mysql_fetch_array($result)){
$despues=$cuerpo;
foreach($matequivalencias as $dato){
$datosql=$row[$dato[1]];
$datosql=stripslashes($datosql);
$datortf=$dato[0];
$despues=str_replace($datortf,$datosql,$despues);
}
fputs($punt,$despues);
$saltopag="par page par";
fputs($punt,$saltopag);
}
fputs($punt,"}");
fclose($punt);
return $fsalida;
}
$plantilla="plantilla.rtf";
$sql = "SELECT usuario,contrase FROM usuarios ORDER BY usuario";
$equivalencia[0][0]="#*NOMBRE*#";
$equivalencia[0][1]="usuario";
$equivalencia[1][0]="#*CLAVE*#";
$equivalencia[1][1]="contrase";
$salida=rtf($sql,$plantilla,"certificado.rtf",$equivalencia);
$salida="<A href='$salida'>Obtener</A>";
echo("<p>$salida</p>");
?>
Ha tengan presente el orden enque estan la equivalencias una hace referencia al nombre en la plantilla $equivalencia[0][0]="#*algo*#"; y la otra al campo en la DB $equivalencia[0][1]="nombre campo base de datos";
espero ke les sirva.
¡Hola! Ahora mismo no tengo aquí un ejemplo de código parecido al tuyo que pillé de un libro. (te felicito, es muy bueno).
Pero alguien sabría insertar una imagen en el documento final RTF? (una imagen que se encuentra en la bdd y es distinta para cada usuario.
Por ejemplo, en el caso que tú pones, como si tubiera que aparecer la fotografía de cada alumno.
Soy incapaz de conseguirlo, aún habiendo hecho millones de purebas.
Hola he probado este articulo y me genera un error que no he podido resolver
Warning: file(plantilla.rft) [function.file]: failed to open stream: No such file or directory in C:ServidorWEBSECaepafconstanciaapfrtf.php on line 7
no me encuentra el fichero pero este si se encuentra en el directorio
Aguien le ha ido bien ??
Hola he solucionado el problema del archivo con el ejemplo de @ndrey, pero ahora obtengo el archivo en blanco =(
aqui les pongo lo que estoy haciendo
function leef($fichero)
{
$texto= file($fichero);
$tamleef = sizeof($texto);
for ($n=0; $n<$tamleef;$n++)
{ $todo = $todo.$texto[$n];}
return $todo;
}
function rtf($plantilla, $fsalida, $matequivalencias)
{
$pre=time();
$fsalida="reporte".$pre.$fsalida;
$txtplantilla=leef($plantilla);
$matriz=explode("sectd",$txtplantilla);
$cabecera=$matriz[0]."sectd";
$inicio=strlen($cabecera);
$final=strrpos($txtplantilla,"}");
$largo=$final-$inicio;
$cuerpo=substr($txtplantilla,$inicio,$largo);
$punt = fopen($fsalida ,"w");
fputs($punt,$cabecera);
require_once('conexion.php');
require_once('conexionct.php');
$busqueda = mysql_query("SELECT a.*, b.NOMBRELOC, c.NOMBRECT, d.NOMBRE_DIR, d.PUESTO, d.FIRMA from asoc.integrantes a, asoc.a_itba b, ctba.a_ctba c, asoc.firma_constancias d where a.CCT = '".$_COOKIE["clavecct"]."' and b.MUNICIPIO = a.NMPIO AND b.LOCALIDAD = '0000' AND a.CTIPOASOC = 'APF' and a.CPUESTO = 'PR' AND c.CLAVECCT = '".$_COOKIE["clavecct"]."'");
$row = mysql_fetch_array($busqueda);
//mysql_select_db("tu_db",$link);
//$result=mysql_query($sql,$link);
while($row=mysql_fetch_array($busqueda)){
$despues=$cuerpo;
foreach($matequivalencias as $dato){
$datosql=$row[$dato[1]];
$datosql=stripslashes($datosql);
$datortf=$dato[0];
$despues=str_replace($datortf,$datosql,$despues);
}
fputs($punt,$despues);
$saltopag="par page par";
fputs($punt,$saltopag);
}
fputs($punt,"}");
fclose($punt);
return $fsalida;
}
$plantilla="plantilla.rtf";
//$sql = "SELECT a.*, b.NOMBRELOC, c.NOMBRECT, d.NOMBRE_DIR, d.PUESTO, d.FIRMA from asoc.integrantes a, asoc.a_itba b, ctba.a_ctba c, asoc.firma_constancias d where a.CCT = '".$_COOKIE["clavecct"]."' and b.MUNICIPIO = a.NMPIO AND b.LOCALIDAD = '0000' AND a.CTIPOASOC = 'APF' and a.CPUESTO = 'PR' AND c.CLAVECCT = '".$_COOKIE["clavecct"]."'";
$equivalencias[0][0]="#*NOMBREPR*#";
$equivalencias[0][1]="CNOMBRE";
$equivalencias[1][0]="#*NOMBRECCT*#";
$equivalencias[1][1]="NOMBRECCT";
$equivalencias[2][0]="#*MUNICIPIO*#";
$equivalencias[2][1]="NOMBRELOC";
$equivalencias[3][0]="#*CLAVECCT*#";
$equivalencias[3][1]="CCT";
$equivalencias[4][0]="#*CLAVEASOC*#";
$equivalencias[4][1]="CCLAVEASOC";
$salida=rtf($plantilla,"certificado.rtf",$equivalencia);
$salida="<A href='$salida'>Obtener</A>";
echo("<p>$salida</p>");
?>
muy bueno el articulo, yo realice lo mismo pero para una base de datos postgresql, ademas cambie algunos valores al principio para iniciar las variables.
function leef($fichero)
{
$texto=file($fichero);
$tamleef=0;
$tamleef=$tamleef+sizeof($texto);
//$tamleef sizeof($texto);
for($n=0 ; $n < $tamleef ;$n++)
{
$todo=$todo.$texto[$n];
}
return $todo;
}
hola,
Yo tengo un problema que se ha planteado más arriba: insertar una imagen en el documento final RTF (una imagen que se encuentra en la bdd y es distinta para cada usuario).
He probado de mil maneras pero no he podido conseguirlo.
Alguien sabe cómo hacerlo?
tan puro gueviando,, HAY UNA FORMA MAS FACIL
hola amigos estoy formando una pagina pero quiero q un archivo en word ponerlo en mi pagina para q lo revisen y me den una respuesta del documento gracais si alguien me puede ayudar
hola amigos en mi pagina quiero poner archivos en word para q lo revise otro usuario y me envie una respuesta del documento como un comentario pero automaticamante se almacene en mi base de datos; la base de datos es solicitudes y los campos son aceptada o rechazada dependiendo de la respuesta de usuario por favor si alguien me pùede ayudar
Amigos me sale esto "sectd\par \page \par}" en el word!!!!!!alguien me puede ayudar porfavor????? Gracias
bueno amigo mio es muy interesante tu aporte sobre el tema q trata , pero seria recomentable que no pegaras las images ya que es dificil trasquibir ya que se pueden producir errores . seria recomendable q siempre trabajas textos si es posible o mejor aun si tenez el .zip para bajarlo seria famuloso de ante mando gracias por tu aporte.
15/1/09
Por: Juan Carlos HinojosaAlguien conoce en un libro que se exponga el tema con mayor detalle
14/4/09
pueden ayudarmePor: almahola el articulo esta muy padre,probe el codigo y funciona de maravilla pero solo desde mi servidor local,bueno quiero decir que funciona con un direccionamiento de este tipo:c://......., pero ya con direccion como http://...., ya no me funciona, es posible direccionarlo de esta forma???
29/4/09
LA SOLUCION a esto!Por: Mister_FSaludos, amigos despues de tanto luchar he logrado conseguir que funcione una plantilla con logotipo, tablas, etc en RTF, no precisamente con esta funcion aqui colocada sino con este codigo:
<?PHP
// Se Lee la plantilla
$plantilla = file_get_contents('nombre_de_tu_plantilla.rtf');
// Agregamos los escapes necesarios, LO MISMO DE SIEMPRE
$plantilla = addslashes($plantilla);
$plantilla = str_replace('
','\r',$plantilla);
$plantilla = str_replace(' ','\t',$plantilla);
// Se Procesa la plantilla, AQUI ES DONDE SE HACE EL TRUCO!!
eval( '$rtf = <<<EOF_RTF
' . $plantilla . '
EOF_RTF;
' );
//simplemente le doy un nombre, sin la extension
$NombreFormato='Lo_ke_yo_kiera';
// Guarda el RTF generado, el nombre del RTF
file_put_contents("$NombreFormato.rtf",$rtf);
?>
Lo que hay que hacer es la plantilla en WORDPAD!, no en Word. y los campos que quieren que aparezcan cambiados solo colocarles el simbolo pesos ($) adelante, por ejemplo $mivariable, y ya esta.
Tengo ejemplos reales en la aplicacion comercial que estoy generando para manejo logistico, Cualquier duda con mucho gusto a mi correo.
29/6/09
No se por k tanto codigoPor: alexander casas ravelloNo entiendo realmente por q' tanto codigo pero bueno...
les voy a pasar mi codigo ok para generar archivos de word okix
//usare su funcion para leer archivos ok
function leer($fichero){
$todo="";
$texto=file("documento/".$fichero);
$tamleef=sizeof($texto);
for ($n=0;$n<$tamleef;$n++)
{
$todo=$todo.$texto[$n];
}
return $todo;
}
function generar_carta_compromiso($id,$modalidad){
//obtengo los datos de la bd
$datos=$this->db->get_where("cliente",array('id_cliente' => $id));
//lleno el array con las variables recogidas por la bd
foreach($datos->result() as $row) :
$arr = array(
"#*apellido_paterno*#" => strtoupper($row->apellido_paterno),
"#*apellido_materno*#" => strtoupper($row->apellido_materno),
"#*nombres*#" => strtoupper($row->nombres),
"#*dni*#" => strtoupper($row->dni),
"#*modalidad*#" =>$modalidad,
"#*direccion_obra*#"=>strtoupper($row->obra_direccion),
"#*distrito_obra*#"=>strtoupper($row->obra_distrito)
);
endforeach;
//cargo el archivo rtf y le paso los valores ... P.D.: chekeen la funcion strtr toy algo cansadito xD
$salida=strtr($this->leer("carta_compromiso.rtf"),$arr);
//creo los encabezados de word y le doy el nombre de mi archivo por si aka estoy imprimiendo el nombre de mi cliente para k se guarde el doc ok
header ("Content-type: application/msword");
header("Content-Disposition: inline; filename=carta_compromiso_".strtoupper($row->apellido_paterno)."_".strtoupper($row->apellido_materno)."_".strtoupper($row->nombres).".doc");
echo "$salida";
}
espero les haya servido, me gusta simplificar codigos ok me sirvio mucho este graxiax, bueno bye k uno debe programar como si tu jefe fuera un ogro jajaja
07/7/09
del codigo de alexander casas ravelloPor: MarcoMe parece mmuy bueno tu código , pero no lo he podido echar andar, lo copie y remplze mis datos y al ejecutarlo no me hace nada :( , soy un novato en PHP, pero no le he encontrado, espero me puedas ayudar. Saludos
27/7/09
oigan un punto como es para varios datos de la basePor: AVALONesto es algo que me gustaria saber, aver si me doy a entender:
tengo una tabla que tiene varios datos de un paciento esto es resultado de lab 1, lab 2 y lab 3, que estan relacionados con este paciente, y el formato tiene unas tablas como poner estos datos dentro de la tabla dado que este formateador de rtf solo lo hace con datos especificos y necesito repetirlo solo en una tabla........ no repetir las hojas...
17/8/09
foreach me da errorPor: dJ KIREen la linea de el forech me da un error invalid argument me podrian ayudar!!!
01/10/09
Generar docx con PHPPor: eduardoEsta herramienta permite generar sofisticados documentos de word (texto, gráficas, cabeceras,...) mediante PHP. http://www.phpdocx.com