我们通常在工作中会遇到把数据库的数据导入到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不会出现问题。