PHP导出数据到Excel文件


PHP #excel2012-07-10 17:22

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

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


相关文章

粤ICP备11097351号-1