entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

php tablas dinamica

Buenos días chicos

Estoy intentando (sin exito) generar un archivo word desde una página php con un formato determinado.
El problema son las columnas y las filas que no se como tratarlos. ¿ Alguien me podría orientar ?

Este es el código que uso para generar el archivo word

<?php
$debug= true;
if($debug){
//ini_set('display_errors', 1);
//ini_set('display_startup_errors', 1);
//error_reporting(E_ALL);
}
include "../core/autoload.php";
include "../core/modules/index/model/SellData.php";
include "../core/modules/index/model/ClientData.php";
include "../core/modules/index/model/CamisaData.php";

$sell = SellData::getById($_GET["sell_id"]);
$client = $sell->getClient();
$traje = CamisaData::getById($_GET["id"]);

require_once '../PhpWord/Autoloader.php';
use PhpOffice\PhpWord\Autoloader;
use PhpOffice\PhpWord\Settings;

Autoloader::register();

$word = new  PhpOffice\PhpWord\PhpWord();

$section1 = $word->AddSection();
$section1->addText("Detalles del pedido",array("size"=>22,"bold"=>true,"align"=>"right"));

$styleTable = array('borderSize' => 6, 'borderColor' => '888888', 'cellMargin' => 40);
$styleFirstRow = array('borderBottomColor' => '0000FF', 'bgColor' => 'AAAAAA');
$tienda ="";
if($sell->tienda_id==1){ $tienda = "Sprezzatura";}
else if($sell->tienda_id==2){ $tienda = "Gentleman";}
$table1 = $section1->addTable("table1");
$table1->addRow();
$table1->addCell()->addText("Nombre");
$table1->addCell()->addText("Telefono");
$table1->addCell()->addText("Tienda");
$table1->addCell()->addText("Fecha");
//foreach($clients as $client){
$table1->addRow();
$table1->addCell(5000)->addText($client->nombre);
$table1->addCell(2000)->addText($client->telefono);
$table1->addCell(2000)->addText($tienda);
$table1->addCell(2000)->addText(date("d-M-y"));
//}

$tela_data = array(
  array("name"=>"camisa","label"=>"Camisa : "),
  array("name"=>"cuello_camisa","label"=>"Cuello : "),
  array("name"=>"collar","label"=>"Collar : "),
  array("name"=>"punio_camisa","label"=>"Puño :"),
  array("name"=>"tapa","label"=>"Tapa : "),
  array("name"=>"ojales","label"=>"Ojales : "),
  array("name"=>"botones","label"=>"Botones : ")
  );

$estilo_data = array(
  array("name"=>"es_cuello","label"=>"Cuello : "),
  array("name"=>"es_punio","label"=>"Puño : "),
  array("name"=>"es_bolsillo","label"=>"Bolsillo:"),
  array("name"=>"es_espalda","label"=>"Espalda:"),
  array("name"=>"es_tapa","label"=>"Tapa : "),
  array("name"=>"es_acabado","label"=>"Acabado:"),
  array("name"=>"es_iniciales","label"=>"Iniciales")
  );

$medidas_data = array(
  array("name"=>"me_cuello","label"=>"Cuello"),
  array("name"=>"me_largo","label"=>"Largo"),
  array("name"=>"me_hombros","label"=>"hombros"),
  array("name"=>"me_pecho","label"=>"Pecho"),
  array("name"=>"me_cintura","label"=>"Cintura"),
  array("name"=>"me_cadera","label"=>"Cadera"),
  array("name"=>"me_ancho_brazo","label"=>"Ancho Brazo"),
  array("name"=>"me_largo_brazo","label"=>"Largo Brazo"),
  array("name"=>"me_munieca","label"=>"Muñeca"),
   array("name"=>"co_altura","label"=>"Altura"),
  array("name"=>"co_observaciones","label"=>"Observaciones")

);

$complexion_data = array(
  array("name"=>"co_altura","label"=>"Altura"),
  array("name"=>"co_observaciones","label"=>"Observaciones")
  );

$section1->addText("Camisa",array("size"=>20,"bold"=>true,"align"=>"right"));

