摘要:導出功能在管理后臺算是比較常見的了。但是如果用來打開,超過行的數據都會看不見,這是程序的問題。本次導出數據量很大。原因數值顯示精度為位造成精度丟失。
導出功能在管理后臺算是比較常見的了。在實現導出表格類信息的功能時,可以選擇兩種實現方式:
導出為excel
導出為csv文件格式
用csv方式導出,則可以像導出txt一樣,以文本流的方式進行流式處理,不但能導出海量信息,而且流式處理占用內存極低,服務器對瀏覽器的響應也是非常迅速的。理論上是不限量的。具體能導出多少條,是由服務器的響應時間、PHP的運行時間和內存等限制決定。但是如果用excel來打開csv,超過65536行的數據都會看不見,這是excel程序的問題。本次導出數據量很大。所以選擇csv。
總體實現思路為:
先把需要導出的數據存到數組里,然后寫入到文件。話不多說,還是直接上代碼吧。
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轉換編碼對字符串有長度限制,如果太長就會被截斷。 $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); }
在實現這個功能時,有一些問題需要大家注意一下。
1.精度丟失問題:
問題描述:導出后,發現有一個字段總是跟取得不一樣,Id為1918553121332457在導出后變成1918553121332450,也就是說最后一位 總是變成了0。
原因:Excel數值顯示精度為15位造成精度丟失。
解決思路:強制轉化成字符串
$strId." "
或者
$strId." "
需要注意的是,這樣加是沒有用的:
$strId." "
2.PHP運行時間的限制,導致程序被強制中斷。
在不能隨便改變php.ini文件里PHP運行的時間限制下,可以這樣設置來增加運行時間:
set_time_limit(60*5);
3.默認內存設置太小,導致文件寫入失敗:
可以嘗試這樣解決
ini_set("memory_limit","1024M");
4.奇淫技巧
如果不想文件在讀取或者寫入的時候,因為用戶的誤操作被中斷。可以通過如下參數實現:
ignore_user_abort(true);
以上是我自己在多次管理后臺開發實現導出功能時曾經遇到過的問題,主頁菌在此列出來希望可以和大家一起探討一下。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21988.html
摘要:開發中經常遇到這樣的場景產品汪我要在后臺做一個功能,可以導出自定義時間范圍的訂單信息。結果,第二天一上班產品汪過來就是拍桌子,我想把去年一整年的訂單都導出來,結果后臺直接就掛了開發小哥一查,原來是內存溢出了,一年下來的的訂單量足足有條。 開發中經常遇到這樣的場景 產品汪:我要在后臺做一個功能,可以導出自定義時間范圍的訂單信息。開發小哥二話不說,半天就把功能做完并上線了。結果,第二天一上...
摘要:中國大陸幾乎所有的中文系統和國際化的軟件都支持。與相應的國家標準中的其它漢字,以上合計個漢字。,全稱國家標準信息技術中文編碼字符集,是中華人民共和國現時最新的內碼字集,是信息技術信息交換用漢字編碼字符集基本集的擴充的修訂版。 實戰PHP導出Excel-CSV文件 導出后的效果 先給各位看一下導出的效果,而后再進行代碼分析 showImg(https://segmentfault.co...
摘要:中國大陸幾乎所有的中文系統和國際化的軟件都支持。與相應的國家標準中的其它漢字,以上合計個漢字。,全稱國家標準信息技術中文編碼字符集,是中華人民共和國現時最新的內碼字集,是信息技術信息交換用漢字編碼字符集基本集的擴充的修訂版。 實戰PHP導出Excel-CSV文件 導出后的效果 先給各位看一下導出的效果,而后再進行代碼分析 showImg(https://segmentfault.co...
閱讀 742·2021-07-25 21:37
閱讀 3654·2019-08-30 15:55
閱讀 2572·2019-08-30 15:54
閱讀 1717·2019-08-30 15:44
閱讀 3123·2019-08-30 15:44
閱讀 859·2019-08-30 15:43
閱讀 1021·2019-08-29 15:36
閱讀 3038·2019-08-29 10:58