为什么我在此CSV导出的顶部有一个空白行,以及如何删除它


 $conn = mysql_connect($entr,$user,$cred);          //Set db connection
 mysql_select_db("webshops",$conn);
 $result = mysql_query('CALL storedproc');    

 $num_column = mysql_num_fields($result);                 //Get number of columns, for each column header get name and give them individual columns.    
 for($i=0;$i<$num_column;$i++) {
     $csv_header .= '"' . mysql_field_name($result,$i) . '";';
 }  
 $csv_header .= "n";
 $csv_row ='';                               
 while($row = mysql_fetch_row($result)) {
     for($i=0;$i<$num_column;$i++) {
         $csv_row .= '"' . $row[$i] . '";';
     }
     $csv_row .= "n";
 }
 ob_end_clean();
 header('Content-type: application/csv');
 header('Content-Disposition: attachment; filename=OrderExport.csv');
 echo $csv_header . $csv_row;
 exit;

在以Excel下载并打开此CSV后,第一行总是空白的。标题在第二行开始。我如何防止这种情况发生并让标题在第一个开始?非常感谢。

您最好使用fputcsv http://php.net/manual/enual/en/function.fputcsv.php。我在下面更改了您的代码,但我无法测试它,因此它可能无法完美地工作,但希望它会给您一个想法。另外,正如其他人在评论中所说的那样,您不应该使用mysql,因为API已过时。您应该使用mysqli

 $conn = mysql_connect($entr,$user,$cred);          
 mysql_select_db("webshops",$conn);
 $result = mysql_query('CALL storedproc');    
 $num_column = mysql_num_fields($result);                    
 $fp = fopen('mycsv.csv', 'w');
 $csv_header = array();
 for($i=0;$i<$num_column;$i++) {
     array_push($csv_header, mysql_field_name($result,$i));
 }  
 fputcsv($fp, $csv_header);
 while($row = mysql_fetch_row($result)) {
     $csv_row = array();          
     for($i=0;$i<$num_column;$i++) {
         array_push($csv_row, $row[i]);
     }
     fputcsv($fp, $csv_row);
 }
 ob_end_clean();
 header('Content-type: application/csv');
 header('Content-Disposition: attachment; filename=OrderExport.csv');
 fclose($fp);
 exit;

以更可靠,更正确的方式输出存储过程的结果,使用mysqliPDO处理数据库操作以及内置的fputcsv,以专门为CSV输出格式化数据。

<?php
    /* File will be called this when it is downloaded */        
    $filename = 'mycsvfile.csv';
    /* create db connection using mysqli ( or PDO ) but not mysql */    
    $dbhost =   'localhost';
    $dbuser =   'root'; 
    $dbpwd  =   'xxx'; 
    $dbname =   'xxx';
    $conn   =   new mysqli( $dbhost, $dbuser, $dbpwd, $dbname );
    /* create sql query */
    $sql='call `storedproc`();';
    /* run the query */
    $result=$conn->query( $sql );
    if( $result ){
        /* store column names in this array - used to create csv headers */
        $cols=array();
        /* iterate through column names and add to array $cols */
        array_walk( $result->fetch_fields(), function( $value, $key, $cols ){
            $cols[]=$value->name;
        },&$cols );
        /* create an output stream to write csv to */
        $stream=fopen( 'php://output', 'w' );
        /* add column headers */
        fputcsv( $stream, $cols );
        /* iterate through the recordset returned by stored procedure */
        while( $rs=$result->fetch_assoc() ){
            fputcsv( $stream, array_values( $rs ) );
        }
        /* capture stream contents */
        $data=stream_get_contents( $stream );
        /* close the output stream */
        fclose( $stream );
        /* send headers and write content to browser */
        header('Content-Type: application/csv');
        header('Content-Disposition: attachment; filename=' . $filename );
        exit( $data );
    }
?>

最新更新