php fwrite到xls文件空白单元格没有显示出来

问题描述 投票:0回答:1

我正在尝试将我从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,可能是一种解决方案,但这有点脏。

有任何想法吗?

php excel
1个回答
1
投票

我不会用10英尺的杆子触碰你的数据库代码。您使用的数据库API已被弃用多年;替代品已经有十年了。 Use them

所以我的第一个建议是使用一个适当的数据库API,它返回一个按列名索引的行数组。更容易循环。

我还建议你的数据库查询只选择你需要的列而不是SELECT *

如果你想写一个CSV文件(技术上是一个TSV,但没关系)你应该使用built-in function fputcsv()来节省你必须滚动自己的CSV编写器,并允许你使用数组而不是字符串。

您还应该使用csv扩展名保存它,以避免在尝试在Excel中打开它时出错。

但是,关于你问的问题呢?当有一个空字段时,你不会写一个值,只是一个制表符分隔符。怎么样:

if ((!isset($value)) | ($value == "")) { 
    $value = "\"\"\t"; 
}

PS $value将始终设置,因为您在上面的行中设置它。

© www.soinside.com 2019 - 2024. All rights reserved.