En fin, la cosa es que solo necesitaba exportar datos a una tabla de exel sin formato ni nada por el estilo, solo la información, me pareció un despropósito usar librerías pesadas para un fin tan trivial así que arme mi propia solución.
De seguro este es un problema tan recurrente para muchos que lo comparto para quien le interese.
datatocsv.php
Código PHP:
Ver original
<?php class DataToCsv { private $out = null; public function __construct($name) { } public function __destruct() { } public function addRow($row) { } public function addData($data) { foreach($data as $row) $this->addRow($row); } public function addQuery($mysqli, $query, $params = null, $header = true) { if(!($stmt = $mysqli->prepare($query))) throw new Exception("Error preparando la sentencia."); if($params) { $bind_params = [""]; foreach($params as &$param) { case "integer": case "boolean": $bind_params[0] .= "i"; break; case "double" : $bind_params[0] .= "d"; break; case "blob" : $bind_params[0] .= "b"; break; default : $bind_params[0] .= "s"; break; } $bind_params[] = &$param; } throw new Exception("Error enlazando parametros."); } if(!$stmt->execute()) throw new Exception("Error ejecutando la sentencia."); // With Mysqlnd. if($data = $stmt->get_result()) { if ($header) { $row = $data->fetch_array(MYSQLI_ASSOC); $this->addRow($row); } while($row = $data->fetch_array(MYSQLI_NUM)) $this->addRow($row); } } else { // Without Mysqlnd $stmt->store_result(); $meta = $stmt->result_metadata(); if($meta) { $row = []; $vars = []; while($field = $meta->fetch_field()) { $row[$field->name] = null; $vars[] = &$row[$field->name]; } if ($header) while($stmt->fetch()) $this->addRow($row); } } } }
ejemplo1.php: Volumen de datos pequeño y de contenido estático:
Código PHP:
Ver original
<?php require("datatocsv.php"); $data = [ [1, 2, 3, 4, 5, 6], ["a", "b", "c", "d", "e", "f"], [1, 2, 3, 4, 5, 6], ["a", "b", "c", "d", "e", "f"], [1, 2, 3, 4, 5, 6], ["a", "b", "c", "d", "e", "f"], [1, 2, 3, 4, 5, 6] ]; $export = new DataToCsv("datosfijos"); // Nombre del archivo a descargar sin la extensión $export->addData($data);
ejemplo2.php: Volumen de datos grande y de contenido dinamico:
Código PHP:
Ver original
<?php require("datatocsv.php"); $mysqli = new mysqli("localhost", "root", "", "test"); if ($mysqli->connect_errno) { } $export = new DataToCsv("datosmysql"); // Nombre del archivo a descargar sin la extensión $export->addQuery($mysqli, "SELECT * FROM test WHERE codigo != ?", [9]);
addRow agrega una fila a la tabla, recibe como parámetro un único array y cada elemento es una columna. ignora las claves.
addData agrega una tabla completa, recibe como parámetro un array de dos dimensiones, donde cada elemento del array principal es un array que representa a una fila, y cada elemento de esa fila es una columna. ignora las claves.
addQuery recibe como primer parametro una conexion establecida con mysql, como segundo parametro una query en formato string, como tercer parametro un array con los parametros necesarios para esa query y como cuarto parametro un valor booleano (por defecto true) que indica si se deben mostrar los nombres de las columnas devueltos por la query. Genera una tabla con el conjunto de resultados devuelto por la query. no es necesario escapar los parámetros antes de llamar a esta función. funciona correctamente con mysqlnd y con el driver propietario.
Espero a alguien le sea de ayuda. Si solo se quiere trabajar con datos estaticos o bien no le gusta la idea de tener un menejo de la conexion con la base de datos (cosa razonable en algunos contextos) puede eliminar sin problemas el metodo addQuery y solo quedan las 25 lineas de los otros dos métodos.