PHPExcel是用来操作Office Excel 文档的一个PHP类库,它基于微软的OpenXML标准和PHP语言。可以使用它来读取、写入不同格式的电子表格。下面主要介绍的是:PHPExcel简单列表导出。
生成Excel表的思路对照
首先我们需要到官网上,下载PHPExcel的包,包里我们把classes单独提取出来,classes里面有一个文件使PHPExcel.php这个是我们主要用到的,在下面的例子中,我把classes文件夹重命名为了PHPExcel。下面这张图对比了我们平常创建一个excel需要做什么和我们用代码创建一个excel的相同的地方,我们应该看到他们非常相似:
生成Excel表基本代码
1 |
|
就可以在当前目录下生成一个demo.xlsx,里面的内容:
先前可以试着打印下$phpExcelObj对象,如果看到下面的可以说明引入成功:
还有下面这样的一种方式,以数组来填充:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$dir = dirname(__FILE__); //string 'D:\wamp\wamp\www\phpexcel' (length=25)
require_once("./PHPExcel/PHPExcel.php");
$phpExcelObj = new PHPExcel(); //创建了一个表格
$activeSheet = $phpExcelObj->getActiveSheet();
//var_dump($activeSheet);//获取当前活动sheet
$activeSheet->setTitle("demo");
//给当前的表格填充数据
$array = array(
array(),
array("","姓名","分数"),
array("","李四","60"),
array("","王五","90")
);
$activeSheet->fromArray($array);
$objWriter = PHPExcel_IOFactory::createWriter($phpExcelObj,"Excel2007");
$objWriter->save($dir."/demo1.xlsx");
这种方法肯定和上面的比有优点,比如设置起来比较方便,但是也有不好的地方,比较耗内存。
把数据库的数据录入excel中
刚刚我们的是直接手动录入,这种情况在项目中是使用比较少的,下面这种我们把数据从数据库录入excel中是最常见的。比如我们在生成订单表的时候,生成excel对卖家来说会是经常需要的。
比如我们在数据库中有这样一张表:
我们需要按照年级把成绩分出来,并得到下面的结果,如果我们手动录入肯定会很麻烦,看看下面的PHPExcel方法:
首先我们有一个数据库配置文件:config.php
,在这里面要设置数据库,字符集等信息。1
2
3
4
5
6
7
8
9<?php
$config = array(
'host'=>'127.0.0.1',
'username'=>'root',
'password'=>'****',
'database'=>'test',
'charset'=>'utf8'
);
?>
然后我们需要一个db类,用于我们从数据库取出数据,我们命名为db.php1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
require_once('./config.php');
class db{
public $conn = null;
public function __construct($config){
$this->conn = mysql_connect($config['host'],$config['username'],$config['password']) or die(mysql_error());
mysql_select_db($config['database']) or die(mysql_error());
mysql_query("set names ".$config['charset']) or die(mysql_error());
}
public function getResult($sql){
$res = mysql_query($sql);
$arr = array();
while($row = mysql_fetch_assoc($res)){
$arr[] = $row;
}
return $arr;
}
public function getDataByGrade($grade){
$sql = "select * from student where grade = ".$grade." order by score desc";
$res = self::getResult($sql);
return $res;
}
}
下面是我们的主文件,我们把上面的文件都包含进来,这里注意因为我们在db里已经require了config.php,所以这里不用再包含config.php了,或者我们用require_once
也可以。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$dir = dirname(__FILE__);
require $dir."/db.php";
require $dir."/PHPExcel/PHPExcel.php";
$db = new db($config);
$objPHPExcel = new PHPExcel();
for ($i=1; $i <= 3; $i++) {
if($i>1){
$objPHPExcel->createSheet();
}
$objPHPExcel->setActiveSheetIndex($i-1);
$objSheet = $objPHPExcel->getActiveSheet();
$objSheet->setTitle($i."年级");
$data = $db->getDataByGrade($i);
$objSheet->setCellValue("A1","姓名")->setCellValue("B1","年级")->setCellValue("C1","成绩");
$j=2;
foreach ($data as $key => $value) {
$objSheet->setCellValue("A".$j,$value['name'])->setCellValue("B".$j,$value['grade'])->setCellValue("C".$j,$value['name']);
$j++;
}
}
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel5');
$objWriter->save($dir."/export_1.xls");
主要的思路就是我们按照先前我们的步骤新建表,创建sheet,这里不同的是,我们要把三个年级的放到不同的sheet里,所以不能只create一个sheet,要根据grade有多少个循环创建,并且把相应的数据放进去。
将excel输出到浏览器
我们也可以吧excel保存到浏览器,这个时候我们只用改动一点代码就行了,比如这里我们设置header头,告诉浏览器生成的类型。注意这里save方法发生了变化的。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
$dir = dirname(__FILE__);
require $dir."/db.php";
require $dir."/PHPExcel/PHPExcel.php";
$db = new db($config);
$objPHPExcel = new PHPExcel();
for ($i=1; $i <= 3; $i++) {
if($i>1){
$objPHPExcel->createSheet();
}
$objPHPExcel->setActiveSheetIndex($i-1);
$objSheet = $objPHPExcel->getActiveSheet();
$objSheet->setTitle($i."年级");
$data = $db->getDataByGrade($i);
$objSheet->setCellValue("A1","姓名")->setCellValue("B1","年级")->setCellValue("C1","成绩");
$j=2;
foreach ($data as $key => $value) {
$objSheet->setCellValue("A".$j,$value['name'])->setCellValue("B".$j,$value['grade'])->setCellValue("C".$j,$value['name']);
$j++;
}
}
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel5');
//$objWriter->save($dir."/export_1.xls");
browser_export("Excel5",'browser_export01.xls');
$objWriter->save("php://output");
function browser_export($type,$filename){
if($type=="Excel5"){
header('Content-Type: application/vnd.ms-excel');//告诉浏览器将要输出excel03文件
}else{
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');//告诉浏览器数据excel07文件
}
header('Content-Disposition: attachment;filename="'.$filename.'"');//告诉浏览器将输出文件的名称
header('Cache-Control: max-age=0');//禁止缓存
}
如果不告诉浏览器名称的话,就会把当前文本的名称当成输出excel的名称。header就是告诉浏览器文件类型。必须有。
最后的结果,就是我一刷新就出来了下载这个:
总结
这个还有很多方法我没有写到,比如我们怎么样设置居中,怎么样添加线性表,怎么样导入Excel表,这个我会回头有时间再写一篇博客的。还有很多设置样式的,我们其实要做的就是调用它的接口就行。因为这样的东西我觉得不是经常用就会忘,所以做一次大概知道是什么思路和样子就行了,以后要用的时候再查一查文档,看看以前做的例子,应该能很快就想起来的,那些函数的调用也没有太大的必要记住。