Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP为Mac用户编写CSV文件_Php_Mysql_Macos_Csv_Excel 2008 - Fatal编程技术网

使用PHP为Mac用户编写CSV文件

使用PHP为Mac用户编写CSV文件,php,mysql,macos,csv,excel-2008,Php,Mysql,Macos,Csv,Excel 2008,我使用一种通用算法来编写CSV文件,理论上它适用于主要操作系统。然而,该客户几周前开始使用Mac,他们一直告诉我,Mac12.2.1版的MicrosoftExcel2008无法读取CSV文件 他们将操作系统配置为使用分号;作为列表分隔符,这正是我在CSV中编写的内容。他们还说,当他们在记事本中打开文件时,他们注意到没有换行符,所有内容都显示在一行中;这就是Excel无法正确读取文件的原因;但在我的代码中,我使用了跨浏览器换行符\r\n 这是我使用的完整代码: header("Cache-Cont

我使用一种通用算法来编写CSV文件,理论上它适用于主要操作系统。然而,该客户几周前开始使用Mac,他们一直告诉我,Mac12.2.1版的MicrosoftExcel2008无法读取CSV文件

他们将操作系统配置为使用分号;作为列表分隔符,这正是我在CSV中编写的内容。他们还说,当他们在记事本中打开文件时,他们注意到没有换行符,所有内容都显示在一行中;这就是Excel无法正确读取文件的原因;但在我的代码中,我使用了跨浏览器换行符\r\n

这是我使用的完整代码:

header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
// Output to browser with appropriate mime type, you choose ;)
header("Content-type: text/x-csv");
//header("Content-type: text/csv");
//header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=participantes.csv");

$separator = ";";
$rs = $sql->doquery("SELECT A QUERY TO RETRIEVE DATA FROM THE DB");

$header = "";
$num_fields = mysql_num_fields($rs);

for($i=0; $i<$num_fields; $i++){
  $field = mysql_field_name($rs, $i);
  $header .= $field.$separator;
}

echo $header."\r\n";

while($row = $sql->fetch($rs)){
  $str = "";
  for($i=0; $i<$num_fields; $i++){
    $field = mysql_field_name($rs, $i);
    $value = str_replace(";", ",", $row->{$field});
    $value = str_replace("\n", ",", $value);
    $value = str_replace("\d", ",", $value);
    $value = str_replace(chr(13), ",", $value);
    $str .= $value.$separator;
  }
  echo $str."\r\n";
}

为了让Mac用户能够正确读取文件,我可以做些什么吗?

以下是我将制表符分隔的数据转换为CSV的一些代码,它在我的Mac上运行良好。请注意,我将其设置为单击下载,而不是将其推送到浏览器。这不是一个很好的解决方案,我很确定代码是垃圾,但它能满足我的需要

$input = $_POST['input'];
//Remove commas.
$replacedinput1 = str_replace(",", "-", $input);
//remove tabs, replace with commas
$replacedinput2 = str_replace(" ", ",", $replacedinput1);
//create an array
$explodedinput = explode("
", $replacedinput2);
//open the CSV file to write to; delete other text in it
$opencsvfile = fopen("/var/www/main/tools/replace_tab.csv","w+");
//for each line in the array, write it to the file
foreach($explodedinput as $line) {
fputcsv ($opencsvfile, split(',', $line));
};
//close the file
fclose($opencsvfile);
//have the user download the file.
/*
header('Pragma: public');
header('Expires: Fri, 01 Jan 2010 00:00:00 GMT');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Type: application/csv');
header('Content-Disposition: filename=replace_tab.csv'); */

//Or not, since I can't get it to work.
echo "<a href='replace_tab.csv'>Download CSV File, then open in Numbers or Excel (Note, you may need to right click, save as.)</a>.";

出于调试目的:

创建一个CSV文件并通过邮件发送给他们。他们能打开它吗? 让他们从您的页面下载文件并将其发送回您。在十六进制编辑器中比较这些文件,以排除它们与您发送到浏览器或保存的文件外观不同的可能性。 让他们再次检查Excel设置。 让他们在mac上从头开始创建一个可工作的CSV文件文本编辑器,并找出与您方法的任何差异。
Mac中的换行符是LF unicode U+000A,Windows中的换行符是CR+LF unicode U+000D,后跟U+000A

也许这就是为什么在Mac上无法读取csv