0

ユーザーがオンザフライで作成されたcsvをダウンロードできるようにする必要があるプラグインを作成しています(サーバースペースを使い果たしたくありません)。csv に出力する必要があるテキストをフォームの隠し要素にピン留めし、それをエコーし​​て fopen と fclose を使用して csv を作成します。問題は、新しい行が解析されていないことです。スラッシュを追加し、変数を二重引用符で閉じ、出力バッファリングを試みました。また、auto_detect_line_endings を true に設定しました。これが私のコードです。

header('Content-Type: application/excel');
header('Content-Disposition: attachment; filename="sample.csv"');
$fp = fopen('php://output', 'w');
$data = $_POST['csv_holder'];
echo $data;
fclose($fp);

そしてhtml:

<form id = 'wcds_$post_id_csv_download' action ='$download_file' method='post'><input   type ='hidden' name = 'csv_holder' id ='wcds_download_csv_$post_id_value' value ='$wcds_item_details_string'><input type ='submit' id ='wcds_download_csv_$post_id' class ='wcds_download_button'</form>

$wcds_item_details_string:1,2,3\r\n4,5,6\r\n7,8,9

$wcds_item_details_string = get_the_content();
    //sanitise for html
    $wcds_item_details_string = htmlspecialchars ( $wcds_item_details_string, ENT_QUOTES );

文字列置換を試みました:

$replace = '&#92';
    $backslash = '\\';
    $wcds_item_details_string = str_replace( $backslash, $replace, $wcds_item_details_string );

データベースは変数を単一引用符で囲まれた文字列として返していました。改行を二重引用符に変更するには、文字列置換を使用する必要がありました。最終的なコード:

header('Content-Type: application/excel');
header('Content-Disposition: attachment; filename="sample.csv"');
$fp = fopen('php://output', 'w');
$data = $_POST['csv_holder'];
    $data= str_replace(  '\r\n', "\r\n", $data );
echo "{$data}";
fclose($fp);

それが誰かを助けることを願っています!

4

2 に答える 2

0

これが私の問題を解決したので、これを答えとして投稿しています。出力バッファへの fputs over echoing に関する問題は、別の質問の対象です。

問題は、データが一重引用符で囲まれた文字列として出力されていたため、一重引用符で囲まれた戻り値を二重引用符で囲まれたものに置き換える必要があったことです。

header('Content-Type: application/excel');
header('Content-Disposition: attachment; filename="sample.csv"');
$fp = fopen('php://output', 'w');
$data = $_POST['csv_holder'];
$data= str_replace(  '\r\n', "\r\n", $data );
echo "{$data}";
fclose($fp);

それが誰かを助けることを願っています!

于 2013-11-13T10:30:01.957 に答える
0

あなたの質問の下にコメントを読みましたが、関数を使用する代わりに、なぜファイルを開き、への参照を保存し、CSV から$fpエコーするのか、本当にわかりません。$datafputs

header('Content-Type: application/excel');
header('Content-Disposition: attachment; filename="sample.csv"');
$fp = fopen('php://output', 'w');
$data = $_POST['csv_holder'];
$data= str_replace(  '\r\n', "\r\n", $data );
echo "{$data}";
fclose($fp);

これを試して:

header('Content-Type: application/excel');
header('Content-Disposition: attachment; filename="sample.csv"');
$fp = fopen('php://output', 'w');
$data = $_POST['csv_holder'];
$data= str_replace(  '\r\n', "\r\n", $data );
fputs($fp, $data);
fclose($fp);

または、CSVデータを保存するオプションがあります。この機能を使用できます:

function outputCSV($data) {
  $fp = fopen("php://output", 'w');

  function __outputCSV(&$vals, $key, $filehandler) {
    fputcsv($filehandler, $vals, ';', '"');
  }

  array_walk($data, '__outputCSV', $fp);

  fclose($fp);
}
于 2013-11-05T08:26:27.527 に答える