【问题标题】:Add heading on csv using fputcsv php使用 fputcsv php 在 csv 上添加标题
【发布时间】:2017-08-03 15:51:13
【问题描述】:

我正在尝试将一些数据输入到 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);

编辑:

这是我用记事本打开的 csv 的第一行:

ID;姓名;参考;数量

2;"衬衫 - 颜色:白色,尺码:M";demo_2;6

3;"印花连衣裙 - 颜色:橙色,尺码:S";demo_3;4

【问题讨论】:

  • 你使用单引号和双引号的方式给我留下了精神创伤。您应该在不需要interpolation 的任何内容上使用单引号,在需要的任何内容上使用双引号。基本上,你所有的双引号在你的代码中都应该是单引号
  • 您能在文本编辑器中打开您的 csv 文件输出并与我们分享它的内容吗?也许只需要前 3-4 行就足够了
  • 是的,我知道,我最初有单引号,我从单引号更改为双引号只是为了检查它是否会由于某种原因使其工作,但事实并非如此。忘记改回来了。
  • @GrumpyCrouton 完成

标签: php csv fputcsv


【解决方案1】:

如果您打算使用它来创建可以用 Excel 正常打开的 CSV 文件,则标题不需要用双引号括起来(因为它们不包含任何分隔符),并且您应该使用逗号而不是分号作为分隔符。但是,如果您进行了这些更改,当您尝试使用 Excel 打开生成的文件时,您仍然会收到相同的错误消息。令人惊讶的是,这是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);

这应该会创建一个 .csv 文件,该文件将在 Excel 中正确打开。

【讨论】:

  • 哇!我无法想象是因为这个,现在工作得很好,谢谢!
【解决方案2】:

尝试将您的标题更改为:

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

这会将字符串用双引号括起来,这应该可以解决您遇到的语法问题。

【讨论】:

  • fputcsv 会因为字符串中的引号而添加额外的引号。
  • 我刚刚用 PHP 测试了一下,得到:"""ID""","""Name""","""Ref""","""Quantity"""
  • 谢谢!这行得通!正如@manassehkatz 所说,它将字符串用双引号括起来,但至少我可以访问该文件。
  • @Sefean 看看我的回答 - 基本上,如果你对标题行进行硬编码,你就可以得到它,加上逗号而不是分号使 Excel 工作更流畅一些。如果您实际上有很多字段,则切换回标题的数组,但制作自己的循环来输出它,而不是使用与 Excel 不完全兼容的 fputcsv 函数。
【解决方案3】:

Excel 很挑剔。 PHP 默认使用逗号,这实际上是您希望在 Excel 中使用的。分号通常可以使用,但不是默认值 - 请记住,CSV 代表 Comma 分隔值。第二个问题是 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);

【讨论】:

  • 我试过了,但没有用,它只将标题放在 Excel 的 1 个单元格中,如下所示:(每列由 '-' 分隔)ID;Name;Ref;Quantity 2 - NameWhatever - demo_1 - 2 3 - NameWhatever - demo_1 - 2
  • 您是否也将数据 fputcsv 更改为使用逗号(默认)而不是分号?如果你不这样做,那么 Excel 会感到困惑,尽管当我尝试这种方式时,我最终得到了标题 OK 和每行一个单元格的数据。
  • 是的,将所有内容更改为逗号使其仅写入第一列,因为 Excel 需要分号而不是逗号。
  • @Sefean 您使用的是什么版本的 Excel?
  • 我使用的是 Excel 2016
猜你喜欢
  • 2013-06-27
  • 2019-03-07
  • 1970-01-01
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
相关资源
最近更新 更多