Leitor PHPExcel – ajuda necessária

Eu estou usando PHPExcel para ler dados da folha do Excel e armazenar na tabela mysql, até agora eu sou capaz de carregar arquivos .xls, bem como .xlsx e depois de carregar o xls que recebi abaixo da estrutura da tabela de dados

name start_date end_date city one 11/25/2011 3:30:00 PM 11/29/2011 4:40:00 AM Jaipur two 10/22/2011 5:30:00 PM 10/25/2011 6:30:00 AM Kota three 3/10/2011 2:30:00 PM 3/11/2011 12:30:00 AM Bikaner chandigarh 

agora tenho alguns problemas, me sugira o método otimizado

  1. Como obtemos o nome da folha (bcoz em um excel há 7 folhas)
  2. Por agora, o que faço para armazenar esses dados no db, abaixo é o fragment de código

     $inputFileName = "test.xls"; $inputFileType = PHPExcel_IOFactory::identify($inputFileName); $objReader = PHPExcel_IOFactory::createReader($inputFileType); $objReader->setReadDataOnly(true); /** Load $inputFileName to a PHPExcel Object **/ $objPHPExcel = $objReader->load($inputFileName); $total_sheets=$objPHPExcel->getSheetCount(); // here 4 $allSheetName=$objPHPExcel->getSheetNames(); // array ([0]=>'student',[1]=>'teacher',[2]=>'school',[3]=>'college') $objWorksheet = $objPHPExcel->setActiveSheetIndex(0); // first sheet $highestRow = $objWorksheet->getHighestRow(); // here 5 $highestColumn = $objWorksheet->getHighestColumn(); // here 'E' $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); // here 5 for ($row = 1; $row <= $highestRow; ++$row) { for ($col = 0; $col getCellByColumnAndRow($col, $row)->getValue(); if(is_array($arr_data) ) { $arr_data[$row-1][$col]=$value; } } } print_r($arr_data); 

e isso retorna

 Array ( [0] => Array ( [0] => name [1] => start_date [2] => end_date [3] => city [4] => ) [1] => Array ( [0] => one [1] => 40568.645833333 [2] => 40570.5 [3] => Jaipur [4] => ) [2] => Array ( [0] => two [1] => 40568.645833333 [2] => 40570.5 [3] => Kota [4] => ) [3] => Array ( [0] => three [1] => 40568.645833333 [2] => 40570.5 [3] => Bikaner [4] => ) [4] => Array ( [0] => [1] => [2] => [3] => Chandigarh [4] => ) ) 

eu preciso disso

  • header de cada folha de Excel (ou seja, primeira linha) torna-se chave da matriz ($ arr_data) e
  • o resto se torna o valor da matriz.
  • O tempo mudou para algum valor inteiro, que será o mesmo que na folha de Excel
  • O campo em branco (ou seja, coluna de header do bloco) da matriz em toda a linha deve ser truncado (aqui [4])
  • Se o primeiro campo de uma folha de Excel (ou condição combinada em alguns campos) não for cumprido, essa linha não deve ser adicionada à matriz

ou seja, a disposição desejada deve parecer

 Array ( [0] => Array ( [name] => one [start_date] => 11/25/2011 3:30:00 PM [end_date] => 11/29/2011 4:40:00 AM [city] => Jaipur ) [1] => Array ( [name] => two [start_date] => 10/22/2011 5:30:00 PM [end_date] => 10/25/2011 6:30:00 AM [city] => Kota ) [2] => Array ( [name] => three [start_date] => 3/10/2011 2:30:00 PM [end_date] => 3/11/2011 12:30:00 AM [city] => Bikaner ) ) 

e depois disso eu armazeno dados no meu db usando a ação mysql na matriz desejada.

  • Existe algum outro método curto para armazenar dados acima em db

Nota: Por favor, não consulte manual (é realmente muito ruim) … apenas me diga o nome dos methods ..

atualizar

@Mark Obrigado pela sua solução, isso me ajuda muito, mas ainda existem alguns problemas

  • como lidar com células vazias / vazias na folha de Excel … por enquanto quando uma célula está vazia, ela exibe um aviso

Aviso: Índice indefinido: C em C: \ xampp \ htdocs \ xls_reader \ Tests \ excel2007.php na linha 60
Aviso: Índice indefinido: D em C: \ xampp \ htdocs \ xls_reader \ Tests \ excel2007.php na linha 60

enquanto a linha 60 é

 foreach($headingsArray as $columnKey => $columnHeading) { $namedDataArray[$r][$columnHeading] = $dataRow[$row]$columnKey]; } 
  • como configurar as condições antes de recuperar a matriz de dados completos, ou seja, se eu quiser que, se a primeira e a segunda coluna estiverem vazias ou vazias em qualquer linha, essa linha não deve ser adicionada na nossa matriz desejada

obrigado

Como obtemos o nome da folha (bcoz em um excel, existem 7 folhas)?

Para obter a folha ativa atual:

 $sheetName = $objPHPExcel->getActiveSheet()->getTitle(); 

O tempo mudou para algum valor inteiro, que será o mesmo que na folha de Excel

Olhe para PHPExcel_Shared_Date :: ExcelToPHP ($ excelDate) ou PHPExcel_Shared_Date :: ExcelToPHPObject ($ excelDate) para converter os valores de data / hora em um timestamp do PHP ou no object DateTime

Dê uma olhada no método $ objPHPExcel-> getActiveSheet () -> toArray () em vez de fazer um loop através de todos os rwos e colunas você mesmo. Se você deseja usar o Array com o argumento formatado, não use $ objReader-> setReadDataOnly (true); Caso contrário, PHPExcel não pode distinguir entre um número e uma data / hora. O código SVN mais recente adicionou um método rangeToArray () ao object da planilha, que permite que você leia uma linha (ou bloco de células) de cada vez, por exemplo, $ objPHPExcel-> getActiveSheet () -> rangeToArray (‘A1: A4’ )

O resto de suas perguntas são basicamente manipulação de matriz PHP

EDITAR

PS. Em vez de simplesmente nos dizer que o manual é realmente muito ruim … diga-nos como podemos melhorar.

EDITAR 2

Usando o código SVN mais recente para tirar proveito do método rangeToArray ():

 $objWorksheet = $objPHPExcel->setActiveSheetIndex(0); $highestRow = $objWorksheet->getHighestRow(); $highestColumn = $objWorksheet->getHighestColumn(); $headingsArray = $objWorksheet->rangeToArray('A1:'.$highestColumn.'1',null, true, true, true); $headingsArray = $headingsArray[1]; $r = -1; $namedDataArray = array(); for ($row = 2; $row <= $highestRow; ++$row) { $dataRow = $objWorksheet->rangeToArray('A'.$row.':'.$highestColumn.$row,null, true, true, true); if ((isset($dataRow[$row]['A'])) && ($dataRow[$row]['A'] > '')) { ++$r; foreach($headingsArray as $columnKey => $columnHeading) { $namedDataArray[$r][$columnHeading] = $dataRow[$row][$columnKey]; } } } echo '
'; var_dump($namedDataArray); echo '

';