2009-03-28 5 views
0

Ich habe eine Funktion, die eine Tabelle in eine CSV-Datei exportiert, dann öffne ich diese Datei mit einer Tabellenkalkulationsanwendung.Brauchen Kopfzeilen in CSV geeignet, anstatt Tabellenspalte Header

Gibt es eine Möglichkeit, den Header der CSV-Datei so festzulegen, dass jede Spalte entsprechend benannt wird.

Zum Beispiel:

Ich habe eine Tabelle, den Vornamen, Nachnamen, E-Mail und Kommentare enthält.

Und der Tabelle wird als: fname, lname, E-Mail, kommentiert

So sind die Tabelle Exporte:

fname, lname, email, comments 
john, doe, [email protected], I am John Doe this is my comment 

Ich möchte die Header ändern (fname, lname, E-Mail, Kommentare) um etwas mehr lesbar, so würde es so aussehen:

First Name, Last Name, Email, Comments 
john, doe, [email protected], I am John Doe this is my comment 

Hier ist der Code, den ich habe:

function exportNamesCommentsCSV($table,$filename = 'volunteer_2009_comments.csv') { 
    $csv_terminated = "\n"; 
    $csv_separator = ","; 
    $csv_enclosed = '"'; 
    $csv_escaped = "\\"; 
    $sql_query = "select lname, fname, comments from volunteers_2009"; 

    // 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)); 
    header("Content-type: text/x-csv"); 
    header("Content-Disposition: attachment; filename=$filename"); 
    echo $out; 
    exit; 
} 
+0

die Spalten in Ihrer Abfrage in der richtigen Reihenfolge sind? Sollte es fname gefolgt von lname stattdessen sein. – stukelly

Antwort

2

Der Header einer CSV-Datei ist nur die erste Zeile. Also würden Sie diesen Block ändern:

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; 

Man könnte es zu etwas ändern ist sehr einfach, entlang der Linien von:

$out .= "First Name, Last Name, Email, Comments\n"; 

, wenn ich in deine Frage falsch verstanden haben.

Bearbeiten: Ihr Beispielcode zeigt eine bestimmte Abfrage. Wenn es für mehrere Abfragen funktionieren muss, müssen Sie eine Quelle dieser Anzeigenamen finden. Beispielsweise könnten Sie die Namen als Argument übergeben oder store them in the database.

2

Sie können die Abfrage ändern, um die Feldnamen nach Bedarf umzubenennen.

$sql_query = "select lname, fname, comments from volunteers_2009"; 

Wird

$sql_query = "select fname as 'First Name', lname as 'Last Name'," 
      . "Comments from volunteers_2009";