私はレポート用に作成したウェブサイトを持っています。基本的に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);
はまだ私に空白のスプレッドシートを与えます。だから明らかに私はまだ何か間違っているのですか?
MS Excelは、IDで始まるファイルをSYLK形式のマルチパートファイルとして認識します。 PHPの組み込み関数fputcsv()を使用してファイルを書いたり、見出しの値を 'ID'以外のものに変更したりすると起こります –
PHPの組み込み関数[fputcsv()]を使うと、 (http://www.php.net/manual/en/function.fputcsv.php)関数は、文字列に '、'文字が含まれているとエラーが発生しないことを保証します。そうしないと、自作バージョンが破損します –
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