众所周知,在项目的开发过程中经常会遇到用excel做功能的时候,比如一个商城导出订单列表,办公系统导出考勤记录,还有一些excel表格内容批量上传到数据库的情况。那么这么一款强大的类库到底该如何使用它?类库又在哪里下载,本文将一一奉上。
概述
PHPExcel 是用来操作Office Excel 文档的一个PHP类库,它基于微软的OpenXML标准和PHP语言。可以使用它来读取、写入不同格式的电子表格,如 Excel (BIFF) .xls, Excel 2007 (OfficeOpenXML) .xlsx, CSV, Libre/OpenOffice Calc .ods, Gnumeric, PDF, HTML等等
支持的格式
读取
BIFF 5-8 (.xls) Excel 95 版本及以上[1]
Office Open XML (.xlsx) Excel 2007 版本及以上
SpreadsheetML (.xml) Excel 2003
Open Document Format/OASIS (.ods)
CSV 等
写入
BIFF 8 (.xls) Excel 95 版本及以上
Office Open XML (.xlsx) Excel 2007 版本及以上
HTML
CSV
PDF (使用 tcPDF, DomPDF or mPDF PHP类库, 需要单独安装)
要求
PHP 5.2.0 版本及以上
PHP extension php_zip 开启 (如果你需要使用 PHPExcel 来操作 .xlsx .ods or .gnumeric 文件)
PHP extension php_xml 开启
PHP extension php_gd2 开启(选填, 如果需要计算准确的列宽需要开启此扩展)
(以上出自于百度百科,微笑.jpg)
使用
导入excel到数据库
以下代码以CI框架为例,其它框架使用请举一反三试之。
html上传
<!-- Html上传 -->
<div class="div_center">
<form action="<?php echo module_url('excel/common/ajax_all_daoru/');?>" method="post" enctype="multipart/form-data">
<table class="table table-bordered">
<tbody>
<tr class="table_thbg">
<td class="align_left">请选择文件</td>
<td class="align_left"><input type="file" class="span12" name="xls_file" />
</td>
</tr>
</tbody>
</table>
<input type="submit" name="tijiao" class="btn btn_style1" value="上传">
</form>
</div>
php解析excel并写入到数据库
/**
* excel上传并写入数据库
* @return int 状态
* @author 命中水、
*/
function excel_all_daoru() {
//获取excel文件路径
$excel_path = $this->get_excel_path();
//获取excel文件数组
$excel_data = $this->get_excel_data($excel_path);
//调用插入方法
$this->all_insert($excel_data);
}
/**
* excel文件上传
* @return string excel路径
* @author 命中水
*/
function get_excel_path() {
if (!empty($_FILES['xls_file']['name'])) {
$filename = $_FILES['xls_file']['name'];
$fileTmpAddr = $_FILES['xls_file']['tmp_name'];
$extend = strrchr($filename, '.'); //获取文件后缀名
//上传后的文件名
$excel_path = base_url() . date("YmdHis") . $extend; //上传后的文件名地址
/* 判别是不是.xls或者xlsx文件,判别是不是excel文件 */
if ($extend != ".xls" and $extend != '.xlsx') {
throw new Exception("不是Excel文件,请重新上传!", -1);
} else {
//$readerType = ($extend == ".xlsx") ? "Excel2007" : "Excel5";
$result = move_uploaded_file($fileTmpAddr, $excel_path);
if( !empty( $result ) ) { //如果上传成功 调用excel解析文件方法 传入文件地址
return $excel_path;
}
}
}
}
/**
* get_excel_data文件解析成数组
* @param string $excel_path excel文件路径
* @return array excel数组
* @author 命中水、
*/
function get_excel_data($excel_path) {
//引入phpexcel类库
$this->load->library('PHPExcel');
$this->load->library('PHPExcel/IOFactory');
//实例化excel 传入文件路径
$objPHPExcel = IOFactory::load($excel_path);
//调用类库解析excel文件成数组
$excel_data = $objPHPExcel->getActiveSheet()->toArray(null, true, true, true);
unset($sheetData[1]); //释放表头信息
unset($sheetData[2]); //释放表头信息
return $excel_data;
}
导出数据到Excel
<?php
/**
* excel导出
* @return file
* @author 命中水、
*/
function excel_daochu() {
//设置表格标头
$excel_bt = array(
'A1' => '2016-10-16 excel导出测试', 'A2' => '时间', 'B2' => '地点', 'C2' => '人物');
//设置导出信息
$excel_msg = array(
0 => array(
'time' => time(),
'address' => '秦岭云海',
'name' => '张起灵'
),
1 => array(
'time' => time(),
'address' => '云顶天宫',
'name' => '吴邪'
),
2 => array(
'time' => time(),
'address' => '怒海潜沙',
'name' => '三叔'
),
);
//引入excel类库
$this->load->library('PHPExcel');
$this->load->library('PHPExcel/IOFactory');
//实例化
$objPHPExcel = new PHPExcel();
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
//设置表头
$this->Excel_bt($objPHPExcel, $excel_bt);
//导出的内容
$this->Excel_lr($objPHPExcel, $excel_msg);
//设置单元格的宽度
$objPHPExcel->getActiveSheet()->getColumnDimension('b')->setWidth(15);
//合并单元格
$objPHPExcel->getActiveSheet()->mergeCells('A1:Q1');
//水平垂直居中设置
$objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
$objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$filename = iconv('utf-8', 'gb2312', $excel_bt['A1']);
//清空缓冲区
ob_end_clean();
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="' . $filename . '.xlsx"');
header("Content-Transfer-Encoding:binary");
$objWriter->save('php://output');
}
//设置到导出标题的方法
public function Excel_bt($objPHPExcel, $excel_bt) {
foreach ($bt_data as $key => $value) {
$objPHPExcel->getActiveSheet()->setCellValue($key, $value);
}
}
//设置导出的内容
public function Excel_lr($objPHPExcel, $excel_msg) {
//从第三行开始导出 第一行第二行 设置表头
$i = 3;
$data = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
foreach ($excel_msg $key => $value) {
$j = 0;
foreach ($value as $k => $v) {
//$j = 0 $i = 3 $data[$j] . $i == A3
$objPHPExcel->getActiveSheet()->setCellValue($data[$j] . $i, $v);
$j++;
}
$i++;
}
}
常见问题
找不到文件
原因可能是因为缓冲区没有打开或者mb_overlod_func
函数没有关闭,解决这个问题的办法一般就是把php.ini
中display_errors
打开,下载文件,打开后会提示相应错误信息。如果是因为mb_overlod_func
函数没有关闭,那么就在php.ini
文件中找到mbsrtring.func_overload=7
,注释掉即可。
ru'guo能正常导出excel
但是没有数据,那么一般是你的代码写错了(坏笑.jpg)
生成excel文件打开报错
我曾经遇到过类似的问题,也纠结了我好久,最终在一个不经意的情况下解决了。解决的办法是在方法一开始就用ob_end_clean
清空缓冲区,然后在最后的excel输出文件之前再调用一次ob_end_clean
。具体请参考我在segmentfault的提问,链接:PHP生成excel文件打开报错;
打开excel文件乱码
这个问题的原因,一般就是因为编码的问题了。因为我们的代码一般用的UTF-8编码,而windows下的编码一般为gb2312。解决方法一般是对文件名进行iconv转码iconv('utf-8", "gb2312", $filename)
;
总结
以上就是PHPExcel类库导入导出的具体使用方法了,每一行,每一个步骤的注释也写的很清楚了,如果有疑问的童鞋可以私密博主呦~ QAQ
附录资料
PHPExcel 类库压缩包下载:PHPExcel.rar