¿Cómo usar phpexcel para leer datos e insertarlos en la base de datos?
108
Tengo una phpaplicación en la que quiero leer datos de Excel, insertarlos en la base de datos y luego generar informes en PDF para usuarios específicos. Busqué mucho pero nada específico sobre ambas cosas.
¿Ha pensado en exportar sus datos de Excel a CSV? ¿Hay algo en sus datos que elimine CSV como una opción?
Telmo Marques
2
¿Ha mirado ya la biblioteca PHPExcel?
Mark Baker
@MarkBaker todavía no he visto la biblioteca, aunque intenté consultar el archivo de referencia de la función, pero era demasiado grande para examinarlo, ya que tenía que hacer que esto funcionara lo antes posible, además de otras partes del proyecto.
coder101
@TelmoMarques pensamos en hacerlo a través de un csv, pero queríamos hacerlo usando PHPExcel, de lo contrario, la última opción de csv siempre está ahí.
Usar la biblioteca PHPExcel para leer un archivo de Excel y transferir los datos a una base de datos
// Include PHPExcel_IOFactory
include 'PHPExcel/IOFactory.php';
$inputFileName ='./sampleData/example1.xls';// Read your Excel workbooktry{
$inputFileType =PHPExcel_IOFactory::identify($inputFileName);
$objReader =PHPExcel_IOFactory::createReader($inputFileType);
$objPHPExcel = $objReader->load($inputFileName);}catch(Exception $e){die('Error loading file "'.pathinfo($inputFileName,PATHINFO_BASENAME).'": '.$e->getMessage());}// Get worksheet dimensions
$sheet = $objPHPExcel->getSheet(0);
$highestRow = $sheet->getHighestRow();
$highestColumn = $sheet->getHighestColumn();// Loop through each row of the worksheet in turnfor($row =1; $row <= $highestRow; $row++){// Read a row of data into an array
$rowData = $sheet->rangeToArray('A'. $row .':'. $highestColumn . $row,
NULL,
TRUE,
FALSE);// Insert row data array into your database of choice here}
Cualquier otra cosa se vuelve muy dependiente de su base de datos y de cómo desea estructurar los datos en ella
Probé esto hoy con v 1.7.9, 2013-06-02 y no funcionó. Tuve que reemplazarlo $highestColumn = PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn());con simple $sheet->getHighestColumn(). es posible que tenga un error en el código mientras intenta obtener el índice de la columna de la cadena, PERO intente acceder a él a través de $ máximaColumna. $ fila en el bucle (que solo daría un extraño entero concatenado si no usara un personaje)
user151496
La columna más alta debe ser un valor de letra (s) de columna; así que tienes razón, esto debería ser simplemente un ajuste en $highestColumn = $sheet->getHighestColumn();lugar de que $highestColumn = PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn());no soy infalible ''
getHighestColumn()devuelve 255 cada vez. Reemplazarlo con getHighestDataColumn()soluciona el problema. Aquí hay más información: stackoverflow.com/questions/15903471/…
Martin Dzhonov
@ coder101 Hola. ¿Podría darme su php Pg_Query para insertar una matriz de datos de fila en la base de datos? Gracias
Shieryn
12
Para leer datos de microsoft excel 2007 por codeigniter, simplemente cree una función auxiliar excel_helper.php y agregue lo siguiente en:
require_once APPPATH.'libraries/phpexcel/PHPExcel.php';
require_once APPPATH.'libraries/phpexcel/PHPExcel/IOFactory.php';in controller add the following code to read spread sheet by active sheet
//initialize php excel first
ob_end_clean();//define cachemethod
$cacheMethod =PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
$cacheSettings = array('memoryCacheSize'=>'20MB');//set php excel settingsPHPExcel_Settings::setCacheStorageMethod(
$cacheMethod,$cacheSettings
);
$arrayLabel = array("A","B","C","D","E");//=== set object reader
$objectReader =PHPExcel_IOFactory::createReader('Excel2007');
$objectReader->setReadDataOnly(true);
$objPHPExcel = $objectReader->load("./forms/test.xlsx");
$objWorksheet = $objPHPExcel->setActiveSheetIndexbyName('Sheet1');
$starting =1;
$end =3;for($i = $starting;$i<=$end; $i++){for($j=0;$j<count($arrayLabel);$j++){//== display each cell value
echo $objWorksheet->getCell($arrayLabel[$j].$i)->getValue();}}//or dump data
$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);
var_dump($sheetData);//see also the following link
http://blog.mayflower.de/561-Import-and-export-data-using-PHPExcel.html-----------importin another style around 5000 records ------
$this->benchmark->mark('code_start');//=== change php ini limits. =====
$cacheMethod =PHPExcel_CachedObjectStorageFactory:: cache_to_phpTemp;
$cacheSettings = array(' memoryCacheSize '=>'50MB');PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);//==== create excel object of reader
$objReader =PHPExcel_IOFactory::createReader('Excel2007');//$objReader->setReadDataOnly(true);//==== load forms tashkil where the file exists
$objPHPExcel = $objReader->load("./forms/5000records.xlsx");//==== set active sheet to read data
$worksheet = $objPHPExcel->setActiveSheetIndexbyName('Sheet1');
$highestRow = $worksheet->getHighestRow();// e.g. 10
$highestColumn = $worksheet->getHighestColumn();// e.g 'F'
$highestColumnIndex =PHPExcel_Cell::columnIndexFromString($highestColumn);
$nrColumns = ord($highestColumn)-64;
$worksheetTitle = $worksheet->getTitle();
echo "<br>The worksheet ".$worksheetTitle." has ";
echo $nrColumns .' columns (A-'. $highestColumn .') ';
echo ' and '. $highestRow .' row.';
echo '<br>Data: <table border="1"><tr>';//----- loop from all rows -----for($row =1; $row <= $highestRow;++ $row){
echo '<tr>';
echo "<td>".$row."</td>";//--- read each excel column for each row ----for($col =0; $col < $highestColumnIndex;++ $col){if($row ==1){// show column name with the title//----- get value ----
$cell = $worksheet->getCellByColumnAndRow($col, $row);
$val = $cell->getValue();//$dataType = PHPExcel_Cell_DataType::dataTypeForValue($val);
echo '<td>'. $val ."(".$row." X ".$col.")".'</td>';}else{if($col ==9){//----- get value ----
$cell = $worksheet->getCellByColumnAndRow($col, $row);
$val = $cell->getValue();//$dataType = PHPExcel_Cell_DataType::dataTypeForValue($val);
echo '<td>zone '. $val .'</td>';}elseif($col ==13){
$date =PHPExcel_Shared_Date::ExcelToPHPObject($worksheet->getCellByColumnAndRow($col, $row)->getValue())->format('Y-m-d');
echo '<td>'.dateprovider($date,'dr').'</td>';}else{//----- get value ----
$cell = $worksheet->getCellByColumnAndRow($col, $row);
$val = $cell->getValue();//$dataType = PHPExcel_Cell_DataType::dataTypeForValue($val);
echo '<td>'. $val .'</td>';}}}
echo '</tr>';}
echo '</table>';
$this->benchmark->mark('code_end');
echo "Total time:".$this->benchmark->elapsed_time('code_start','code_end');
$this->load->view("error");
Usando la biblioteca PHPExcel , el siguiente código servirá.
require_once dirname(__FILE__).'/../Classes/PHPExcel/IOFactory.php';
$objReader =PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setReadDataOnly(true);//optional
$objPHPExcel = $objReader->load(__DIR__.'/YourExcelFile.xlsx');
$objWorksheet = $objPHPExcel->getActiveSheet();
$i=1;foreach($objWorksheet->getRowIterator()as $row){
$column_A_Value = $objPHPExcel->getActiveSheet()->getCell("A$i")->getValue();//column A//you can add your own columns B, C, D etc.//inset $column_A_Value value in DB query here
$i++;}
gracias hombre. En realidad, publiqué este problema hace meses y tuve una solución en ese momento. pero definitivamente usaré su sugerencia la próxima vez que trabaje en esta funcionalidad. gracias de nuevo.
Respuestas:
Usar la biblioteca PHPExcel para leer un archivo de Excel y transferir los datos a una base de datos
Cualquier otra cosa se vuelve muy dependiente de su base de datos y de cómo desea estructurar los datos en ella
fuente
$highestColumn = PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn());
con simple$sheet->getHighestColumn()
. es posible que tenga un error en el código mientras intenta obtener el índice de la columna de la cadena, PERO intente acceder a él a través de $ máximaColumna. $ fila en el bucle (que solo daría un extraño entero concatenado si no usara un personaje)$highestColumn = $sheet->getHighestColumn();
lugar de que$highestColumn = PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn());
no soy infalible ''getHighestColumn()
devuelve 255 cada vez. Reemplazarlo congetHighestDataColumn()
soluciona el problema. Aquí hay más información: stackoverflow.com/questions/15903471/…Para leer datos de microsoft excel 2007 por codeigniter, simplemente cree una función auxiliar excel_helper.php y agregue lo siguiente en:
fuente
Usando la biblioteca PHPExcel , el siguiente código servirá.
fuente
fuente
fuente
Aquí hay una respuesta muy reciente a esta pregunta del archivo: 07reader.php
fuente
Inci framework que puedes descargar así:
fuente