CodeIgniter+PHPExcel 導出數據爲Excel文件

下載安裝PHPExcel庫

下載PHPExcel:http://phpexcel.codeplex.com

安裝PHPExcel非常的簡單,只需解壓壓縮包裏的Classes文件夾中的內容到application\libraries\目錄下即可,最終的目錄結構如下:

– application\libraries\PHPExcel.php

– application\libraries\PHPExcel (文件夾)

但是由於CI的命名規則的約束,需要修改PHPExcel庫中的類名以遵從CI中的類命名規則。打開application\libraries\PHPExcel\IOFactory.php 文件,將其類名從PHPExcel_IOFactory改爲IOFactory,並將其構造函數改爲public類型。

至此,PHPExcel庫安裝完畢。

使用PHPExcel庫生成excel文件

在CI中寫一個Controller實現導出功能

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
publicfunction export()
{
$this->load->model("CourseInfo","CourseInfo",TRUE);
$result=$this->CourseInfo->countCourseStuNumber();

// 清空輸出緩衝區
ob_clean();
// 載入PHPExcel類庫
$this->load->library('PHPExcel');
$this->load->library('PHPExcel/IOFactory');
// 創建PHPExcel對象
$objPHPExcel=new PHPExcel();
// 設置excel文件屬性描述
$objPHPExcel->getProperties()
->setTitle("選課統計表")
->setDescription("選課統計表");
// 設置當前工作表
$objPHPExcel->setActiveSheetIndex(0);
// 設置表頭
$fields=array('節次','課程名稱','開課老師','選課學生數');
// 列編號從0開始,行編號從1開始
$col=0;
$row=1;
foreach($fieldsas$field)
{
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($col,$row,$field);
$col++;
}
// 從第二行開始輸出數據內容
$row=2;
foreach($resultas$course)
{
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0,$row,$course["courseOrder"]);
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1,$row,$course["courseName"]);
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(2,$row,$course["teacher"]);
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(3,$row,$course["stuCount"]);
$row++;
}
//輸出excel文件
$objPHPExcel->setActiveSheetIndex(0);
// 第二個參數可取值:CSV、Excel5(生成97-2003版的excel)、Excel2007(生成2007版excel)
$objWriter= IOFactory::createWriter($objPHPExcel,'Excel5');
// 設置HTTP頭
header('Content-Type: application/vnd.ms-excel; charset=utf-8');
header('Content-Disposition: attachment;filename="'.mb_convert_encoding("選課統計表","GB2312","UTF-8").'.xls"');
header('Cache-Control: max-age=0');
$objWriter->save('php://output');
}

注意事項

1
2
// 清空輸出緩衝區
ob_clean();

我翻看了網上許多例子,當中都是沒有這句話的,但是如果不加這句話,生成的Excel文件很有可能是亂碼文件,打開時提示的是文件格式無效。一開始我以爲是編碼問題,但是即使我將MySQL,CI,HTML頁面,HTTP頭信息等等所有相關的東西的編碼都統一爲UTF-8或GBK或GB2312,內容也都用iconv轉碼,還是一如既往的出現亂碼,後來搞得我頭都大了,一氣之下生成一個空的沒有任何內容的Excel文件,打開一看還是亂碼,我才知道不是編碼的問題。最後經過多方的查找,才知道是PHPExcel輸出Excel文件時是將整個緩衝區中的內容寫入到Excel文件,而此時如果緩衝區中在Excel文件之前還有其它內容,則會一起寫入到Excel文件當中,導致Excel文件頭中包含髒數據,故而打開時提示文件格式無效。所以切記,在生成Excel文件前,一定記得先清空一下輸出緩衝區!!!

更多應用

PHPExcel是個強大的類庫,它所能做的不僅僅只有這些,更多的功能可以查看PHPExcel官方的文檔,在這裏我列出了一些常用的設置選項。

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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
//創建人
$objPHPExcel->getProperties()->setCreator(”Maarten Balliauw”);

//最後修改人
$objPHPExcel->getProperties()->setLastModifiedBy(”Maarten Balliauw”);

//標題
$objPHPExcel->getProperties()->setTitle(”Office 2007 XLSX Test Document”);

//題目
$objPHPExcel->getProperties()->setSubject(”Office 2007 XLSX Test Document”);

//描述
$objPHPExcel->getProperties()->setDescription(”Test document for Office 2007 XLSX, generated using PHP classes.);

//關鍵字
$objPHPExcel->getProperties()->setKeywords(”office 2007 openxml php”);

//種類
$objPHPExcel->getProperties()->setCategory(”Test result file);

//設置當前的sheet
$objPHPExcel->setActiveSheetIndex(0);

