1

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

我正在使用此代码

// 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
4

2 回答 2

0

未添加外壳,因为它们不是必需的。所有被包围的值都具有相同的特征:它们都有前导空格。

请记住,CSV 是一种定义非常不明确的格式。几乎任何东西都可以是 CSV。分隔符、外壳和转义字符没有很好地定义。

至于你得到的错误。也许 Excel 想要分号分隔的文件?制表符分隔有时似乎也有效。这取决于您的语言/区域设置。

于 2013-12-05T13:09:44.663 回答
0

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

  • 不需要括号(双引号)的字段没有双引号
  • 确实需要外壳的字段,拥有它们
  • 所有行中的所有字段都有所需的分隔符(逗号)

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

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

于 2013-12-05T13:14:05.550 回答