摘要:導(dǎo)出功能在管理后臺算是比較常見的了。但是如果用來打開,超過行的數(shù)據(jù)都會(huì)看不見,這是程序的問題。本次導(dǎo)出數(shù)據(jù)量很大。原因數(shù)值顯示精度為位造成精度丟失。
導(dǎo)出功能在管理后臺算是比較常見的了。在實(shí)現(xiàn)導(dǎo)出表格類信息的功能時(shí),可以選擇兩種實(shí)現(xiàn)方式:
導(dǎo)出為excel
導(dǎo)出為csv文件格式
用csv方式導(dǎo)出,則可以像導(dǎo)出txt一樣,以文本流的方式進(jìn)行流式處理,不但能導(dǎo)出海量信息,而且流式處理占用內(nèi)存極低,服務(wù)器對瀏覽器的響應(yīng)也是非常迅速的。理論上是不限量的。具體能導(dǎo)出多少條,是由服務(wù)器的響應(yīng)時(shí)間、PHP的運(yùn)行時(shí)間和內(nèi)存等限制決定。但是如果用excel來打開csv,超過65536行的數(shù)據(jù)都會(huì)看不見,這是excel程序的問題。本次導(dǎo)出數(shù)據(jù)量很大。所以選擇csv。
總體實(shí)現(xiàn)思路為:
先把需要導(dǎo)出的數(shù)據(jù)存到數(shù)組里,然后寫入到文件。話不多說,還是直接上代碼吧。
function export(){ $data=array( array( "nId" => "90", "nick" => "piapia", ), array( "nId" => "91", "nick" => "monkey", ) ); $head = array( "nId" => "id", "nick" => "昵稱", ); $name = "filetoexport" . date("YmdHis", time()); $this->writeCsvToBrowser($name, $head, $data); } function writeCsvToBrowser($filename,$headLine,$data,$lostData=array()) { $out = implode(",", $headLine); $out = iconv("UTF-8", "GBK//IGNORE",$out); foreach ($data as $v) { $line = array(); foreach (array_keys($headLine) as $objAttr) { if (is_object($v) && isset($v->$objAttr)) { $cellValue = $v->$objAttr; }elseif(is_array($v) && isset($v[$objAttr])) { $cellValue = $v[$objAttr]; }else { $cellValue = $lostData[$objAttr]; } $line[] = $cellValue; } $line = array_map("csvFormate",$line); $out .= " "; $lineStr= implode(",", $line); //iconv轉(zhuǎn)換編碼對字符串有長度限制,如果太長就會(huì)被截?cái)唷? $lineStr= @iconv("UTF-8", "GBK//IGNORE", $lineStr); $out .= $lineStr; } header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Content-Length: " . strlen($out)); header("Content-type: text/x-csv"); header("Content-Disposition:filename=$filename.csv"); echo $out; } function csvFormate($str) { if (""===$str) { return ""; } $find = FALSE; foreach (array(",","""," "," ") as $v){ if (FALSE===strpos($str, $v)) { $find = true; break; } } if (!$find) { return $str; } $str = str_replace(""", """", $str); return sprintf(""%s"",$str); }
在實(shí)現(xiàn)這個(gè)功能時(shí),有一些問題需要大家注意一下。
1.精度丟失問題:
問題描述:導(dǎo)出后,發(fā)現(xiàn)有一個(gè)字段總是跟取得不一樣,Id為1918553121332457在導(dǎo)出后變成1918553121332450,也就是說最后一位 總是變成了0。
原因:Excel數(shù)值顯示精度為15位造成精度丟失。
解決思路:強(qiáng)制轉(zhuǎn)化成字符串
$strId." "
或者
$strId." "
需要注意的是,這樣加是沒有用的:
$strId." "
2.PHP運(yùn)行時(shí)間的限制,導(dǎo)致程序被強(qiáng)制中斷。
在不能隨便改變php.ini文件里PHP運(yùn)行的時(shí)間限制下,可以這樣設(shè)置來增加運(yùn)行時(shí)間:
set_time_limit(60*5);
3.默認(rèn)內(nèi)存設(shè)置太小,導(dǎo)致文件寫入失敗:
可以嘗試這樣解決
ini_set("memory_limit","1024M");
4.奇淫技巧
如果不想文件在讀取或者寫入的時(shí)候,因?yàn)橛脩舻恼`操作被中斷。可以通過如下參數(shù)實(shí)現(xiàn):
ignore_user_abort(true);
以上是我自己在多次管理后臺開發(fā)實(shí)現(xiàn)導(dǎo)出功能時(shí)曾經(jīng)遇到過的問題,主頁菌在此列出來希望可以和大家一起探討一下。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/21988.html
摘要:開發(fā)中經(jīng)常遇到這樣的場景產(chǎn)品汪我要在后臺做一個(gè)功能,可以導(dǎo)出自定義時(shí)間范圍的訂單信息。結(jié)果,第二天一上班產(chǎn)品汪過來就是拍桌子,我想把去年一整年的訂單都導(dǎo)出來,結(jié)果后臺直接就掛了開發(fā)小哥一查,原來是內(nèi)存溢出了,一年下來的的訂單量足足有條。 開發(fā)中經(jīng)常遇到這樣的場景 產(chǎn)品汪:我要在后臺做一個(gè)功能,可以導(dǎo)出自定義時(shí)間范圍的訂單信息。開發(fā)小哥二話不說,半天就把功能做完并上線了。結(jié)果,第二天一上...
摘要:中國大陸幾乎所有的中文系統(tǒng)和國際化的軟件都支持。與相應(yīng)的國家標(biāo)準(zhǔn)中的其它漢字,以上合計(jì)個(gè)漢字。,全稱國家標(biāo)準(zhǔn)信息技術(shù)中文編碼字符集,是中華人民共和國現(xiàn)時(shí)最新的內(nèi)碼字集,是信息技術(shù)信息交換用漢字編碼字符集基本集的擴(kuò)充的修訂版。 實(shí)戰(zhàn)PHP導(dǎo)出Excel-CSV文件 導(dǎo)出后的效果 先給各位看一下導(dǎo)出的效果,而后再進(jìn)行代碼分析 showImg(https://segmentfault.co...
摘要:中國大陸幾乎所有的中文系統(tǒng)和國際化的軟件都支持。與相應(yīng)的國家標(biāo)準(zhǔn)中的其它漢字,以上合計(jì)個(gè)漢字。,全稱國家標(biāo)準(zhǔn)信息技術(shù)中文編碼字符集,是中華人民共和國現(xiàn)時(shí)最新的內(nèi)碼字集,是信息技術(shù)信息交換用漢字編碼字符集基本集的擴(kuò)充的修訂版。 實(shí)戰(zhàn)PHP導(dǎo)出Excel-CSV文件 導(dǎo)出后的效果 先給各位看一下導(dǎo)出的效果,而后再進(jìn)行代碼分析 showImg(https://segmentfault.co...
閱讀 750·2021-07-25 21:37
閱讀 3663·2019-08-30 15:55
閱讀 2579·2019-08-30 15:54
閱讀 1728·2019-08-30 15:44
閱讀 3129·2019-08-30 15:44
閱讀 866·2019-08-30 15:43
閱讀 1035·2019-08-29 15:36
閱讀 3046·2019-08-29 10:58