【问题标题】:Force new line in CSV generated file in PHP在 PHP 中强制在 CSV 生成的文件中换行
【发布时间】:2013-01-11 07:46:19
【问题描述】:

我正在用 PHP 生成一个 CSV 可下载文件。我有一个问题,当我在 MS Excell 或 Ubuntu Libre Office 中打开文件时,格式与预期不同。

我想要这个输出,但我不能强制从新行开始。

Name           Slope   Length   Size(Inches)      Max Length         Location                                       
Name1            5      150       12"                500            location1   
Name2            8      350       12"                400            location 2  
Name3           16      326       12"                400            location3 

这是我的 PHP 代码

        $csv_data[] = $_POST['name'][$i];
        $csv_data[] = $_POST['slope'][$i];
        $csv_data[] = $_POST['length'][$i];
        $csv_data[] = $size;
        $csv_data[] = $max_length;
        $csv_data[] = $_POST['location'][$i].PHP_EOLE;


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

    $output = fopen('php://output', 'w');
    fputcsv($output, array("Name", "Slope", "Length", "Size", "Max Length", "Location"));
    fputcsv($output, $csv_data);

但是这段代码输出是这样的:

Name    Slope   Length  Size    Max Slope Length    Location                                                
Name1   5   150 12" 500 location1   Name2   8   350 12" 400 location 2  Name3   16  326 12" 400 location3

【问题讨论】:

  • 在可以正确读取Unix或Windows换行符的编辑器中查看文件
  • 我在 MS WordPad 中读取了此输出,并且输出几乎与预期的一样,但我还需要它在 MS Excell 中也可以读取。
  • 尝试读取notepad.exe中的输出不是wordpad。请发布您的完整代码。
  • MS Excel 不在乎它是 \n\r、\r\n 还是简单的 \n,它应该适用于所有... WordPad !== MSExcel

标签: php file-io download fputcsv


【解决方案1】:

执行以下操作:

$csv_headers = array(array("Name", "Slope", "Length", "Size", "Max Length", "Location"));
$csv_full_data = array_merge($csv_headers, $csv_data);
var_dump($csv_full_data);
fputcsv($output, $csv_full_data);

并告诉我们输出。

【讨论】:

  • 我试着按照你的方式做,这是输出,它仍然在一行上 Array Name1 5 150 12" 500 location1 Name2 8 350 12" 400 location12 Name3 16 326 12" 400 location3 Name4 36 127 12" 400 位置4
  • 谢谢它对我不起作用,但它给了我一个想法,我解决了问题。
【解决方案2】:

我所做的是将$csv_data 数组设为二维而不是一维,然后使用foreach 循环。它有点慢,但对我有用。

这是更新的代码

    $csv_data[$i][] = $_POST['name'][$i];
    $csv_data[$i][] = $_POST['slope'][$i];
    $csv_data[$i][] = $_POST['length'][$i];
    $csv_data[$i][] = $size;
    $csv_data[$i][] = $max_length;
    $csv_data[$i][] = $_POST['location'][$i];

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

    $output = fopen('php://output', 'w');
    fputcsv($output, array("Name", "Slope", "Length", "Size", "Max Length", "Location"));
    foreach ($csv_data as $value) {
        fputcsv($output, $value);
    }

这是我需要的输出。

Name    Slope   Length  Size    Max Length  Location
Name1    5       150    12"        500      location1 
Name2    8       350    12"        400      location12
Name3    16      326    12"        400      location3 
Name4    36      127    12"        400      location4 

【讨论】:

    【解决方案3】:

    PHP_EOL 的值是什么,将其设为“\r\n”并尝试

    $csv_data[] = $_POST['location'][$i].PHP_EOL; change to 
    $csv_data[] = $_POST['location'][$i]."\r\n";
    

    【讨论】:

      猜你喜欢
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      • 2018-03-06
      • 1970-01-01
      • 2014-04-06
      • 2011-08-22
      • 2015-11-24
      • 1970-01-01
      相关资源
      最近更新 更多