//設置sheet的name
$objPHPExcel->getActiveSheet()->setTitle('Simple');

//設置單元格的值
$objPHPExcel->getActiveSheet()->setCellValue('A1','String');
$objPHPExcel->getActiveSheet()->setCellValue('A2',12);
$objPHPExcel->getActiveSheet()->setCellValue('A3',true);
$objPHPExcel->getActiveSheet()->setCellValue('C5','=SUM(C2:C4)');
$objPHPExcel->getActiveSheet()->setCellValue('B8','=MIN(B2:C5)');

//合併單元格
$objPHPExcel->getActiveSheet()->mergeCells('A18:E22');

//分離單元格
$objPHPExcel->getActiveSheet()->unmergeCells('A28:B28');

//保護cell
$objPHPExcel->getActiveSheet()->getProtection()->setSheet(true);// Needs to be set to true in order to enable any worksheet protection!
$objPHPExcel->getActiveSheet()->protectCells('A3:E13','PHPExcel');

//設置格式
$objPHPExcel->getActiveSheet()->getStyle('E4')->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_EUR_SIMPLE);
$objPHPExcel->getActiveSheet()->duplicateStyle($objPHPExcel->getActiveSheet()->getStyle('E4'),'E5:E13');

//設置寬width
// Set column widths
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);
$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(12);

//設置font
$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setName('Candara');
$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setSize(20);
$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setBold(true);
$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE);
$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_WHITE);
$objPHPExcel->getActiveSheet()->getStyle('E1')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_WHITE);
$objPHPExcel->getActiveSheet()->getStyle('D13')->getFont()->setBold(true);
$objPHPExcel->getActiveSheet()->getStyle('E13')->getFont()->setBold(true);

//設置align
$objPHPExcel->getActiveSheet()->getStyle('D11')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
$objPHPExcel->getActiveSheet()->getStyle('D12')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
$objPHPExcel->getActiveSheet()->getStyle('D13')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
$objPHPExcel->getActiveSheet()->getStyle('A18')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY);
//垂直居中
$objPHPExcel->getActiveSheet()->getStyle('A18')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);

//設置單元格邊框
$objPHPExcel->getActiveSheet()->getStyle('A4')->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle('B4')->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle('C4')->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle('D4')->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle('E4')->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);

//設置邊框顏色
$objPHPExcel->getActiveSheet()->getStyle('D13')->getBorders()->getLeft()->getColor()->setARGB('FF993300');
$objPHPExcel->getActiveSheet()->getStyle('D13')->getBorders()->getTop()->getColor()->setARGB('FF993300');
$objPHPExcel->getActiveSheet()->getStyle('D13')->getBorders()->getBottom()->getColor()->setARGB('FF993300');
$objPHPExcel->getActiveSheet()->getStyle('E13')->getBorders()->getTop()->getColor()->setARGB('FF993300');
$objPHPExcel->getActiveSheet()->getStyle('E13')->getBorders()->getBottom()->getColor()->setARGB('FF993300');
$objPHPExcel->getActiveSheet()->getStyle('E13')->getBorders()->getRight()->getColor()->setARGB('FF993300');

//設置填充顏色
$objPHPExcel->getActiveSheet()->getStyle('A1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
$objPHPExcel->getActiveSheet()->getStyle('A1')->getFill()->getStartColor()->setARGB('FF808080');
$objPHPExcel->getActiveSheet()->getStyle('B1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
$objPHPExcel->getActiveSheet()->getStyle('B1')->getFill()->getStartColor()->setARGB('FF808080');

//加圖片
$objDrawing=new PHPExcel_Worksheet_Drawing();
$objDrawing->setName('Logo');
$objDrawing->setDescription('Logo');
$objDrawing->setPath('./images/officelogo.jpg');
$objDrawing->setHeight(36);
$objDrawing->setWorksheet($objPHPExcel->getActiveSheet());

$objDrawing=new PHPExcel_Worksheet_Drawing();
$objDrawing->setName('Paid');
$objDrawing->setDescription('Paid');
$objDrawing->setPath('./images/paid.png');
$objDrawing->setCoordinates('B15');
$objDrawing->setOffsetX(110);
$objDrawing->setRotation(25);
$objDrawing->getShadow()->setVisible(true);
$objDrawing->getShadow()->setDirection(45);
$objDrawing->setWorksheet($objPHPExcel->getActiveSheet());

//在默認sheet後,創建一個worksheet
$objPHPExcel->createSheet();

http://www.freebluer.net/export-data-in-codeigniter-to-excel-with-phpexcel.html希望對大家有所幫助。

以上!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章