1屈芜、把數(shù)據(jù)寫成csv格式文件拍棕。
- csv文件可以直接用Excel打開揪荣。
- 寫csv文件的效率和寫txt文件的效率一樣高宇葱。
- 同樣的數(shù)據(jù)內(nèi)容瘦真,生成的csv文件的大小遠(yuǎn)遠(yuǎn)小于生成的Excel文件。
從以上優(yōu)點(diǎn)就可以看出生成csv文件消耗的內(nèi)存絕對(duì)小于生成Excel文件黍瞧。
2诸尽、按一定的格式去生成csv文件,在Excel中打開的時(shí)候就是完整的行和列格式印颤。
3您机、同樣的數(shù)據(jù)內(nèi)容,csv文件和Excel文件的大小對(duì)比:
導(dǎo)出excel不能流式處理,導(dǎo)致占用比較大的內(nèi)存际看,很容易導(dǎo)致內(nèi)存溢出咸产;并且excel的數(shù)據(jù)量是有限制的,不能超過65536行仲闽。一旦超過脑溢,將無法生成excel文件。
csv方式導(dǎo)出蔼囊,則可以像導(dǎo)出txt一樣焚志,以文本流的方式進(jìn)行流式處理,不但能導(dǎo)出海量信息畏鼓,而且流式處理占用內(nèi)存極低酱酬,服務(wù)器對(duì)瀏覽器的響應(yīng)也是非常迅速的。輕松導(dǎo)出幾百萬行數(shù)據(jù)云矫,理論上是不限量的膳沽。
不過,csv方式導(dǎo)出也存在問題:
首先让禀,如果用excel來打開csv挑社,超過65536行的數(shù)據(jù)都會(huì)看不見,這是excel程序的問題巡揍。
其次痛阻,如果你要導(dǎo)出一個(gè)身份證號(hào)碼,手機(jī)號(hào)碼腮敌,郵政編碼等阱当,純數(shù)字構(gòu)成的字符串,在excel中打開csv時(shí)糜工,這些字段很容易被識(shí)別成數(shù)字弊添,造成誤解。我一般加上"\t"捌木,也有人加" ' "單引號(hào) 油坝。
總體而言,本人傾向于csv格式刨裆。
導(dǎo)出日期可以通過轉(zhuǎn)化
//EXCEL中 1970-1-1 代表的數(shù)字 25569澈圈。
//從1900-1-1日開始算的單位是天數(shù)。并且減去東八區(qū)的秒數(shù)
$time = ($v[7] - 25569) * 24 * 60 * 60 - 8 * 60 * 60;
$create_time = date('Y-m-d H:i:s', $time);//更新日期
示例:
<?php
/**
* 如果是文件較大,可以先生成臨時(shí)文件,后下載
*/
$data = [
[
'ID',
'用戶名',
'郵箱',
'地址',
'電話',
'身份證',
'注冊(cè)時(shí)間'
],
[
'1',
'jack',
'jack@gmail.com',
'beijing',
"\t13812345678",
'61044119808080X',
"20170101-00:00:00",
],
];
$fileName = '會(huì)員信息_' . date('YmdHis') . '.csv';
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=' . $fileName);
$fp = fopen('php://output', 'a');
fwrite($fp, chr(0xEF) . chr(0xBB) . chr(0xBF));
foreach ($data as $fields) {
fputcsv($fp, $fields);
}
fclose($fp);