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_string1,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 回显到输出缓冲区的问题是另一个问题的主题。

问题是数据被输出为单引号字符串,所以我不得不用双引号替换单引号返回。

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

我已经阅读了您的问题下的评论,但我真的不明白,为什么您打开文件,保存对 的引用$fp,然后$data从您的 CSV 中回显,而不是使用函数fputs

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 回答