$table1 = $section1->addTable("table1");
$table1->addRow();
$medidas1 = $table1->addCell();
$estilos1 = $table1->addCell();
$medidas1->addText("TELA");
$estilos1->addText("ESTILO");
//foreach($clients as $client){
$table2 = $medidas1->addTable("table2");
foreach($tela_data as $td){
$table2->addRow();
$table2->addCell(7000)->addText($td["label"]);
$table2->addCell(7000)->addText($traje->{$td["name"]});
}
$table3 = $estilos1->addTable("table3");
foreach($estilo_data as $td){
$table3->addRow();
$table3->addCell(7000)->addText($td["label"]);
$table3->addCell(7000)->addText($traje->{$td["name"]});
}

$table1 = $section1->addTable("table1");
$table1->addRow();
$medidas1 = $table1->addCell();
$medidas1->addText("MEDIDAS");
//foreach($clients as $client){
$table2 = $medidas1->addTable("table2");
//  ultimo cambio foreach($complexion_data as $td){
foreach($medidas_data as $td){

$table2->addRow();
$table2->addCell(7000)->addText($td["label"]);
$table2->addCell(7000)->addText($traje->{$td["name"]});
}

$word->addTableStyle('table1', $styleTable,$styleFirstRow);
/// datos bancarios

$filename = "camisa-".time().".docx";
#$word->setReadDataOnly(true);
$word->save($filename,"Word2007");
//chmod($filename,0444);
header("Content-Disposition: attachment; filename='$filename'");
readfile($filename); // or echo file_get_contents($filename);
unlink($filename);  // remove temp file

?>

Este código genera el documento de la izquierda ( de la foto) y me gustaría tener el documento de la derecha
Adjunto imagen

http://pruebagonzalo.org.es/entredesarrolladores/formato.jpg

1voto

Peter comentado

Por favor añade el código del resultado que te da. ¿Te da el código completo pero sin estilo?

Saludos.

1voto

gonzalss comentado

Peter , el resultado es el archivo que muestro a la izquierda

http://pruebagonzalo.org.es/entredesarrolladores/formato.jpg

y el archivo "correcto" sería el que está a la derecha . con sus filas y columnas

1voto

Peter comentado

Si, pero que código te sale de resultado?

Si el código te sale completo, al parecer es cuestión de darle estilo con CSS para que se vea como quieres, entonces... ¿Como es tu código de resultado?

Saludos.

1 Respuesta

3votos

carlossevi Puntos63580

¿Entiendes el código o estás intentando apañarlo sin terminar de comprenderlo? Lo pregunto sin malicia pero es que el documento de la derecha de la imagen que adjuntas tiene una estructura en las tablas muy diferente a la que crea tu código y se ve a la izquierda.

Hay muchas cosas "incorrectas", pero el principal problema lo tienes en estos dos bucles:

foreach($estilo_data as $td){
    $table3->addRow();
    $table3->addCell(7000)->addText($td["label"]);
    $table3->addCell(7000)->addText($traje->{$td["name"]});
}
foreach($medidas_data as $td){
    $table2->addRow();
    $table2->addCell(7000)->addText($td["label"]);
    $table2->addCell(7000)->addText($traje->{$td["name"]});
}

Si creas una fila nueva cada dos celdas, pues lógicamente se genera lo que tienes a la izquierda.

Un pequeño ejemplo que soluciona el primer bucle podría ser:

// Recorrer el array de estilos para pintar cabecera:
foreach($estilo_data as $td){   
    $table3->addCell(7000)->addText($td["label"]);
}
// Cambiar de fila:
$table3->addRow();
// Recorrer el array de estilos para pintar los datos:
foreach($estilo_data as $td){   
    $table3->addCell(7000)->addText($traje->{$td["name"]});
}

Mira a ver si eso te ayuda y una vez tengas solucionada una de las tablas el resto serán iguales con otros datos.

1voto

gonzalss comentado

No me funcionó, necesito que me quedé el formato correcto .
¿ Sabríais decirme quien me podría realizar ese trabajo de forma remunerada ? Generar un archivo word con un formato específico ?

2votos

carlossevi comentado

Mi respuesta no trataba de solucionarte todo sino de hacerte ver un ejemplo de algo que estaba mal en tu código, ayudarte a ver el error y solucionarlo por ti mismo.

Respecto al ofrecimiento, en esta página preguntamos y respondemos cuestiones relacionadas con la programación. Quizá a @Peter le interese hacer un spin-off de esta página sobre minijobs de programación =)

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta