从 PHP 导出到 EXCEL 时,如何在单元格中保留 "zeros"?
How to keep "zeros" in cells when exporting from PHP to EXCEL?
我正在使用这个简单的脚本从 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";
}
?>
它完美地完成了工作,唯一的问题是 phone 数字中的前导零消失了。我已经看到很多关于如何使用其他库来确定单元格类型的解释,但是由于我不知道 PDO 并且脚本已经可以运行,所以我首先想知道是否有一种方法可以更改我的代码来执行把戏。
根据评论,问题不在 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,您可以获得一列以文本开头的引号。
You can type an apostrophe (') in front of the number, and Excel will treat it as text.
所以:
echo '"' . $d['nom'] . '";"' . $d['prenom'] . '";"' . $d['email'] . '";"\'' . str_replace("+33","0", $d['telephone']) . '";"' . $d['adresse'] . '";"' . $d['cpostal'] . '";"' . $d['ville'] . '"'."\n";
应该适合你。
此外,您应该参数化您的查询,这样您就不会受到 SQL 注入:
你应该使用 PHP 内置的 CSV 生成器:
这是一个严重的问题。如果文本定界符不再使字段被视为文本,那么就会出现问题。文本定界符的用途不应仅限于转义一般字段定界符。
我将 ASCII 代码 160 附加到任何文本字段。
它是法国金融数字组 spacer。它看起来像 space,但它没有被数据导入过程修剪。这样,即使引号也没有用:该字段无论如何都会被视为文本!
使用那个尾随字符,即使值为 000234,我也会得到文本单元格。
我尝试过的任何其他解决方案都遗漏了一些东西。
嗯,在table<td>
标签里加个简单的
就可以把数字转成文字了。
我正在使用这个简单的脚本从 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";
}
?>
它完美地完成了工作,唯一的问题是 phone 数字中的前导零消失了。我已经看到很多关于如何使用其他库来确定单元格类型的解释,但是由于我不知道 PDO 并且脚本已经可以运行,所以我首先想知道是否有一种方法可以更改我的代码来执行把戏。
根据评论,问题不在 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,您可以获得一列以文本开头的引号。
You can type an apostrophe (') in front of the number, and Excel will treat it as text.
所以:
echo '"' . $d['nom'] . '";"' . $d['prenom'] . '";"' . $d['email'] . '";"\'' . str_replace("+33","0", $d['telephone']) . '";"' . $d['adresse'] . '";"' . $d['cpostal'] . '";"' . $d['ville'] . '"'."\n";
应该适合你。
此外,您应该参数化您的查询,这样您就不会受到 SQL 注入:
你应该使用 PHP 内置的 CSV 生成器:
这是一个严重的问题。如果文本定界符不再使字段被视为文本,那么就会出现问题。文本定界符的用途不应仅限于转义一般字段定界符。 我将 ASCII 代码 160 附加到任何文本字段。 它是法国金融数字组 spacer。它看起来像 space,但它没有被数据导入过程修剪。这样,即使引号也没有用:该字段无论如何都会被视为文本! 使用那个尾随字符,即使值为 000234,我也会得到文本单元格。 我尝试过的任何其他解决方案都遗漏了一些东西。
嗯,在table<td>
标签里加个简单的
就可以把数字转成文字了。