You are on page 1of 9

PHPExcel: Exportar e importar archivos

ods, xls y xlsx


En PHP tenemos una clase que nos da utilidades para trabajar con hojas de clculo,
PHPExcel. Ya habamos hablado antes sobre cmo trabajar con PHP y archivos CSV, pero
con esta librera podemos trabajar directamente con archivos de hoja de clculo. Nos
permite generar documentos xls, xlsx, ods, pdf formatear las celdas, aplicar frmulas,
validar datos e importar hojas de clculo.
Si descargis el proyecto desde GitHub os econtraris con un montn de ejemplos sobre
cmo llevar a cabo distintas acciones, aqu vamos a recoger slo uno, el ms bsico de
creacin de un archivo, traduciendo al castellano los comentarios:
1 error_reporting(E_ALL);
2 ini_set('display_errors', TRUE);
TRUE);
3 ini_set('display_startup_errors',
date_default_timezone_set('Europe/London');
4
5 define('EOL',(PHP_SAPI == 'cli') ? PHP_EOL : '<br />');
6
7 /** Cargamos la librera PHPExcel */
8 require_once '../Build/PHPExcel.phar';
9
10
11// Creamos un objeto PHPExcel
echo date('H:i:s') , " Create new PHPExcel object" , EOL;
12$objPHPExcel = new PHPExcel();
13
14// Definimos las propiedades del documento
15echo date('H:i:s') , " Set document properties" , EOL;
16$objPHPExcel->getProperties()->setCreator("Creador")
17->setLastModifiedBy("Creador")
->setTitle("PHPExcel Test Document")
18->setSubject("PHPExcel Test Document")
19->setDescription("Documento de Excel creado por clases PHP.")
20->setKeywords("office PHPExcel php")
21->setCategory("Resultado de la prueba");
22
23
// Aadimos datos
24echo date('H:i:s') , " Add some data" , EOL;
25$objPHPExcel->setActiveSheetIndex(0)
26->setCellValue('A1', 'Hello')
27->setCellValue('B2', 'world!')
28->setCellValue('C1', 'Hello')
->setCellValue('D2', 'world!');
29
30// Comprobamos que la codificacin UTF-8 vaya bien
31$objPHPExcel->setActiveSheetIndex(0)
32->setCellValue('A4', 'Miscellaneous glyphs')

33->setCellValue('A5', '');
34
35// Renombrar la hoja de trabajo
echo date('H:i:s') , " Rename worksheet" , EOL;
36$objPHPExcel->getActiveSheet()->setTitle('Simple');
37
38
39// Definimos la hoja de clculo activa
40$objPHPExcel->setActiveSheetIndex(0);
41
42
43// Escribimos el resultado en una hoja de Excel 2007 (xlsx)
date('H:i:s') , " Write to Excel2007 format" , EOL;
44echo
$callStartTime = microtime(true);
45
46$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel,
47'Excel2007');
48$objWriter->save(str_replace('.php', '.xlsx', __FILE__));
49$callEndTime = microtime(true);
$callTime = $callEndTime - $callStartTime;
50
51echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx',
52pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL;
53echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , "
54seconds" , EOL;
55
Ahora salvamos los datos en Excel clsico
56//
echo date('H:i:s') , " Write to Excel5 format" , EOL;
57$callStartTime = microtime(true);
58
59$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
60$objWriter->save(str_replace('.php', '.xls', __FILE__));
61$callEndTime = microtime(true);
$callTime = $callEndTime - $callStartTime;
62
63echo date('H:i:s') , " File written to " , str_replace('.php', '.xls',
64pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL;
65echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , "
66seconds" , EOL;
67
68// Imprimimos en pantalla que se ha finalizado el trabajo.
echo date('H:i:s') , " Done writing files" , EOL;
69echo 'Files have been created in ' , getcwd() , EOL;
70
71
72
73
74
75

Como ya he dicho antes, la documentacin incluye un montn de ejemplos, casi 40, as que
podris sacar de ah mucha ayuda. Con esta librera podrs complacer a los clientes que
exigen sacar los resultados de las consultas directamente a hojas de clculo, por ejemplo.

Importar y exportar datos en excel utilizando PHPExcel


PHPExcel es una librera php que ayuda a leer y escribir hojas de clculo en diversos tipos de formatos, por lo que
podremos trabajar prcticamente con todas las versiones de Excel que haya. Los formatos que acepta esta librera son:
Datos de entradas

Excel 2007 (SpreadsheetML)


BIFF5 (Excel 5.0 / Excel 95)
BIFF8 (Excel 97 and later)
PHPExcel Serialized Spreadsheet
Symbolic Link (SYLK by Microsoft)
CSV (Comma Separated Values)

Datos de salida

Excel 2007 (SpreadsheetML)


BIFF8 (Excel 97 and later)
PHPExcel Serialized Spreadsheet
PDF
HTML
CSV (Comma Separated Values)

Para poder empezar a utilizar PHPExcel, debe de asegurarse que la versin de php de su servidor es 5.2 o superior.
Descargue los ficheros de la librera y ya los tiene listo para utilizar en sus proyectos.
Crear una hoja de clculo
El crear una hoja de clculo es una tarea sencilla como vamos a ver a continuacin. Lo primero que vamos a realizar es la
creacin del objeto PHPExcel con el que vamos a trabajar, y le vamos a meter metadatos como el ttulo, ltima
modificacin.... pero que no son datos de las celdas, esto lo haremos un poco ms adelante. El cdigo correspondiente a
esto es el siguiente.

require_once 'PHPExcel.php';
$objPHPExcel = new PHPExcel();
// Set properties
$objPHPExcel->getProperties()->setCreator("ThinkPHP")
->setLastModifiedBy("Daniel Schlichtholz")
->setTitle("Office 2007 XLSX Test Document")
->setSubject("Office 2007 XLSX Test Document")
->setDescription("Test doc for Office 2007 XLSX, generated by PHPExcel.")
->setKeywords("office 2007 openxml php")
->setCategory("Test result file");
$objPHPExcel->getActiveSheet()->setTitle('Minimalistic demo');
Como hemos comentado, con el texto anterior no se meten datos en las celdas. Para meter datos hay que indicar la
coordenada donde debe de ir los datos que pongamos. Un ejemplo es el cdigo siguiente:

$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A1', 'Hello')

->setCellValue('B1', 'world!');
Esta forma de trabajar no es muy til cuando se tienen muchos datos, pero esta librera nos proporciona una funcin para
indicarle las coordenadas y los datos para que l se encargue de introducir los datos. Un ejemplo de uso sera el siguiente:

setCellValueByColumnAndRow($column, $row, $value)


Por ltimo solo queda escribir el fichero en el disco duro. Para ello hay que crear un objeto PHPExcel_IOFactory, donde
se le indica el objeto PHPExcel y un sengundo parmetro donde se le indica el tipo de archivo que se crea. Ejemplo de
esto sera el cdigo siguiente:

require_once 'PHPExcel/IOFactory.php';
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
// Si queremos crear un PDF
//$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'PDF');
$objWriter->save('MyExcel.xslx);
Leyendo hojas de clculo
PHPExcel es capaz de leer archivos de excel y extraer todos sus datos sin mucho esfuerzo. Para leer estos archivos, hay
que tirar de nuevo del objeto IOFactory.

require_once 'PHPExcel/IOFactory.php';
$objPHPExcel = PHPExcel_IOFactory::load("MyExcel.xlsx");
Iterar por la hoja de clculo le permite moverse por toda la estructura del archivo, aunque este sea desconocido para el
usuario. La forma de hacerlos sera algo similar a esto:

require_once 'PHPExcel/IOFactory.php';
$objPHPExcel = PHPExcel_IOFactory::load("MyExcel.xlsx");
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
$worksheetTitle
= $worksheet->getTitle();
$highestRow
= $worksheet->getHighestRow(); // e.g. 10
$highestColumn
= $worksheet->getHighestColumn(); // e.g 'F'
$highestColumnIndex =
PHPExcel_Cell::columnIndexFromString($highestColumn);
$nrColumns = ord($highestColumn) - 64;
echo "<br>The worksheet ".$worksheetTitle." has ";
echo $nrColumns . ' columns (A-' . $highestColumn . ') ';
echo ' and ' . $highestRow . ' row.';
echo '<br>Data: <table border="1"><tr>';
for ($row = 1; $row <= $highestRow; ++ $row) {
echo '<tr>';
for ($col = 0; $col < $highestColumnIndex; ++ $col) {
$cell = $worksheet->getCellByColumnAndRow($col, $row);
$val = $cell->getValue();
$dataType = PHPExcel_Cell_DataType::dataTypeForValue($val);
echo '<td>' . $val . '<br>(Typ ' . $dataType . ')</td>';
}
echo '</tr>';
}
echo '</table>';
}
Tambin es posible convertir un tipo de archivo a otro tipo distinto en pocas lneas.

$objPHPExcel = PHPExcel_IOFactory::load("XMLTest.xml");
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');

$objWriter->save('covertedXml2Xlsx.xlsx');
Aqu hemos convertido un archivo XML a uno de tipo Excel2007.

Importar de Excel a mysql en php


Necesitas importar registros a tu base de datos desde Excel y an no sabes como
hacerlo?, en este artculo te explico con un ejemplo sencillo como puedes hacerlo, as que
no te pierdas este artculo y mejor an lelo hasta el final.
Te va ser muy til cuando necesitas cargar datos que ya tienes almacenados en una hoja
de Excel y que ahora necesitas insertarlos en tu base de datos, o bien necesitas jalar datos
del mismo Excel para realizar clculos en tu cdigo, etc. muchos ejemplos donde necesites
leer un documento en Excel.
Pero bueno a ti te interesa el ejemplo y eso te voy a explicar ahorita, paso a paso:
Primero: La base de datos que voy a utilizar para este ejemplo se llama: escuela y la
tabla en la voy insertar los registros extrados de Excel se llama alumnos y tiene los
campos (id, nocontrol, nombre, grado, grupo, sexo).
Segundo: Necesitas descargar la Clase PHPExcel de Maarten Balliauw (tiene licencia
LGPL), y la puedes descargar desde aqu http://www.codeplex.com/PHPExcel, o bien ya
viene incluida en el ejemplo.
Tercero: El siguiente cdigo es el que hace el trabajo pesado, se encuentra comentado:
<! http://ProgramarEnPHP.wordpress.com >
<head>
<meta http-equiv=Content-Type content=text/html; charset=utf-8 />
<title>:: Importar de Excel a la Base de Datos ::</title>
</head>
<body>
<! FORMULARIO PARA SOICITAR LA CARGA DEL EXCEL >
Selecciona el archivo a importar:
<form name=importa method=post action=<?php echo $PHP_SELF; ?>
enctype=multipart/form-data >
<input type=file name=excel />

<input type=submit name=enviar value=Importar />


<input type=hidden value=upload name=action />
</form>
<! CARGA LA MISMA PAGINA MANDANDO LA VARIABLE upload >
<?php
extract($_POST);
if ($action == upload){
//cargamos el archivo al servidor con el mismo nombre
//solo le agregue el sufijo bak_
$archivo = $_FILES['excel']['name'];
$tipo = $_FILES['excel']['type'];
$destino = bak_.$archivo;
if (copy($_FILES['excel']['tmp_name'],$destino)) echo Archivo Cargado Con xito;
else echo Error Al Cargar el Archivo;
////////////////////////////////////////////////////////
if (file_exists (bak_.$archivo)){
/** Clases necesarias */
require_once(Classes/PHPExcel.php);
require_once(Classes/PHPExcel/Reader/Excel2007.php);
// Cargando la hoja de clculo
$objReader = new PHPExcel_Reader_Excel2007();
$objPHPExcel = $objReader->load(bak_.$archivo);
$objFecha = new PHPExcel_Shared_Date();

// Asignar hoja de excel activa


$objPHPExcel->setActiveSheetIndex(0);
//conectamos con la base de datos
$cn = mysql_connect (localhost,root,pass) or die (ERROR EN LA CONEXION);
$db = mysql_select_db (escuela,$cn) or die (ERROR AL CONECTAR A LA BD);
// Llenamos el arreglo con los datos del archivo xlsx
for ($i=1;$i<=47;$i++){
$_DATOS_EXCEL[$i]['nocontrol'] = $objPHPExcel->getActiveSheet()->getCell(B.$i)>getCalculatedValue();
$_DATOS_EXCEL[$i]['nombre'] = $objPHPExcel->getActiveSheet()->getCell(C.$i)>getCalculatedValue();
$_DATOS_EXCEL[$i]['grado']= $objPHPExcel->getActiveSheet()->getCell(D.$i)>getCalculatedValue();
$_DATOS_EXCEL[$i]['grupo']= $objPHPExcel->getActiveSheet()->getCell(E.$i)>getCalculatedValue();
$_DATOS_EXCEL[$i]['sexo'] = $objPHPExcel->getActiveSheet()->getCell(F.$i)>getCalculatedValue();
}
}
//si por algo no cargo el archivo bak_
else{echo Necesitas primero importar el archivo;}
$errores=0;
//recorremos el arreglo multidimensional
//para ir recuperando los datos obtenidos
//del excel e ir insertandolos en la BD
foreach($_DATOS_EXCEL as $campo => $valor){

$sql = INSERT INTO alumnos VALUES (NULL,;


foreach ($valor as $campo2 => $valor2){
$campo2 == sexo ? $sql.= $valor2.); : $sql.= $valor2.,;
}
$result = mysql_query($sql);
if (!$result){ echo Error al insertar registro .$campo;$errores+=1;}
}
/////////////////////////////////////////////////////////////////////////
echo <strong><center>ARCHIVO IMPORTADO CON EXITO, EN TOTAL $campo
REGISTROS Y $errores ERRORES</center></strong>;
//una vez terminado el proceso borramos el
//archivo que esta en el servidor el bak_
unlink($destino);
}
?>
</body>
</html>
Cuarto: Te explico, lo primer
o es el formulario HTML que solicita el archivo a importar, luego una vez copiado
correctamente el mismo en el servidor y gracias a la clase PHPExcel comenzamos a
recorrerlo y obtener los datos del mismo hacia un arreglo multidimensional, ojo aqu se
podra ir creando la consulta sql para insertarlo en la BD, pero la idea de guardarlo en el
arreglo es poder procesar, utilizar y/o calcular si lo fuese necesario con esos datos
almacenados.
Ya una vez almacenado los datos en el arreglo ahora los utilizamos para pasarlos a la
consulta que se encarga de insertar los datos.
Ups, me extend un

poco en la explicacin pero espero haberme explicado, igual da click aqu para descargar
el ejemplo completo, incluyendo el documento en Excel del ejemplo, solo recuerda poner
los datos de conexin del mysql tuyo.
Ahora si nos vemos en la prxima, espero te sea de mucha, mucha utilidad como a m.
No dudes comentar o bien djame tus dudas, yo dos veces por semana checo comentarios
y contesto los mas posibles.