比較常用的是用PHPExcel,1萬左右資料還行,但是資料到達100萬左右,PHPExcel就顯的很無助,搜尋了下比較常用的是使用php的fputcsv,不知道還有什麼辦法能匯出比較大量資料的excle
剛剛測試了下fputcsv,發現全部擠到A中,無法換到B中
2012年9月2日添加
03版的確實是有限制的,格式php的csv的是不是用excel開啟只會出現在A列上面?
2012年9月2日添加
我覺得我非常有必要說下為什麼會有這個需求,一個大點的品牌公司,一年左右的訂單,超過100萬是很正常的,年末的時候他們的業務人員會根據訂單進行各種分析,每個公司的分析角度又是不一樣的,所以把所有訂單匯出來給業務人員是一個最簡單的辦法,為什麼要匯出excle,是因為對於業務人員來說這個是最常用的,你也不可能去協助那麼多家的公司開發這樣那樣的報表。
所以也就有了這個需求,怎麼匯出超過100萬甚至1000萬資料excle的問題
回複內容:
比較常用的是用PHPExcel,1萬左右資料還行,但是資料到達100萬左右,PHPExcel就顯的很無助,搜尋了下比較常用的是使用php的fputcsv,不知道還有什麼辦法能匯出比較大量資料的excle
剛剛測試了下fputcsv,發現全部擠到A中,無法換到B中
2012年9月2日添加
03版的確實是有限制的,格式php的csv的是不是用excel開啟只會出現在A列上面?
2012年9月2日添加
我覺得我非常有必要說下為什麼會有這個需求,一個大點的品牌公司,一年左右的訂單,超過100萬是很正常的,年末的時候他們的業務人員會根據訂單進行各種分析,每個公司的分析角度又是不一樣的,所以把所有訂單匯出來給業務人員是一個最簡單的辦法,為什麼要匯出excle,是因為對於業務人員來說這個是最常用的,你也不可能去協助那麼多家的公司開發這樣那樣的報表。
所以也就有了這個需求,怎麼匯出超過100萬甚至1000萬資料excle的問題
- PHP從資料庫分多次讀取100萬行記錄,和分多次將100萬行寫入文字檔都沒問題
- Excel可以支援100萬行記錄,Excel 2003最大支援65536行,從2007版開始支援104萬行了,目前2007的盜版應該比較普及了-_-! 問清楚你的客戶是什麼版本。
- 你要匯出excel的理由是非常充分和正確的,應該繼續堅持。業務人員最熟悉的就是Excel,實在不熟悉現學現用也比別的快。只是要注意,當資料量達到10萬行這個層級時,Excel的公式填充將會非常非常慢,如果再有LOOKUP()公式,基本上十分鐘內處理CPU滿載進程管理器殺不掉的狀態,這時候其實xampp + phpmyadmin是一個易用性和效能都最平衡的選擇
- PHPExcel輸出的是Excel XML格式,有個XML頭和尾,中間是資料Body,需要將100萬行都賦值給一個數組才可以調用PHPExcel->write(),這容易導致PHP執行逾時或者記憶體超限,你不妨調整一下php.ini配置,把逾時時間和記憶體限制都改到很大
- 如果是輸出csv格式,那就太簡單了,你的問題可能是沒給欄位內容加引號,加上引號再調用fputcsv試試?其實fputcsv做的事情特別簡單,你甚至可以不管它,自己把CSV檔案的每一行拼接好了之後用file_put_contents寫入
最後給你看一個phpmyadmin匯出的CSV樣本,對照你自己產生的CSV樣本,看看哪裡不一樣。
之前我匯出都是用csv的,如果putcsv有問題,你可以嘗試自己去拼裝csv的檔案。csv的格式非常簡單,就是英文逗號分隔。
看你,有可能是首行留空造成的問題,建議修改試試。
---
還有一個辦法,就是用 \t 分割,存成文字檔,然後複製黏貼到excel裡
很贊同2樓的說法。
excel本身就不是為大資料而操作的,如果你真的過10萬行,你還是不要用excel來操作了,這樣真的會死人的。
當然如果你真的要操作,你還是存到access中。然後用excel來讀取access的資料來產生各種圖表(如果你的excel是為了要用來組建圖表的話)。
否則,真沒意義啊。
如果我沒記錯的話,Excel極限是65536條。
1.Excel本身就不能裝幾百萬資料。Excel是有條數限制的。具體多少條你可以查閱相關資料。
2.你可以將資料按照條數進行分割寫入不同的Excel檔案。產生多個。
3.即使你寫入csv檔案,你想用Excel開啟幾百萬資料也不太現實
excel分列就好了
可以csv , 不段的重新整理緩衝期,來實現大資料流的匯出
$fp = fopen('php://output', 'a');// 輸出Excel列名資訊$head = array("電子郵件");foreach ($head as $i => $v) { // CSV的Excel支援GBK編碼,一定要轉換,否則亂碼 $head[$i] = iconv('utf-8', 'gbk', $v);}// 將資料通過fputcsv寫到檔案控制代碼fputcsv($fp, $head);// 計數器$cnt = 0;// 每隔$limit行,重新整理一下輸出buffer,不要太大,也不要太小$limit = 100000;// 逐行取出資料,不浪費記憶體$count = count($email);for($t=0;$t<$count;$t++) { $cnt ++; if ($limit == $cnt) { //重新整理一下輸出buffer,防止由於資料過多造成問題 ob_flush(); flush(); $cnt = 0; } $row[] = $email[$t]; foreach ($row as $i => $v) { $row[$i] = iconv('utf-8', 'gbk', $v); } fputcsv($fp, $row); unset($row);}
迴圈產生CSV 資料, 每產生1000 條的時候重新整理下緩衝期
$filename='./file.csv';$handle=fopen($filename,"w");fwrite($handle,chr(255).chr(254));fwrite($handle,iconv("UTF-8","UTF-16LE","值1\t值2\t值3\t值n\\r\n"));fclose($handle);
用這個看下,別一下查詢出全部資料,你可以參考下mysql_unbuffered_query
03版的確實是有限制的,格式php的csv的是不是用excel開啟只會出現在A列上面?