PHP Excel

来源:互联网 发布:新开户数据 编辑:程序博客网 时间:2024/06/03 23:00

经常会碰到需要从数据库中导出数据到Excel文件,用一些开源的类库,比如PHPExcel,确实比较容易实现,但对大量数据的支持很不好,很容易到达PHP内存使用上限。这里的方法是利用fputcsv写CSV文件的方法,直接向浏览器输出Excel文件。

view source
print?
01// 输出Excel文件头,可把user.csv换成你要的文件名
02header('Content-Type: application/vnd.ms-excel');
03header('Content-Disposition: attachment;filename="user.csv"');
04header('Cache-Control: max-age=0');
05// 从数据库中获取数据,为了节省内存,不要把数据一次性读到内存,从句柄中一行一行读即可
06$sql 'select * from tbl where ……';
07$stmt $db->query($sql);
08// 打开PHP文件句柄,php://output 表示直接输出到浏览器
09$fp fopen('php://output''a');
10// 输出Excel列名信息
11$head array('姓名''性别''年龄''Email''电话''……');
12foreach ($head as $i => $v) {
13    // CSV的Excel支持GBK编码,一定要转换,否则乱码
14    $head[$i] = iconv('utf-8''gbk'$v);
15}
16// 将数据通过fputcsv写到文件句柄
17fputcsv($fp$head);
18// 计数器
19$cnt = 0;
20// 每隔$limit行,刷新一下输出buffer,不要太大,也不要太小
21$limit = 100000;
22// 逐行取出数据,不浪费内存
23while ($row $stmt->fetch(Zend_Db::FETCH_NUM)) {
24    $cnt ++;
25    if ($limit == $cnt) { //刷新一下输出buffer,防止由于数据过多造成问题
26        ob_flush();
27        flush();
28        $cnt = 0;
29    }
30    foreach ($row as $i => $v) {
31        $row[$i] = iconv('utf-8''gbk'$v);
32    }
33    fputcsv($fp$row);
34}
0 0