PHP fputcsv()创建一个CSV导入Outlook联系人

时间:2013-12-05 13:06:40

标签: php csv encoding outlook fputcsv

我从数据库中获取值并将它们插入csv文件以下载并导入到Outlook中。

我正在使用此代码

// output headers so that the file is downloaded rather than displayed
$today = date("m.d.y");
header('Content-Type: text/csv;');
header('Content-Disposition: attachment; filename='.$today.'-allowners.csv');

// create a file pointer connected to the output stream
$output = fopen('php://output', 'w');

// output the column headings
fputcsv($output, array('firstname', 'lastname', 'email'));

// fetch the data
$rows = mysql_query('SELECT first_name, last_name, email FROM owners');

// loop over the rows, outputting them
while ($row = mysql_fetch_assoc($rows)) fputcsv($output, $row);

我得到了奇怪的结果,首先列标题没有分隔符,其次不是数据库中的所有字段都用'“'分隔。 输出如下:

firstname,lastname,email
" aaaaa"," bbbbb",0000
" aaaaa"," bbbbb"," 0000"
"aaaaa ",bbbbb,000@00000.com
 aaaaa,bbbbb,000.00.0@00000.com
" aaaaa"," bbbbb"," 000.00000@00000.com"
" aaaaa"," bbbbb"," 000000@000000.com"

当尝试导入Outlook时,它会给我一个错误,指出该文件无效或正被另一个应用程序或进程使用。

---------------解---------------

问题是使用在Linux上运行的php创建的文件的换行结束在Windows系统中打开,这并不总是在某些软件中引起麻烦,但由于它是MS Outlook,它们看起来非常严格。我测试了用excel打开文件并保存为CSV覆盖现有文件,它没有问题。

解决方案可以在以下其他问题答案的网址中找到。

http://stackoverflow.com/a/12723639/2633609

2 个答案:

答案 0 :(得分:0)

不添加机箱,因为它们不需要。所包含的所有值都具有相同的特征:它们具有前导空格。

请记住,CSV是一种定义非常糟糕的格式。几乎任何东西都可以是CSV。分隔符,附件和转义字符的定义不明确。

至于你得到的错误。也许Excel需要分号分隔文件?分离标签似乎也有时起作用。这取决于您的语言/区域设置。

答案 1 :(得分:0)

在示例输出中,您提供了没有任何格式问题:

  • 不需要附件(双引号)的字段没有双引号
  • 需要附件的字段,包含它们
  • 所有行中的所有字段都具有所需的分隔符(逗号)

给出的示例是有效的CSV输出,并与此处的文档一致:php.net/manual/en/function.fputcsv.php

最强烈的怀疑是文件未在脚本末尾用fclose正确关闭。