Como usar o phpexcel para ler dados e inserir no banco de dados?
108
Tenho um phpaplicativo onde desejo ler dados do excel, inserir no banco de dados e gerar relatórios em pdf para usuários específicos. Eu procurei muito, mas nada específico sobre as duas coisas.
Você já pensou em exportar seus dados do Excel para CSV? Há algo em seus dados que elimina o CSV como uma opção?
Telmo Marques
2
Você já olhou para a biblioteca PHPExcel?
Mark Baker
@MarkBaker eu não vi a biblioteca ainda, embora eu tenha tentado verificar o arquivo de referência de função, mas era muito grande para olhar porque eu tive que fazer essa coisa funcionar o mais rápido possível, além de outras partes do projeto.
coder101
@TelmoMarques nós pensamos em fazê-lo através de um csv, mas queríamos usar o PHPExcel caso contrário, a última opção do csv está sempre lá.
Usando a biblioteca PHPExcel para ler um arquivo Excel e transferir os dados para um banco de dados
// 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}
Qualquer coisa a mais se torna muito dependente de seu banco de dados e de como você deseja que os dados sejam estruturados nele
Eu testei isso hoje com v 1.7.9, 2013-06-02 e não funcionou. eu tive que substituir $highestColumn = PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn());pelo simples $sheet->getHighestColumn(). você pode ter um bug no código ao tentar obter o índice da coluna da string - MAS tente acessá-lo via $ higherColumn. $ row no loop (o que daria apenas um inteiro concatenado estranho se você não usasse um personagem)
usuário151496
A coluna mais alta deve ser um valor de letra (s) da coluna; então você está certo - isso deveria ser simplesmente um cenário, $highestColumn = $sheet->getHighestColumn();e não $highestColumn = PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn());eu não sou infalível `
getHighestColumn()retorna 255 todas as vezes. Substituí-lo por getHighestDataColumn()corrige o problema. Mais informações: stackoverflow.com/questions/15903471/…
Martin Dzhonov
@ coder101 Olá. Você poderia me dar seu php Pg_Query para inserir array de dados de linha no banco de dados? Obrigado
Shieryn
12
Para ler os dados do microsoft excel 2007 pelo codeigniter, basta criar uma função auxiliar excel_helper.php e adicionar o seguinte em:
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 a biblioteca PHPExcel , o código a seguir 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++;}
obrigado cara. Na verdade, eu postei esse problema meses atrás e tive uma solução alternativa naquele momento. mas com certeza usarei sua sugestão na próxima vez que trabalhar nessa funcionalidade. obrigado novamente.
Respostas:
Usando a biblioteca PHPExcel para ler um arquivo Excel e transferir os dados para um banco de dados
Qualquer coisa a mais se torna muito dependente de seu banco de dados e de como você deseja que os dados sejam estruturados nele
fonte
$highestColumn = PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn());
pelo simples$sheet->getHighestColumn()
. você pode ter um bug no código ao tentar obter o índice da coluna da string - MAS tente acessá-lo via $ higherColumn. $ row no loop (o que daria apenas um inteiro concatenado estranho se você não usasse um personagem)$highestColumn = $sheet->getHighestColumn();
e não$highestColumn = PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn());
eu não sou infalível `getHighestColumn()
retorna 255 todas as vezes. Substituí-lo porgetHighestDataColumn()
corrige o problema. Mais informações: stackoverflow.com/questions/15903471/…Para ler os dados do microsoft excel 2007 pelo codeigniter, basta criar uma função auxiliar excel_helper.php e adicionar o seguinte em:
fonte
Usando a biblioteca PHPExcel , o código a seguir servirá.
fonte
fonte
fonte
Aqui está uma resposta muito recente a esta pergunta do arquivo: 07reader.php
fonte
Você pode baixar o framework Inci assim:
fonte