我们通常在工作中会遇到把数据库的数据导入到Execl,这时使用PHPExecl就会很方便。
在官方网站下载:http://phpexcel.codeplex.com/
下面的代码,我自己设定了模拟数据。
这是写入多个Sheet
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
| <?php
/**
* 简单实用Execl
*/
set_include_path('.'.get_include_path().PATH_SEPARATOR.dirname(__FILE__).'/PHPExecl/');
/* @func 引入类 */
require 'PHPExcel.php';
//模拟数据
$mulit_arr = array(
array('标题1', '标题2', '标题3'),
array('a', 'b', 'c'),
array('d', 'e', 'f')
);
/* 优化设置 */
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
$cacheSettings = array('memoryCacheSize'=>'16MB');
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
/* @实例化 */
$obpe = new PHPExcel();
/* @func 设置文档基本属性 */
$obpe_pro = $obpe->getProperties();
$obpe_pro->setCreator('midoks')//设置创建者
->setLastModifiedBy('2013/2/16 15:00')//设置时间
->setTitle('data')//设置标题
->setSubject('beizhu')//设置备注
->setDescription('miaoshu')//设置描述
->setKeywords('keyword')//设置关键字 | 标记
->setCategory('catagory');//设置类别
/* 设置宽度 */
//$obpe->getActiveSheet()->getColumnDimension()->setAutoSize(true);
//$obpe->getActiveSheet()->getColumnDimension('B')->setWidth(10);
//设置当前sheet索引,用于后续的内容操作
//一般用在对个Sheet的时候才需要显示调用
//缺省情况下,PHPExcel会自动创建第一个SHEET被设置SheetIndex=0
//设置SHEET
$obpe->setactivesheetindex(0);
//写入多行数据
foreach($mulit_arr as $k=>$v){
$k = $k+1;
/* @func 设置列 */
$obpe->getactivesheet()->setcellvalue('A'.$k, $v[0]);
$obpe->getactivesheet()->setcellvalue('B'.$k, $v[1]);
$obpe->getactivesheet()->setcellvalue('C'.$k, $v[2]);
}
//创建一个新的工作空间(sheet)
$obpe->createSheet();
$obpe->setactivesheetindex(1);
//写入多行数据
foreach($mulit_arr as $k=>$v){
$k = $k+1;
/* @func 设置列 */
$obpe->getactivesheet()->setcellvalue('A'.$k, $v[0]);
$obpe->getactivesheet()->setcellvalue('B'.$k, $v[1]);
$obpe->getactivesheet()->setcellvalue('C'.$k, $v[2]);
}
//写入类容
$obwrite = PHPExcel_IOFactory::createWriter($obpe, 'Excel5');
//ob_end_clean();
//保存文件
$obwrite->save('mulit_sheet.xls');
//or 以下方式
/*******************************************
直接在浏览器输出
*******************************************/
/**
header('Pragma: public');
header('Expires: 0');
header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
header('Content-Type:application/force-download');
header('Content-Type:application/vnd.ms-execl');
header('Content-Type:application/octet-stream');
header('Content-Type:application/download');
header("Content-Disposition:attachment;filename='mulit_sheet.xls'");
header('Content-Transfer-Encoding:binary');
$obwrite->save('php://output');
?>
*/
?>
|
读取多个Sheet
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
| <?php
/**
* @读取数据
* 1.bug对日期格式读取错误进行了改进
* 2.多个sheets取值
*/
set_include_path('.'.get_include_path().PATH_SEPARATOR.dirname(__FILE__).'/PHPExecl/');
/* @func 引入类 */
require 'PHPExcel.php';
//$obpe = new PHPExcel();
//var_dump($obpe);
//设置使用内容大小
ini_set('memory_limit','512M');
/**
* @func 读取execl内容的数据
* @param $fn Execl文件
* @param int $sheet 第几个sheet 默认0(当前)
*/
function read_execl($fn ,$sheet=0){
if(!file_exists($fn)){
exit($fn.'文件不存在');
}
//实例化处理对象
$reader = new PHPExcel_Reader_Excel5();
if(!$reader->canRead($fn)){
$reader = new PHPExcel_Reader_Excel5();
}else if(!$reader->canRead($fn)){
echo 'No Excel';
return;
}
ob_end_clean();
//加载处理的文件
$execl = $reader->load($fn);
$csheet = $execl->getSheet($sheet);
//var_dump($csheet);
//取得共有多少列,若不使用此静态方法,获得的$col是文件列的最大的英文大写字母
$cols=PHPExcel_Cell::columnIndexFromString($csheet->getHighestColumn());
//多少行
$rows = $csheet->getHighestRow();
//var_dump($rows, $cols);
//读取数据
$result = array();
for($row=1; $row<=$rows; $row++){
for($col=0; $col<$cols; $col++){
$cell =$csheet->getCellByColumnAndRow($col, $row);
$cellstyleformat = $cell->getStyle($cell->getCoordinate())->getNumberFormat();//1.7.8可用
//$cellstyleformat = $cell->getStyle($cell->getCoordinate())->getNumberFormat();//1.7.9可用
//日期格式的判断
$value = $cell->getValue();//获取值
//var_dump($value);
//return $value;
$formatcode=$cellstyleformat->getFormatCode();
//var_dump(PHPExcel_Shared_Date::ExcelToPHP($value));
if (preg_match('/^(\[\$[A-Z]*-[0-9A-F]*\])*[hmsdy]/i', $formatcode)){
//var_dump(PHPExcel_Shared_Date::ExcelToPHP($value));
$value = gmdate("Y-m-d", PHPExcel_Shared_Date::ExcelToPHP($value));
}else{
$value = PHPExcel_Style_NumberFormat::toFormattedString($value, $formatcode);
//var_dump('test:'.$value);
}
$result[$row][$col] = $value;
}
}
//var_dump($result);
//exit;
return $result;
}
echo '<pre>';
$fn = 'mulit_sheet.xls';
$data = read_execl($fn, 1);
var_dump($data);
?>
|
注意
使用1.7.8没有问题,在测试1.7.9时,发现只要返回值整个程序就会崩溃,使用exit不会出现问题。