2016-08-01 6 views
0

Ich habe eine Website, die ich für Berichte erstellt habe. Es gibt grundsätzlich 3 Berichte. Ich habe eine Schaltfläche auf jeder Seite, die eine andere PHP-Seite aufruft, die die Ergebnisse der Abfrage, die die Seite füllt, in eine CSV-Datei lädt. Dies funktioniert auf einer Seite gut, aber auf den anderen zwei gibt es mir einen Fehler beim Öffnen versuchen. Es sagt:CSV Download funktioniert nicht für alle Seiten

Das Dateiformat und die Erweiterung von 'FileName' stimmen nicht überein. Die Datei könnte beschädigt oder unsicher sein. Wenn Sie der Quelle nicht vertrauen, öffnen Sie sie nicht. Willst du es trotzdem öffnen?

ich auf ja, dann diese:

Excel hat erkannt, dass ‚Dateiname‘ ist eine SYLK-Datei, aber es kann nicht geladen werden. Entweder hat die Datei Fehler oder ist kein SYLK-Dateiformat. Klicken Sie auf OK, um zu versuchen, die Datei in einem anderen Format zu öffnen.

Ich klicke OK und es öffnet sich gut.

Wo auf der anderen Seite es nur öffnet.

Hier ist der größte Teil der ExportToExcel.php

switch ($_POST['ExportToExcel']) 
{ 
    case "QDef": 
     $tsql = "select Id,QSrc,QName,QDef,isActive,RunReport,FilePath from pmdb.v_QDefs order by Id"; 

     $hsql = "select Headings from TableHeadings where TableName = 'v_QDefs' and Headings != 'Edit' order by ID"; 

     break; 
    case "TableUpdates": 
     $tsql = "select ID, TableName, UpdateDate from pmdb.TableUpdates order by UpdateDate"; 
     $hsql = "select Headings from TableHeadings where TableName = 'TableUpdates' and Headings != 'Edit' order by ID"; 
     break; 
} 

$filename = $_POST['ExportToExcel']; 

header("Content-Type: application/x-csv"); 
header("Content-Disposition: attachment; filename=$filename.csv"); 
//define separators (defines columns in excel) 
$sep = ","; 
$br = "\r\n"; //line break 

$getHeadings = $conn->query($hsql); 
$rHeadings = $getHeadings->fetchALL(PDO::FETCH_ASSOC); 

$headings = array(); 
$NumHeadings = count($rHeadings); 

for ($i = 0;$i < $NumHeadings; $i++) 
{ 
    $headings[] = $rHeadings[$i]["Headings"]; 
} 
//start of printing column names as names of SQL fields 
foreach($headings as $Heading => $value) 
{ 
    echo "$value" . $sep; 
} 
//end of printing column names 
echo $br; //separate the headers and the data 

foreach($conn->query($tsql) as $row) 
{ 
    for ($i = 0;$i < $NumHeadings;$i++) 
    { 
     $CommentPos = strpos($rHeadings[$i]["Headings"],"comment"); 
     $NewLines = array("\r\n","\n\r","\n","\r"); 
     $UseValue = str_replace($NewLines, " ",$row[$i]); 
     $UseValue = str_replace('"', "'",$row[$i]); 
     $pos = strpos($UseValue,","); 
     if ($CommentPos === FALSE || $pos === FALSE || isset($UseValue)) 
     { 
      echo '"' . $UseValue . '"' . $sep; 
     } 
     else 
     { 
      echo $UseValue . $sep . "Not quoted"; 
     } 
    } 
    echo $br; 
} 

Ich habe einen include an der Spitze, die die Verbindungszeichenfolge für den Anschluss an meine MSSQL DB hat, die funktioniert, oder es würde nichts auf die angezeigt werden Seite zu beginnen mit.

Ich finde nur heraus, warum die Seite nicht für alle Berichte gleich funktioniert, wenn sie die Seite auf die gleiche Weise aufrufen.

EDIT wieder

Ich habe versucht, einige Ideen von unten und jetzt habe ich dies:

$filename = $_POST['ExportToExcel'] . '.csv'; 

$Opened = fopen($filename,'w'); 

header("Content-Type: text/csv; charset=utf-8'"); 
header("Content-Disposition: attachment; filename=$filename"); 

fputcsv($Opened,$headings); 

foreach($conn->query($tsql) as $row) 
{ 
    fputcsv($Opened,$row); 
} 
fclose($Opened); 

Welche noch gibt mir eine leere Tabelle. Also mache ich offensichtlich immer noch etwas falsch?

+0

MS Excel erkennt jede Datei, die mit "ID" beginnt, als eine SYNK-Format-Multiplan-Datei; zitieren Sie entweder Ihre Strings (was passieren würde, wenn Sie die PHP 'eingebaute' fputcsv() 'Funktion verwenden würden, um Ihre Datei zu schreiben, oder den Überschriftswert auf etwas anderes als 'ID' zu ändern. –

+0

Mit PHP eingebaut [fputcsv()] (http://www.php.net/manual/en/function.fputcsv.php) Funktion wird auch sicherstellen, dass Sie keine Fehler finden, wenn Ihre Zeichenfolgen ein ',' Zeichen enthalten, andernfalls wird Ihre Homebrew-Version –

+0

brechen Bitte beachten Sie, dass CSV nicht unbedingt an Excel gebunden ist, sondern lediglich die Abkürzung für ** c ** omma - ** s ** eparated ** v ** alues. Ihr HTTP-Header/MIME-Typ ist nicht wirklich falsch, Sie verwenden 'application/x-csv' Aber der RFC sagt' text/csv' für einfache CSV-Dateien Wenn Sie es als Excel-Tabelle deklarieren möchten, können Sie auch 'application/vnd.ms-excel' verwenden für XLS-Dateien oder 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' für XLSX-Dateien. – Paul

Antwort

0

Nevermind, aktualisierte ich die Überschriften für alle Tabellen, die ich exportieren möchte, so dass die erste Spalte nicht mehr ID ist, sondern stattdessen Id. Da es nicht mehr alles ist, funktioniert es ohne die fputcsv gut, da das nichts für mich tut.

$filename = $_POST['ExportToExcel'] . '.csv'; 

header("Content-Type: text/csv; charset=utf-8'"); 
header("Content-Disposition: attachment; filename=$filename"); 

//define separators (defines columns in excel) 
$sep = ","; 
$br = "\r\n"; //line break 

$getHeadings = $conn->query($hsql); 
$rHeadings = $getHeadings->fetchALL(PDO::FETCH_ASSOC); 

$headings = array(); 
$NumHeadings = count($rHeadings); 

for ($i = 0;$i < $NumHeadings; $i++) 
{ 
    $headings[] = $rHeadings[$i]["Headings"]; 
} 

//start of printing column names as names of SQL fields 
foreach($headings as $Heading => $value) 
{ 
    echo "$value" . $sep; 

} 

foreach($conn->query($tsql) as $row) 
{ 
    for ($i = 0;$i < $NumHeadings;$i++) 
    { 
     $CommentPos = strpos($rHeadings[$i]["Headings"],"comment"); 
     $NewLines = array("\r\n","\n\r","\n","\r"); 
     $UseValue = str_replace($NewLines, " ",$row[$i]); 
     $UseValue = str_replace('"', "'",$row[$i]); 
     $pos = strpos($UseValue,","); 
     if ($CommentPos === FALSE || $pos === FALSE || isset($UseValue)) 
     { 
      echo '"' . $UseValue . '"' . $sep; 
     } 
     else 
     { 
      echo $UseValue . $sep . "Not quoted"; 
     } 
    } 
echo $br; 
}