importar - Exportación/importación de CSV con PHPExcel
phpexcel object (3)
¿Podría guiarme o proporcionarme algunos códigos de muestra para realizar la exportación e importación de CSV utilizando la biblioteca PHPExcel?
La exportación e importación de Excel está bien, pero también necesito la exportación / importación de CSV. Tengo otros medios de exportación e importación de CSV, ¿pero también se puede hacer a través de PHPExcel?
He estado buscando lo mismo. Excel CSV no siempre usa los separadores de comillas y escapa de las comillas usando "" porque el algoritmo probablemente se hizo en los años 80 o algo así. Después de ver varios analizadores .csv en la sección de comentarios en PHP.NET, vi algunos que incluso utilizaban devoluciones de llamada o código evaluado y que o bien no funcionaban como era necesario o simplemente no funcionaban en absoluto. Entonces, escribí mis propias rutinas para esto y trabajan en la configuración de PHP más básica. Las teclas de matriz pueden ser numéricas o nombradas como los campos que figuran en la fila de encabezado. Espero que esto ayude.
function SW_ImplodeCSV(array $rows, $headerrow=true, $mode=''EXCEL'', $fmt=''2D_FIELDNAME_ARRAY'')
// SW_ImplodeCSV - returns 2D array as string of csv(MS Excel .CSV supported)
// AUTHOR: [email protected]
// RELEASED: 9/21/13 BETA
{ $r=1; $row=array(); $fields=array(); $csv="";
$escapes=array(''/r'', ''/n'', ''/t'', ''//', ''/"''); //two byte escape codes
$escapes2=array("/r", "/n", "/t", "//", "/""); //actual code
if($mode==''EXCEL'')// escape code = ""
{ $delim='',''; $enclos=''"''; $rowbr="/r/n"; }
else //mode=STANDARD all fields enclosed
{ $delim='',''; $enclos=''"''; $rowbr="/r/n"; }
$csv=""; $i=-1; $i2=0; $imax=count($rows);
while( $i < $imax )
{
// get field names
if($i == -1)
{ $row=$rows[0];
if($fmt==''2D_FIELDNAME_ARRAY'')
{ $i2=0; $i2max=count($row);
while( list($k, $v) = each($row) )
{ $fields[$i2]=$k;
$i2++;
}
}
else //if($fmt=''2D_NUMBERED_ARRAY'')
{ $i2=0; $i2max=(count($rows[0]));
while($i2<$i2max)
{ $fields[$i2]=$i2;
$i2++;
}
}
if($headerrow==true) { $row=$fields; }
else { $i=0; $row=$rows[0];}
}
else
{ $row=$rows[$i];
}
$i2=0; $i2max=count($row);
while($i2 < $i2max)// numeric loop (order really matters here)
//while( list($k, $v) = each($row) )
{ if($i2 != 0) $csv=$csv.$delim;
$v=$row[$fields[$i2]];
if($mode==''EXCEL'') //EXCEL 2quote escapes
{ $newv = ''"''.(str_replace(''"'', ''""'', $v)).''"''; }
else //STANDARD
{ $newv = ''"''.(str_replace($escapes2, $escapes, $v)).''"''; }
$csv=$csv.$newv;
$i2++;
}
$csv=$csv."/r/n";
$i++;
}
return $csv;
}
function SW_ExplodeCSV($csv, $headerrow=true, $mode=''EXCEL'', $fmt=''2D_FIELDNAME_ARRAY'')
{ // SW_ExplodeCSV - parses CSV into 2D array(MS Excel .CSV supported)
// AUTHOR: [email protected]
// RELEASED: 9/21/13 BETA
//SWMessage("SW_ExplodeCSV() - CALLED HERE -");
$rows=array(); $row=array(); $fields=array();// rows = array of arrays
//escape code = ''/'
$escapes=array(''/r'', ''/n'', ''/t'', ''//', ''/"''); //two byte escape codes
$escapes2=array("/r", "/n", "/t", "//", "/""); //actual code
if($mode==''EXCEL'')
{// escape code = ""
$delim='',''; $enclos=''"''; $esc_enclos=''""''; $rowbr="/r/n";
}
else //mode=STANDARD
{// all fields enclosed
$delim='',''; $enclos=''"''; $rowbr="/r/n";
}
$indxf=0; $indxl=0; $encindxf=0; $encindxl=0; $enc=0; $enc1=0; $enc2=0; $brk1=0; $rowindxf=0; $rowindxl=0; $encflg=0;
$rowcnt=0; $colcnt=0; $rowflg=0; $colflg=0; $cell="";
$headerflg=0; $quotedflg=0;
$i=0; $i2=0; $imax=strlen($csv);
while($indxf < $imax)
{
//find first *possible* cell delimiters
$indxl=strpos($csv, $delim, $indxf); if($indxl===false) { $indxl=$imax; }
$encindxf=strpos($csv, $enclos, $indxf); if($encindxf===false) { $encindxf=$imax; }//first open quote
$rowindxl=strpos($csv, $rowbr, $indxf); if($rowindxl===false) { $rowindxl=$imax; }
if(($encindxf>$indxl)||($encindxf>$rowindxl))
{ $quoteflg=0; $encindxf=$imax; $encindxl=$imax;
if($rowindxl<$indxl) { $indxl=$rowindxl; $rowflg=1; }
}
else
{ //find cell enclosure area (and real cell delimiter)
$quoteflg=1;
$enc=$encindxf;
while($enc<$indxl) //$enc = next open quote
{// loop till unquoted delim. is found
$enc=strpos($csv, $enclos, $enc+1); if($enc===false) { $enc=$imax; }//close quote
$encindxl=$enc; //last close quote
$indxl=strpos($csv, $delim, $enc+1); if($indxl===false) { $indxl=$imax; }//last delim.
$enc=strpos($csv, $enclos, $enc+1); if($enc===false) { $enc=$imax; }//open quote
if(($indxl==$imax)||($enc==$imax)) break;
}
$rowindxl=strpos($csv, $rowbr, $enc+1); if($rowindxl===false) { $rowindxl=$imax; }
if($rowindxl<$indxl) { $indxl=$rowindxl; $rowflg=1; }
}
if($quoteflg==0)
{ //no enclosured content - take as is
$colflg=1;
//get cell
// $cell=substr($csv, $indxf, ($indxl-$indxf)-1);
$cell=substr($csv, $indxf, ($indxl-$indxf));
}
else// if($rowindxl > $encindxf)
{ // cell enclosed
$colflg=1;
//get cell - decode cell content
$cell=substr($csv, $encindxf+1, ($encindxl-$encindxf)-1);
if($mode==''EXCEL'') //remove EXCEL 2quote escapes
{ $cell=str_replace($esc_enclos, $enclos, $cell);
}
else //remove STANDARD esc. sceme
{ $cell=str_replace($escapes, $escapes2, $cell);
}
}
if($colflg)
{// read cell into array
if( ($fmt==''2D_FIELDNAME_ARRAY'') && ($headerflg==1) )
{ $row[$fields[$colcnt]]=$cell; }
else if(($fmt==''2D_NUMBERED_ARRAY'')||($headerflg==0))
{ $row[$colcnt]=$cell; } //$rows[$rowcnt][$colcnt] = $cell;
$colcnt++; $colflg=0; $cell="";
$indxf=$indxl+1;//strlen($delim);
}
if($rowflg)
{// read row into big array
if(($headerrow) && ($headerflg==0))
{ $fields=$row;
$row=array();
$headerflg=1;
}
else
{ $rows[$rowcnt]=$row;
$row=array();
$rowcnt++;
}
$colcnt=0; $rowflg=0; $cell="";
$rowindxf=$rowindxl+2;//strlen($rowbr);
$indxf=$rowindxf;
}
$i++;
//SWMessage("SW_ExplodeCSV() - colcnt = ".$colcnt." rowcnt = ".$rowcnt." indxf = ".$indxf." indxl = ".$indxl." rowindxf = ".$rowindxf);
//if($i>20) break;
}
return $rows;
}
... Ahora Bob puede hacer sus hojas de cálculo
Para importar un archivo CSV en un objeto PHPExcel
$inputFileType = ''CSV'';
$inputFileName = ''testFile.csv'';
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objPHPExcel = $objReader->load($inputFileName);
Para exportar un archivo CSV desde un objeto PHPExcel
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, ''CSV'');
$objWriter->save(''testExportFile.csv'');
EDITAR
Cómo leer a través de las filas y las celdas:
$worksheet = $objPHPExcel->getActiveSheet();
foreach ($worksheet->getRowIterator() as $row) {
echo ''Row number: '' . $row->getRowIndex() . "/r/n";
$cellIterator = $row->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(false); // Loop all cells, even if it is not set
foreach ($cellIterator as $cell) {
if (!is_null($cell)) {
echo ''Cell: '' . $cell->getCoordinate() . '' - '' . $cell->getValue() . "/r/n";
}
}
}
Cómo escribir en un objeto de PHPExcel: no dice de dónde provienen sus datos: cómo hacerlo desde una consulta de MySQL
$query = sprintf("SELECT firstname, lastname, age, date_of_birth, salary FROM employees WHERE firstname=''%s'' AND lastname=''%s''",
mysql_real_escape_string($firstname),
mysql_real_escape_string($lastname));
$result = mysql_query($query);
$row = 1;
$objPHPExcel->getActiveSheet()->setCellValue(''A''.$row, ''First Name'')
->setCellValue(''B''.$row, ''Last Name'')
->setCellValue(''C''.$row, ''Age'')
->setCellValue(''D''.$row, ''Date of birth'')
->setCellValue(''E''.$row, ''Salary'');
$row++;
while ($rec = mysql_fetch_assoc($result)) {
$objPHPExcel->getActiveSheet()->setCellValue(''A''.$row, $rec[''firstname''])
->setCellValue(''B''.$row, $rec[''lastname''])
->setCellValue(''C''.$row, $rec[''age''])
->setCellValue(''D''.$row, PHPExcel_Shared_Date::stringToExcel($rec[''date_of_birth'']))
->setCellValue(''E''.$row, $rec[''salary'']);
$objPHPExcel->getActiveSheet()->getStyle(''D''.$row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX15);
$objPHPExcel->getActiveSheet()->getStyle(''E''.$row)->getNumberFormat()->setFormatCode(''£#,##0.00'');
$row++;
}
<?php
if(isset($_POST[''Upload''])) {
$fname = $_FILES[''upfile''][''name''];
$chk_ext = explode(".",$fname);
if(strtolower($chk_ext[1]) == "csv" || strtolower($chk_ext[1]) == "xls" || strtolower($chk_ext[1]) == "xlsx") {
$filename = $_FILES[''upfile''][''tmp_name''];
$handle = fopen($filename, "r");
while (($data = fgetcsv($handle, 1000, "''''09''")) !== FALSE)
{
$sql = "INSERT INTO tbl_upload(up_proj,up_loc,up_sys,up_dev,up_devtype,up_mnf,up_devtag,up_conn,up_readtag,up_ipaddr,up_warr,up_rem) VALUES(''" .mysql_real_escape_string($data[1]). "'',''" .mysql_real_escape_string($data[2]). "'',''" .mysql_real_escape_string($data[3]). "'',''" .mysql_real_escape_string($data[4]). "'',''" .mysql_real_escape_string($data[5]). "'',''" .mysql_real_escape_string($data[6]). "'',''" .mysql_real_escape_string($data[7]). "'',''" .mysql_real_escape_string($data[8]). "'',''" .mysql_real_escape_string($data[9]). "'',''" .mysql_real_escape_string($data[10]). "'',''" .mysql_real_escape_string($data[11]). "'',''" .mysql_real_escape_string($data[12]). "'')";
mysql_query($sql) or die(mysql_error());
} //while
fclose($handle);
echo "Successfully Uploaded";
} //if
else
{
echo "Invalid File";
}
}//submit
?>