2010-10-09 16 views
32

Czy możesz mi pomóc lub dostarczyć kilka przykładowych kodów do wykonania eksportu i importu pliku CSV przy użyciu biblioteki PHPExcel?Eksport/import CSV za pomocą PHPExcel

Eksportowanie i importowanie Excela jest w porządku, ale potrzebuję również eksportu/importu CSV. Mam inne sposoby eksportowania i importowania plików CSV, ale czy można to zrobić również poprzez PHPExcel?

Odpowiedz

69

Aby zaimportować plik CSV do obiektu PHPExcel

$inputFileType = 'CSV'; 
$inputFileName = 'testFile.csv'; 
$objReader = PHPExcel_IOFactory::createReader($inputFileType); 
$objPHPExcel = $objReader->load($inputFileName); 

Aby wyeksportować plik CSV z obiektu PHPExcel

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'CSV'); 
$objWriter->save('testExportFile.csv'); 

EDIT

Jak przeczytać wiersze i komórki:

$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"; 
     } 
    } 
} 

Jak napisać do obiektu PHPExcel: Nie mów gdzie dane pochodzą z: oto jak to zrobić z MySQL Query

$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++; 
} 
+0

znak podziękowania. ale czy mógłbyś dać mi trochę więcej informacji na temat czytania linii po linii z pliku csv lub jak napisać do pliku csv? – Kunal

+0

To bardzo przydatne, Mark, dzięki za wspaniałą odpowiedź! – gfivehost

+1

Można również użyć następującej składni: '$ objWriter = new PHPExcel_Writer_CSV ($ objPHPExcel)' ' Z require_once '[your_libs] /PHPExcel/Writer/CSV.php';' –

-1
<?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 

?> 
+0

To nie używa PHPExcel, o to pyta. – bzeaman

4

I zostały poszukiwania samo. Excel CSV nie zawsze używa separatorów cudzysłowu i wymyka się cudzysłowom, używając "", ponieważ algorytm prawdopodobnie powrócił z lat 80-tych lub czegoś podobnego. Po obejrzeniu kilku parserów .csv w sekcji komentarzy na PHP.NET, widziałem te, które używały nawet wywołań zwrotnych lub kodu eval'd i albo nie działały tak jak trzeba, albo po prostu nie działały w ogóle. Napisałem więc własne procedury i działają one w najprostszej konfiguracji PHP. Klucze tablicy mogą być numeryczne lub nazwane jako pola podane w wierszu nagłówka. Mam nadzieję że to pomoże.

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; 
    } 

... Teraz Bob może zrobić jego arkusze

Powiązane problemy