我使用这个简单的脚本从PHP导出到EXCEL文件:
<?php
header('Content-Type: text/csv;');
header('Content-Disposition: attachment; filename="TDO-2017-'. $_GET['lieu'].'.csv');
require('../scripts/lib.php');
?>
"NOM";"PRENOM";"E-MAIL";"TELEPHONE";"ADRESSE";"CODE POSTAL";"VILLE"
<?php
echo "\n";
$rq = mysqli_query($connexion, 'SELECT * FROM tui_inscription WHERE lieu = "'. $_GET['lieu'] .'" AND valid = 1');
while($d = mysqli_fetch_assoc($rq)) {
echo '"' . $d['nom'] . '";"' . $d['prenom'] . '";"' . $d['email'] . '";"' . str_replace("+33","0", $d['telephone']) . '";"' . $d['adresse'] . '";"' . $d['cpostal'] . '";"' . $d['ville'] . '"'."\n";
}
?>
它完美地完成了工作,唯一的问题是电话号码中的前导零消失。我已经看到很多关于如何使用其他库来确定单元格类型的解释,但由于我不知道PDO并且脚本已经有效,我首先想知道我是否有办法改变我的代码来做这个伎俩。
答案 0 :(得分:0)
根据评论,问题不在于CSV构造,而在于Excel的数据格式转换。 Excel自动将字段设置为数字,数字不具有前导零。根据Microsoft文档https://support.office.com/en-us/article/Keeping-leading-zeros-and-large-numbers-1bf7b935-36e1-4985-842f-5dfa51f85fe7?ui=en-US&rs=en-US&ad=US,您可以获得一个文本列,并在其前面加上引号。
您可以在数字前键入撇号(&#39;),Excel会将其视为文本。
所以:
echo '"' . $d['nom'] . '";"' . $d['prenom'] . '";"' . $d['email'] . '";"\'' . str_replace("+33","0", $d['telephone']) . '";"' . $d['adresse'] . '";"' . $d['cpostal'] . '";"' . $d['ville'] . '"'."\n";
应该适合你。
此外,您应该参数化您的查询,这样您就不会接受SQL注入:
答案 1 :(得分:0)
这是一个严重的问题。如果文本分隔符不再使字段被视为文本,那么就会出现问题。文本分隔符的用途不应限于转义常规字段分隔符。 我将ASCII代码160附加到任何文本字段。 它是法国金融数字组间隔。它看起来像一个空格,但不会被数据导入过程修剪。有了它,甚至引用都是无用的:无论如何,该字段将被视为文本! 使用该尾随字符,即使值为000234,我也会获得文本单元格。 我试过的任何其他解决方案都错过了一些东西。