Exportar Mysql a Excel usando PHP

http://www.josecriado.com/wp-content/uploads/2008/09/excel-mysql.gifMuchos de nosotros hemos tenido la necesidad de exportar nuestros datos de la base de datos Mysql a una tabla de Excel, ya sea por pedido del cliente, por practica o por ocio.

En mi caso fue porque el cliente asi requirio los datos y tuve que hecharme un clavado en mis codigos de programacion que ya tenia, lo que no me acuerdo es de quien es el codigo, pero como sea, los creditos son de quien lo hizo, dejo posteado el codigo fuente y una breve descripcion de lo que hace el mismo para quienes les sirva.

La funcion principal de este codigo es exportar como el titulo lo dice.... exportar una base de datos de Mysql a traves de php, pero la salida sera una hoja de calculo excel, siendo que cada tabla nos sera una pestania diferente, volcando todo el contenido que haya en la base.

Y el codigo dice:

 

<?PHP
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//coloco las cabeceras para que la salida de la página sea en excel
header('Content-type: application/x-msdownload');
header('Content-Disposition: attachment; filename="'.$_POST['base'].date("d-m-Y").'.xls"');  //esto me dara el nombre.xls que quiera poner
header('Pragma: no-cache');
header('Expires: 0');

$connection = mysql_connect("localhost","root"," "); //conexion localhost, esto es como cada quien lo tenga configurado

$base='mi_base_de_datos';

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//creo un array con los nombres de las tablas de la base de datos

$result = mysql_list_tables("$base");
$num_rows = mysql_num_rows($result);
$num_rows = $num_rows -1;

for ($i = 0; $i < $num_rows; $i++) {
   $array_tablas[$i]= mysql_tablename($result, $i);
}


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//creo un array asociativo con el nombre de la tabla y sus campos asociados

foreach($array_tablas as $indice => $valor)
{
    $sql="SHOW COLUMNS FROM $valor";
    $result = mysql_query($sql);
    $i=0;
    while($o=mysql_fetch_object($result)){
        $fields[$i]=$o->Field;
       
        $i++;
    }
    $array_fields[$valor]=$fields;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//creo la consulta a la base de datos de cada tabla para obtener los datos y la vez genero el fichero excel
//empiezo con las cabeceras necesarias para el fichero excel
$header="";
$header.="<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>";
$header.="<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"
                         xmlns:o=\"urn:schemas-microsoft-com:office:office\"
                         xmlns:x=\"urn:schemas-microsoft-com:office:excel\"
                         xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"
                         xmlns:html=\"http://www.w3.org/TR/REC-html40\">";

$header.="<OfficeDocumentSettings xmlns=\"urn:schemas-microsoft-com:office:office\">
                      <DownloadComponents/>
                     </OfficeDocumentSettings>";
$header.="<ExcelWorkbook xmlns=\"urn:schemas-microsoft-com:office:excel\">
                      <WindowHeight>13170</WindowHeight>
                      <WindowWidth>18780</WindowWidth>
                      <WindowTopX>240</WindowTopX>
                      <WindowTopY>45</WindowTopY>
                      <ProtectStructure>False</ProtectStructure>
                      <ProtectWindows>False</ProtectWindows>
                     </ExcelWorkbook>";
$header.="<Styles>
  <Style ss:ID=\"Default\" ss:Name=\"Normal\">
   <Alignment ss:Vertical=\"Bottom\"/>
   <Borders/>
   <Font/>
   <Interior/>
   <NumberFormat/>
   <Protection/>
  </Style>
  <Style ss:ID=\"s21\">
   <Alignment ss:Horizontal=\"Center\" ss:Vertical=\"Bottom\"/>
   <Font x:Family=\"Swiss\" ss:Bold=\"1\"/>
  </Style>
  <Style ss:ID=\"s22\">
   <Alignment ss:Vertical=\"Bottom\" ss:Horizontal=\"Center\" ss:WrapText=\"1\"/>
   <Font ss:Color=\"#0000FF\"/>
  </Style>
 </Styles>";
                    

//hasta aqui las cabeceras                    
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////                   
foreach($array_fields as $indice => $valor)
{
    //consulta mysql a la base de datos
    $query="SELECT * FROM $indice";
    $result=mysql_query($query);
    $num_lineas=mysql_num_rows($result)+1;//para obtener el numero de filas para crear un documento mas optimo
    $control=mysql_fetch_object($result);
    //cabeceras generales para cada hoja del libro excel
    $header.="<Worksheet ss:Name=\"".strtoupper($indice)."\">\n";
    $header.="<Table ss:ExpandedColumnCount=\"".count($valor)."\" ss:ExpandedRowCount=\"".$num_lineas."\"  ss:DefaultColumnWidth=\"100\">\n";
  
    for($i=1;$i<=count($valor);$i++)
    {
        $header.="<Column ss:AutoFitWidth=\"0\" ss:Width=\"179\"/>\n";
    }

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    $header.="<Row ss:Index=\"1\" ss:StyleID=\"s21\">\n";
    for ($i=0;$i<count($valor);$i++)
    {
        $header.="<Cell><Data ss:Type=\"String\">".strtoupper($valor[$i])."</Data></Cell>\n";
    }
    $header.="</Row>\n";
    while($control)
    {
    $header.="<Row>\n";
    $h=0;
    for($i=1;$i<=count($valor);$i++)
    {
        $header.="<Cell ss:StyleID=\"s22\" ss:Index=\"".$i."\"><Data ss:Type=\"String\"><![CDATA[".$control -> $valor[$h]."]]></Data></Cell>\n";
       
        $h++;
    }
    $header.="</Row>\n";
   
    $control=mysql_fetch_object($result);
   
    }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//esto cierra cada hoja del libro de excel   
    $header.="</Table>\n";
    $header.="</Worksheet>\n";
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//aqui lo necesario para cerrar el libro excel
$header.="</Workbook>";


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//imprimo el fichero

print "$header";

?>

Back to Top