2016-08-01 7 views
0

私はレポート用に作成したウェブサイトを持っています。基本的に3つのレポートがあります。私は各ページに別のPHPページを呼び出すボタンを持っており、ページをCSVファイルに埋め込むクエリの結果をダウンロードします。これは1ページでうまく動作しますが、他の2ページでは開こうとするとエラーが表示されます。それは言う:CSVはすべてのページでダウンロードできません

'FileName'のファイル形式と拡張子が一致しません。ファイルが破損しているか、安全でない可能性があります。ソースを信頼しない限り、オープンしないでください。とにかくそれを開きたいですか?

私は[はい]をクリックし、その後、これを取得:

Excelは、「ファイル名が」SYLKファイルであるが、それを読み込むことができないことを検出しました。ファイルにエラーがあるか、SYLKファイル形式ではありません。 [OK]をクリックして、別の形式でファイルを開こうとします。

OKをクリックしてください。

他のページと同じように開きます。

ここで私は仕事をして私のMSSQL DBに接続するための接続文字列を持って先頭にincludeを持っている、または上に表示何もないと思います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; 
} 

のほとんどです最初にページを開きます。

私は、すべてのレポートが同じ方法でページを呼び出しているときに、ページが同じ方法で動作しない理由を理解できません。

EDIT再び

私は下からのいくつかのアイデアを試してみましたが、今、私はこれを持っている:

$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); 

はまだ私に空白のスプレッドシートを与えます。だから明らかに私はまだ何か間違っているのですか?

+0

MS Excelは、IDで始まるファイルをSYLK形式のマルチパートファイルとして認識します。 PHPの組み込み関数fputcsv()を使用してファイルを書いたり、見出しの値を 'ID'以外のものに変更したりすると起こります –

+0

PHPの組み込み関数[fputcsv()]を使うと、 (http://www.php.net/manual/en/function.fputcsv.php)関数は、文字列に '、'文字が含まれているとエラーが発生しないことを保証します。そうしないと、自作バージョンが破損します –

+0

CSVは必ずしもExcelにバインドされているわけではなく、** c ** omma - ** s ** eparated ** v ** aluesの略語です。あなたのHTTPヘッダー/ MIMEタイプは間違っていません。 'application/x-csv'ですが、RFCはプレーンなCSVファイルに' text/csv'を使用すると言います Excelシートとして宣言したい場合は、 'application/vnd.ms-excel' XLSファイルまたは 'application/vnd 'の場合openxmlformats-officedocument.spreadsheetml.sheet'(XLSXファイル用) – Paul

答えて

0

Nevermind、最初の列がもうIDでなく、代わりにIdになるように、エクスポートしようとしているすべての表の見出しを更新しました。なぜなら、それはもはや私のために何もしていないので、それはもはやすべての大文字ではないので、fputcsvなしでうまくいきます。

関連する問題