2012-10-11 27 views
0

目前,我能够使用PHP查询MYSQL数据库,并且我的数据被导入到CSV中,没有任何问题。但是,我需要将列数据放在最上面一行,并将其放在左侧的行中,而我需要在每列之下的数据与正确的行进行关联。所以基本上,我需要PHP在Excel中转​​置数据,就像在Excel中的转置工具一样。如何使用PHP和MYSQL格式化CSV文件

这里是我当前的代码:

ExportMysqlToCsv($tablename); 

function exportMysqlToCsv($tablename,$filename = 'Results.csv') 
{ 
    $csv_terminated = "\n"; 
    $csv_separator = ","; 
    $csv_enclosed = '"'; 
    $csv_escaped = "\\"; 
    $sql_query = "select * from $tablename where id=2"; 

    // Gets the data from the database 
    $result = mysql_query($sql_query); 
    $fields_cnt = mysql_num_fields($result); 

    $schema_insert = ''; 

    for ($i = 0; $i < $fields_cnt; $i++) 
    { 
     $l = $csv_enclosed . str_replace($csv_enclosed, $csv_escaped . $csv_enclosed, 
      stripslashes(mysql_field_name($result, $i))) . $csv_enclosed; 
     $schema_insert .= $l; 
     $schema_insert .= $csv_separator; 
    } // end for 

    $out = trim(substr($schema_insert, 0, -1)); 
    $out .= $csv_terminated; 

    // Format the data 
    while ($row = mysql_fetch_array($result)) 
    { 
     $schema_insert = ''; 
     for ($j = 0; $j < $fields_cnt; $j++) 
     { 
      if ($row[$j] == '0' || $row[$j] != '') 
      { 

       if ($csv_enclosed == '') 
       { 
        $schema_insert .= $row[$j]; 
       } else 
       { 
        $schema_insert .= $csv_enclosed . 
        str_replace($csv_enclosed, $csv_escaped . $csv_enclosed, $row[$j]) . $csv_enclosed; 
       } 
      } else 
      { 
       $schema_insert .= ''; 
      } 

      if ($j < $fields_cnt - 1) 
      { 
       $schema_insert .= $csv_separator; 
      } 
     } // end for 

     $out .= $schema_insert; 
     $out .= $csv_terminated; 
    } // end while 


    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Content-Length: " . strlen($out)); 

// Output to browser with appropriate mime type, you choose ;) 
    header("Content-type: text/x-csv"); 
    header("Content-type: text/csv"); 
    header("Content-type: application/csv"); 
    header("Content-Disposition: attachment; filename=$filename"); 
    echo $out; 
    exit; 
} 
+0

不处理csv数据。将其转换回原生数据结构(例如数组)并在那里进行操作。你会为自己挽救很多头发。 –

+0

没有帮助的初学者 –

+2

http://php.net/fputcsv http://php.net/fgetcsv –

回答

1

首先,这将简化代码很多:

function exportMysqlToCsv($tablename,$filename = 'Results.csv') 
{ 
    $sql_query = "select * from $tablename where id=2"; 

    // Gets the data from the database 
    $result = mysql_query($sql_query); 

    $f = fopen('php://temp', 'wt'); 
    $first = true; 
    while ($row = mysql_fetch_assoc($result)) { 
     if ($first) { 
      fputcsv($f, array_keys($row)); 
      $first = false; 
     } 
     fputcsv($f, $row); 
    } // end while 

    $size = ftell($f); 
    rewind($f); 

    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Content-Length: $size"); 

// Output to browser with appropriate mime type, you choose ;) 
    header("Content-type: text/x-csv"); 
    header("Content-type: text/csv"); 
    header("Content-type: application/csv"); 
    header("Content-Disposition: attachment; filename=$filename"); 
    fpassthru($f); 
    exit; 
} 

什么你以后是pivot操作;不幸的是,如果不将所有行读入内存,然后应用转换,就无法做到这一点。

请参阅here的一些灵感。

+0

终于有些帮助!谢谢杰克! –