代码之家  ›  专栏  ›  技术社区  ›  Sefean

使用fputcsv php在csv上添加标题

  •  1
  • Sefean  · 技术社区  · 7 年前

    我试图将一些数据输入到csv文件中,效果很好,但如果我尝试添加数据表的标题,Excel将不允许我打开该文件,因为“file.csv的文件格式和扩展名不匹配。该文件可能已损坏或不安全”。

    //crate headers
    $headers[] = "ID";
    $headers[] = "Name";
    $headers[] = "Ref";
    $headers[] = "Quantity";
    
    // crete and open file  
    $csvName = "file.csv";
    $fileHandle = fopen($csvName, 'w') or die('Can\'t create .csv file, try again later.');
    
    //Add the headers, if I take this line out the excel allows me to open the file
    fputcsv($fileHandle,$headers,";");
    
    //Add the data
    for($i = 0; $i < count($info); ++$i) {
        fputcsv($fileHandle,$info[$i],";");
    }
    
    //close file
    fclose($fileHandle);
    

    编辑:

    身份证件名称裁判;量

    3.“印花连衣裙-颜色:橙色,尺码:S”;演示3;4.

    3 回复  |  直到 7 年前
        1
  •  5
  •   Don't Panic    7 年前

    如果您打算使用它来创建一个可以用Excel正常打开的CSV文件,则标题不需要用双引号括起来(因为它们不包含任何分隔符),并且应该使用逗号而不是分号作为分隔符。然而,如果你做出这些改变, 您仍然会收到相同的错误消息 because your headers start with 'ID'

    如果您可以为第一列标题使用不同的名称,则可以简化一些事情。

    $headers = ["ItemID", "Name", "Ref", "Quantity"];
    
    $csvName = "file.csv";
    $fileHandle = fopen($csvName, 'w') or die('Can\'t create .csv file, try again later.');
    
    //Add the headers
    fputcsv($fileHandle, $headers);
    
    //Add the data
    foreach ($info as $item) {
        fputcsv($fileHandle, $item);
    }
    
    //close file
    fclose($fileHandle);
    

        2
  •  1
  •   GrumpyCrouton    7 年前

    尝试将标题更改为:

    $headers[] = '"ID"';
    $headers[] = '"Name"';
    $headers[] = '"Ref"';
    $headers[] = '"Quantity"';
    

    这将用双引号将字符串括起来,这将修复您遇到的语法问题。

        3
  •  0
  •   manassehkatz-Moving 2 Codidact    7 年前

    Excel很挑剔。默认情况下,PHP使用逗号,这实际上是您想要在Excel中使用的。分号通常有效,但不是默认值-请记住,CSV代表 分隔值。第二个问题是Excel特有的。即使它在数据部分处理不带引号的字符串很好,但由于某些原因,它在标题行上工作不好。我在fputcsv中看不到强制引用的选项,因此需要对其进行硬编码。类似于:

    // create and open file  
    $csvName = "file.csv";
    $fileHandle = fopen($csvName, 'w') or die("Can't create .csv file, try again later.");
    
    //Add the headers - note that \r\n or \n is OS dependent
    fwrite($fileHandle,'"ID","Name","Ref","Quantity"' . "\r\n");
    
    //Add the data
    for ($i = 0; $i < count($info); ++$i) {
        fputcsv($fileHandle,$info[$i]);
    }
    
    //close file
    fclose($fileHandle);