php 把數(shù)據(jù)導(dǎo)出到excel表格有多種方法,比如使用 phpExcel 等,以下代碼是直接通過 header 生成 excel 文件的代碼示例:
創(chuàng)新互聯(lián)致力于互聯(lián)網(wǎng)網(wǎng)站建設(shè)與網(wǎng)站營銷,提供成都網(wǎng)站設(shè)計、成都做網(wǎng)站、網(wǎng)站開發(fā)、seo優(yōu)化、網(wǎng)站排名、互聯(lián)網(wǎng)營銷、微信小程序開發(fā)、公眾號商城、等建站開發(fā),創(chuàng)新互聯(lián)網(wǎng)站建設(shè)策劃專家,為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制解決方案,幫助客戶在新的全球化互聯(lián)網(wǎng)環(huán)境中保持優(yōu)勢。
?php
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:filename=xls_region.xls");
$cfg_dbhost?=?'localhost';
$cfg_dbname?=?'testdb';
$cfg_dbuser?=?'root';
$cfg_dbpwd?=?'root';
$cfg_db_language?=?'utf8';
//?END?配置
//鏈接數(shù)據(jù)庫
$link?=?mysql_connect($cfg_dbhost,$cfg_dbuser,$cfg_dbpwd);
mysql_select_db($cfg_dbname);
//選擇編碼
mysql_query("set?names?".$cfg_db_language);
//users表
$sql?=?"desc?users";
$res?=?mysql_query($sql);
echo?"tabletr";
//導(dǎo)出表頭(也就是表中擁有的字段)
while($row?=?mysql_fetch_array($res)){
$t_field[]?=?$row['Field'];?//Field中的F要大寫,否則沒有結(jié)果
echo?"th".$row['Field']."/th";
}
echo?"/tr";
//導(dǎo)出100條數(shù)據(jù)
$sql?=?"select?*?from?users?limit?100";
$res?=?mysql_query($sql);
while($row?=?mysql_fetch_array($res)){
echo?"tr";
foreach($t_field?as?$f_key){
echo?"td".$row[$f_key]."/td";
}
echo?"/tr";
}
echo?"/table";
?
php導(dǎo)出數(shù)據(jù)excel有專門的庫,當(dāng)導(dǎo)出少量數(shù)據(jù)的時候速度很快,但是當(dāng)數(shù)據(jù)量大的時候就會存在服務(wù)器內(nèi)存不夠之類的。
所以在導(dǎo)出大量數(shù)據(jù)的時候就應(yīng)該分頁查詢數(shù)據(jù),避免服務(wù)器宕機(jī)。正好PHP提供了fputcsv函數(shù)可以將數(shù)據(jù)寫入到csv文件中。
這樣我們就可以使用PHP對數(shù)據(jù)進(jìn)行分頁查詢,再寫入到csv文件中。
1 $fp = fopen('php://output', 'a');
2
3 // 輸出Excel列名信息
4 $head = array("郵件");
5 foreach ($head as $i = $v) {
6 // CSV的Excel支持GBK編碼,一定要轉(zhuǎn)換,否則亂碼
7 $head[$i] = iconv('utf-8', 'gbk', $v);
8 }
9
10 // 將數(shù)據(jù)通過fputcsv寫到文件句柄
11 fputcsv($fp, $head);
12
13 // 計數(shù)器
14 $cnt = 0;
15 // 每隔$limit行,刷新一下輸出buffer,不要太大,也不要太小
16 $limit = 100000;
17
18 // 逐行取出數(shù)據(jù),不浪費內(nèi)存
19 $count = count($email);
20
21 for($t=0;$t$count;$t++) {
22
23 $cnt ++;
24 if ($limit == $cnt) { //刷新一下輸出buffer,防止由于數(shù)據(jù)過多造成問題
25 ob_flush();
26 flush();
27 $cnt = 0;
28 }
29 $row[] = $email[$t];
30 foreach ($row as $i = $v) {
31 $row[$i] = iconv('utf-8', 'gbk', $v);
32 }
33 fputcsv($fp, $row);
34 unset($row);
35 }
微軟的Excel設(shè)置單元格行數(shù)默認(rèn)是6萬行rows,相對的講其實當(dāng)我們超過1萬行的時候已經(jīng)是大數(shù)據(jù)的導(dǎo)出。
好比:有客戶10000人,平均每人每天產(chǎn)生10條活動記錄,要導(dǎo)出上周所有的客戶活動記錄: 10000*10*7=700000
估計看70萬行的Excel這個人會瘋掉的,我們的建議是分批次導(dǎo)出,按時間導(dǎo)出到不同的excel
下面是一個PHPExcel官方的Demo(已修改過)
復(fù)制代碼
define('EOL', 'br /');
$objPHPExcel = new \app\extensions\PHPExcel\PHPExcel();
ini_set("memory_limit", "1024M"); // 設(shè)置php可使用內(nèi)存
$cacheMethod = \PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;
if (!\PHPExcel_Settings::setCacheStorageMethod($cacheMethod)) {
die($cacheMethod . " 緩存方法不可用" . EOL);
}
echo date('H:i:s'), " 當(dāng)前使用的緩存方法是: ", $cacheMethod, " 方式", EOL;
echo date('H:i:s'), " 開始設(shè)置文檔屬性", EOL;
$objPHPExcel-getProperties()-setCreator("Maarten Balliauw")
-setLastModifiedBy("Maarten Balliauw")
-setTitle("Office 2007 XLSX Test Document")
-setSubject("Office 2007 XLSX Test Document")
具體的還有很多寫不下,我是在后盾人看的教學(xué)視頻無意中學(xué)到的,正好解答給你希望能幫到你