2010-10-09 35 views
32

Bạn có thể vui lòng hướng dẫn tôi hoặc cung cấp cho tôi một số mã mẫu để thực hiện xuất và nhập CSV bằng thư viện PHPExcel không?Xuất/Nhập CSV bằng PHPExcel

Xuất và nhập Excel là tốt nhưng tôi cũng cần nhập/xuất CSV. Tôi có phương tiện khác để xuất và nhập CSV, nhưng nó có thể được thực hiện thông qua PHPExcel không?

Trả lời

69

Để nhập tập tin CSV vào một đối tượng PHPExcel

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

Để xuất một tập tin CSV từ một đối tượng PHPExcel

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

EDIT

Làm thế nào để đọc qua các hàng và ô:

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

Làm thế nào để viết thư cho một đối tượng PHPExcel: Bạn không nói, nơi dữ liệu của bạn đến từ: dưới đây là cách để làm điều đó từ một truy vấn 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++; 
} 
+0

nhờ dấu ấn. nhưng bạn có thể vui lòng cho tôi biết thêm chi tiết về cách đọc từng dòng từ tệp csv hoặc cách ghi vào tệp csv không? – Kunal

+0

Đó là Mark rất hữu ích, cảm ơn câu trả lời tuyệt vời! – gfivehost

+1

Bạn cũng có thể sử dụng cú pháp sau: '$ objWriter = new PHPExcel_Writer_CSV ($ objPHPExcel);' Với '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

Điều này không sử dụng PHPExcel, đó là những gì được yêu cầu. – bzeaman

4

tôi được tìm kiếm điều tương tự. Excel CSV không phải lúc nào cũng sử dụng dấu tách trích dẫn và thoát khỏi dấu ngoặc kép bằng cách sử dụng "" vì thuật toán có thể được tạo lại từ thập niên 80 hoặc cái gì đó. Sau khi xem xét một số phân tích cú pháp .csv trong phần bình luận trên PHP.NET, tôi thấy những người thậm chí còn sử dụng gọi lại hoặc mã eval'd và họ hoặc không làm việc như cần thiết hoặc đơn giản là không làm việc ở tất cả. Vì vậy, tôi đã viết các thói quen của riêng mình cho điều này và họ làm việc trong cấu hình PHP cơ bản nhất. Các khóa mảng có thể là số hoặc được đặt tên như các trường được đưa ra trong hàng tiêu đề. Hi vọng điêu nay co ich.

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

... Bây giờ bob có thể làm bảng tính của mình