APORTE -- exportar a diferentes formatos desde symfony2 (xls,csv,json.xml)

292 views
Skip to first unread message

Vladimir Moran

unread,
Dec 22, 2015, 3:05:28 PM12/22/15
to symfony-es
hola amigos este es un ejemplo que se puede utilizar para exportar los datos de una entidad en diferentes formatos
// recuerda cambiar los datos de tu $query para consultar tu entidad.

en nuestro controlador crearemos nuestra ruta exportar2 así:

 /**
     * @Route("/exportar2/{_format}", defaults={"_format"="csv"}, requirements={"_format"="csv|xls|xml|json"}, name="area_exportar2")
     * @Template()
     */
    
    public function exportarAction(Request $request) {
        // realizamos la consulta a la entidad
        $em = $this->getDoctrine()->getManager();
        // ordenamos los resultados en forma ascendente
        $query = $em->createQuery("SELECT a.id,trim(a.nombrearea) nombrearea,a.estado FROM AdminBundle:CtlAreas a ORDER BY a.nombrearea");
        $data = $query->getResult();
        // obtenemos el formato indicado en la url
        $format = $request->getRequestFormat();

        // asignamos el nombre del archivo según el formato indicado
        $filename = "area_listado_" . date("Y_m_d") . "." . $format;
        
        // verificamos la extensión segun la ruta indicada a traves de la url
        if ($format == "json") {
            $response = new Response;
            $response->setContent(json_encode($data));
            $response = $this->render(':CtlAreas:area_json.html.twig', array('entities' => $data));
            $response->headers->set('Content-Type', 'application/json; charset=us-ascii');
            $response->headers->set('Content-Disposition', 'attachment; filename=' . $filename);
            $response->headers->set('Pragma', 'public');
            $response->headers->set('Cache-Control', 'maxage=1');
            return $response;
        } else if ($format == "csv") {
            $response = $this->render(':CtlAreas:area_csv.html.twig', array('entities' => $data));
            $response->headers->set('Content-Type', 'text/plain; charset=utf-8');
            $response->headers->set('Content-Disposition', 'attachment; filename=' . $filename);
            $response->headers->set('Pragma', 'public');
            $response->headers->set('Cache-Control', 'maxage=1');
            return $response;
        } else if ($format == "xls") {
            $response = $this->render(':CtlAreas:area_xls.html.twig', array('entities' => $data));
            $response->headers->set('Content-Type', 'text/vnd.ms-excel; charset=utf-8');
            $response->headers->set('Content-Disposition', 'attachment; filename=' . $filename);
            $response->headers->set('Pragma', 'public');
            $response->headers->set('Cache-Control', 'maxage=1');
            return $response;
        } else if ($format == "xml") {
            $response = $this->render(':CtlAreas:area_xml.html.twig', array('entities' => $data));
            $response->headers->set('Content-Type', 'application/xml; charset=utf-8');
            $response->headers->set('Content-Disposition', 'attachment; filename=' . $filename);
            $response->headers->set('Pragma', 'public');
            $response->headers->set('Cache-Control', 'maxage=1');
            return $response;
        }
    }


Solo tendrían que crearse las respectivas plantillas twig.
area_json.html.twig
area_csv.html.twig
area_xls.html.twig
area_xml.html.twig

lo publico para quien necesite realizar algún tipo de exportación ó si pueden otros compañeros aportar otras ideas para mejorar este código y compartirlo con el resto del grupo.

Gonzalo Alonso

unread,
Dec 23, 2015, 6:11:29 AM12/23/15
to symfony-es
Buenas

En mi bundle: https://github.com/MWSimple/AdminCrudBundle
Arme la funcion y utilizo el Exporter de Sonata para hacerlo.

Saludos!

Fercho McFly

unread,
Dec 26, 2015, 8:44:15 PM12/26/15
to symfony-es
Excelentes aportes !! GRACIAS !!

reyn...@gmail.com

unread,
Dec 26, 2015, 9:27:01 PM12/26/15
to symfo...@googlegroups.com
@Gonzalo, llevo dias probando EasyAdmin y SonataAdmin, ambos dos son muy buenos aunque aun les falta mucho a mi modo de ver (hablando de los tiempos del Admin Generator de SF1.4), que tiene tu bundle diferente a estos dos? Tienes pensado actualizarlo para que soporte Symfony 2.8+? Si es asi me gustaria ayudar ;) Tienes algun ejemplo? (Puede ser un bundle al estilo de easy-admin-demo o ejemplo en linea) no se alguna documentacion con imagenes o algo que mostrar mas que un repo y el README?

PD: Te envie una solicitud por Hangouts ;)

@Fercho, disculpas por secuestrar el hilo pero me parece interesante este bundle

Saludos a ambos

--
--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Google Groups.
Para publicar en este grupo, envía un email a symfo...@googlegroups.com
Para darte de baja, envía un email a symfony-es+...@googlegroups.com
El resto de opciones puedes encontrarlas en http://groups.google.com/group/symfony-es?hl=es

---
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a symfony-es+...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Marcelo Prizmic

unread,
Dec 28, 2015, 12:24:10 PM12/28/15
to symfo...@googlegroups.com
me sumo a la pregunta de

reyn...@gmail.com


marcelo

Gonzalo Alonso

unread,
Dec 29, 2015, 6:17:28 AM12/29/15
to symfony-es
Buenas

https://github.com/MWSimple/AdminCrudBundle No es un Generator de SF 1.4 ni parecido. Basicamente extiende a http://symfony.com/doc/current/bundles/SensioGeneratorBundle/commands/generate_doctrine_crud.html la idea surgio de https://github.com/jordillonch/CrudGeneratorBundle y la principal diferencia es que existe una clase base de la cual se extiende al generar el crud y es posible modificarla de manera simple a diferencia de generar 20 CRUD por separados y luego estar modificando codigo en cada uno, a su vez fue creciendo y ahora tiene una config en yml para facilitar un poco y tambien algunos helpers en los formularios. Eso es todo lo llevo manteniendo hace un buen tiempo. Estaria bueno se sumen quizas le falta muchas cosas y una limitacion es que solo funciona con annotations porque es lo que utilizo y cuando lo fui "desarrollando" solo segui ese camino.

Cualquier ayuda para mejorar es bienvenida. Saludos!!!!
Reply all
Reply to author
Forward
0 new messages