我正在尝试将从SQL查询中获取的数据写入制表符分隔的文本文件。但是存在一个问题,如果存在空白单元格,则该单元格不会注册。并在空白单元格中写入下一个文本。
数据库数据:
id text 2ndText
1 1t1 2t1
2 2t2
3 1t3 2t3
excel输出:
id text 2ndText
1 1t1 2t1
2 2t2
3 1t3 2t3
我们正在使用的代码是这样:
while ($row=mysql_fetch_row($Recordset1))
{
$line='';
$fc=0;
for ($i=0;$i<$fields;$i++)
{
if (substr(strtoupper(mysql_field_name($Recordset1,$i)),0,7)!="DBSTACK")
{
if (strtoupper($_POST['checkbox'.$fc])==strtoupper(mysql_field_name($Recordset1,$i)))
{
$value=$row[$i];
if ((!isset($value)) | ($value == ""))
{
$value = "\t";
} else
{
$value=str_replace('"','""',$value);
$value='"'.$value.'"'."\t";
}
$line.=$value;
}
$fc++;
}
}
$data.=trim($line)."\n";
}
$data=str_replace("\r","",$data);
$TargetFileName="temp/".session_id().time().".xls";
$target=fopen($TargetFileName,"wb");
$XLData=$header."\n".$data;
fwrite($target,$XLData);
fclose($target);
其中$Recordset1
是查询的结果
在我寻找解决方案this时,它是可能的解决方案,但这是一段经常使用的代码,因此我不希望它改变太多。有没有更简单的解决方案?
如果单元格为空,则将值更改为na \ t可能是一种解决方案,但这有点脏。
有什么想法吗?
答案 0 :(得分:1)
我不会用十英尺高的杆触碰您的数据库代码。您使用的数据库API已被弃用多年;替代方法已经存在了十年。 Use them。
因此,我的第一个建议是使用适当的数据库API,该API返回由列名索引的行数组。更容易遍历。
我还建议您的数据库查询仅选择所需的列,而不要选择SELECT *
。
如果您想编写CSV文件(从技术上来说是TSV,但这很好),则应使用built-in function fputcsv()
,这样可以避免您不得不滚动自己的CSV编写器,并允许您使用数组而不是数组字符串。
您还应使用csv
扩展名保存它,以免在尝试在Excel中打开它时出错。
但是,关于您所问的问题?当字段为空时,您不是在写值,只是制表符分隔符。怎么样:
if ((!isset($value)) | ($value == "")) {
$value = "\"\"\t";
}
将始终设置PS $value
,因为您在上面的行中进行了设置。