PHPExcel 使用简单说明

PHPExcel 下载地址

  • 解压后把Classes文件夹复制到项目目录并重新命名为PHPExcel。
  • 新建一个excel表格 ------------实例化PHPExcel
  • 创建sheet(内置表) -----------createSheet()方法 获取当前活动对象 getActiveSheet方法
  • 填充数据 ------------setCellValue方法
  • 保存文件 -------------PHPExcel_IOFactory::createWriter()方法 save()方法

首先看一下目录结构:

QQ截图20190829114642.png

QQ截图20190829114642.png


创建index.php

<?php /** * Created by ZhengNiu. * User: admin * Date: 2019/8/28 * Time: 14:59 */ $dir = dirname(__FILE__); require_once $dir . '/PHPExcel/PHPExcel.php'; $objPHPExcel = new PHPExcel();//实例化PHPExcel类 等同于在桌面上新建一个excel。 $objSheet = $objPHPExcel->getActiveSheet();//获取当前活动sheet的操作对象 $objSheet->setTitle('demo');//给当前活动sheet设置名称 $objSheet->setCellValue("A1", "姓名")->setCellValue("B1", "分数");//给当前活动sheet填充数据 $objSheet->setCellValue("A2", "张三")->setCellValue("B2", 50); /*$arr = [ ['姓名','分数'], ['李四','60'], ['王五','70'] ]; $objSheet->fromArray($arr);//直接加载数据块添加数据*/ $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');//按照指定格式生成excel文件 $objWriter->save($dir . '/demo.xlsx');

效果:

4.png

4.png

结合数据库查询写一个简单的小例子:场景有这样一个订单表如图,我们把1-20号订单,21-40号订单,41-60号订单分开放在不同的sheet里面。

1.png

1.png

dbconfig.php--数据库配置文件

<?php /** * Created by ZhengNiu. * User: admin * Date: 2019/8/28 * Time: 15:37 */ $dbconfig = [ 'host' => '127.0.0.1', 'username' => 'root', 'password' => '123456', 'database' => 'test', 'charset' => 'utf8' ];

db.php----数据库操作类

<?php /** * Created by ZhengNiu. * User: admin * Date: 2019/8/28 * Time: 15:39 */ require_once dirname(__FILE__) . '/dbconfig.php'; class db { public $conn = null; static $_instance; /** * db constructor. * @param $config */ private function __construct($config) { $this->conn = mysqli_connect($config['host'], $config['username'], $config['password'], $config['database']); if ($this->conn->connect_errno) { printf("Connect failed: %s\n", $this->conn->connect_error); exit(); } mysqli_query($this->conn, "set names " . $config['charset']) or die(mysqli_error($this->conn)); } /** * @param $sql * @return array */ public function getResult($sql) { $resource = mysqli_query($this->conn, $sql) or die(mysqli_error($this->conn)); $res = []; while (($row = mysqli_fetch_assoc($resource)) != false) { $res[] = $row; } return $res; } private function __clone(){} /** * @param $config * @return db */ public static function getInstance($config){ if(FALSE == (self::$_instance instanceof self)){ self::$_instance = new self($config); } return self::$_instance; } /** * @param $sql * @return bool|mysqli_result */ public function query($sql) { return $this->conn->query($sql); } /** ** 查询所有的年级 **/ public function getAllGrade(){ $sql="select distinct(grade) from user order by grade asc"; $res=$this->getResult($sql); return $res; } /** **根据年级数查询所有的班级 **/ public function getClassByGrade($grade){ $sql="select distinct(class) from user where grade=".$grade." order by class asc"; $res=$this->getResult($sql); return $res; } /** **根据年级数班级数查询学生信息 **/ public function getDataByClassGrade($class,$grade){ $sql="select username,score from user where class=".$class." and grade=".$grade." order by score desc"; $res=$this->getResult($sql); return $res; } }

helpers.php---调试输出文件

<?php /** * Created by ZhengNiu. * User: admin * Date: 2019/8/29 * Time: 10:15 */ /** * @param $val * @param bool $dump * @param bool $exit */ function debug($val, $dump = false, $exit = true) { if ($dump) { $func = 'var_dump'; } else { $func = (is_array($val) || is_object($val)) ? 'print_r' : 'printf'; } header("Content-type:text/html;charset=utf-8"); echo '<pre>debug output:<hr />'; $func($val); echo "</pre>"; if ($exit) exit; }

export.php----逻辑代码文件

<?php /** * Created by ZhengNiu. * User: admin * Date: 2019/8/28 * Time: 15:59 */ $dir = dirname(__FILE__); require_once $dir . '/db.php'; require_once $dir . '/PHPExcel/PHPExcel.php'; $db = db::getInstance($dbconfig); $objPHPExcel = new PHPExcel();//实例化PHPExcel类 等同于在桌面上新建一个excel。 for ($i = 1; $i <= 3; $i++) { if ($i > 1) { $objPHPExcel->createSheet();//创建sheet } $objPHPExcel->setActiveSheetIndex($i - 1);//把新创建的sheet设定为当前sheet $objSheet = $objPHPExcel->getActiveSheet();//获取当前活动sheet $objSheet->setTitle('订单号:' . (($i - 1) * 20 + 1) . '~' . $i * 20); $where = " id>=".(($i-1)*20 + 1).' AND id<='.($i*20); $data = $db->getResult("SELECT * FROM `order` WHERE {$where}");//查询每个年级的学生数据 $objSheet->setCellValue('A1', '订单ID') ->setCellValue('B1', '是否删除') ->setCellValue("C1", '发货时间') ->setCellValue("D1", '是否取消') ->setCellValue("E1", '是否发货') ->setCellValue("F1", '是否验证') ->setCellValue("G1", '验证时间'); //从第二行开始写入 $j = 2; foreach ($data as $k => $v) { $objSheet->setCellValue("A" . $j, $v['id']) ->setCellValue("B" . $j, $v['is_del']) ->setCellValue("c" . $j, $v['send_time']) ->setCellValue("D" . $j, $v['is_cancel']) ->setCellValue("E" . $j, $v['is_send']) ->setCellValue("F" . $j, $v['is_token']) ->setCellValue("G" . $j, $v['token_time']); $j++; } } $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');//按照指定格式生成excel文件 //保存在服务器 //$objWriter->save($dir . '/export.xlsx'); //输出到浏览器 browser_export('Excel5','browser_export03.xls'); $objWriter->save('php://output'); exit; /** * 输出到浏览器 * * @param $type * @param $filename */ 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');//禁止缓存 }

效果:

5.png

5.png

下面我们以年级、班级、学生成绩为例介绍一些常用的样式(设置字体、设置边框、合并单元格、设置、设置背景色、以及单元格内换行、单元格不以科学记数法显示等)

首先我们建一个数据表并插入一些数据如图:

2.png

2.png

insert.php----插入测试数据文件

<?php /** * Created by ZhengNiu. * User: admin * Date: 2019/8/29 * Time: 9:23 */ $dir = dirname(__FILE__); require_once $dir . '/db.php'; require_once $dir.'/helpers.php'; $conn = db::getInstance($dbconfig); //$conn->query("truncate table `user`");die; $sqlTpl = "INSERT INTO `user` (`id`,`class`,`grade`,`score`,`username`) VALUES "; $val = ""; for ($i = 1; $i <= 1000; $i++) { $username = getUsername(); $value = [$i, rand(1, 4), rand(1, 3), rand(20, 100), "'{$username}'"]; $val .= " ( " . implode(',', $value) . " ) ,"; } $insertStr = $sqlTpl.rtrim($val, ','); $conn->query($insertStr); /** * @return string */ function getUsername() { $name = ["张飞", "李奎", "赵三", "赵云", "王昭君", "孙策", "孙尚香", "哪吒", "刘婵", "后裔", "妲己"]; $randge = range("A", "Z"); $randgeNum = range(0, 1000); return $name[rand(0, count($name) - 1)] . $randge[rand(0, count($randge) - 1)] . $randgeNum[rand(0, count($randgeNum) - 1)]; }

style.php-----逻辑代码

<?php /** * Created by ZhengNiu. * User: admin * Date: 2019/8/28 * Time: 15:59 */ $dir = dirname(__FILE__); require_once $dir . '/db.php'; require_once $dir . '/PHPExcel/PHPExcel.php'; require_once $dir.'/helpers.php'; $db = db::getInstance($dbconfig); $objPHPExcel = new PHPExcel();//实例化PHPExcel类 等同于在桌面上新建一个excel。 $objSheet = $objPHPExcel->getActiveSheet();//获得当前活动单元格 $objSheet->setTitle("学生成绩统计"); $objSheet->getDefaultStyle()->getAlignment() ->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER) ->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);//设置excel文件默认水平垂直方向居中 $objSheet->getDefaultStyle()->getFont()->setSize(14)->setName("微软雅黑");//设置默认字体大小和格式 $objSheet->getStyle("A2:Z2")->getFont()->setSize(20)->setBold(true);//设置第二行字体大小和加粗 $objSheet->getStyle("A3:Z3")->getFont()->setSize(16)->setBold(true);//设置第三行字体大小和加粗 $objSheet->getDefaultRowDimension()->setRowHeight(30);//设置默认行高 $objSheet->getRowDimension(2)->setRowHeight(50);//设置第二行行高 $objSheet->getRowDimension(3)->setRowHeight(40);//设置第三行行高 $gradeInfo = $db->getAllGrade();//查询所有的年级 $index = 0; foreach ($gradeInfo as $g_k => $g_v) { $gradeIndex = getCells($index * 2);//获取年级信息所在列 $objSheet->setCellValue($gradeIndex . "2", "高" . $g_v['grade']); $classInfo = $db->getClassByGrade($g_v['grade']);//查询每个年级所有的班级 foreach ($classInfo as $c_k => $c_v) { $nameIndex = getCells($index * 2);//获得每个班级学生姓名所在列位置 $scoreIndex = getCells($index * 2 + 1);//获得每个班级学生分数所在列位置 $objSheet->mergeCells($nameIndex . "3:" . $scoreIndex . "3");//合并每个班级的单元格 $objSheet->getStyle($nameIndex . "3:" . $scoreIndex . "3") ->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID) ->getStartColor()->setRGB('6fc144');//填充班级背景颜色 $classBorder = getBorderStyle("445cc1");//获取班级边框样式代码 $objSheet->getStyle($nameIndex . "3:" . $scoreIndex . "3")->applyFromArray($classBorder);//设置每个班级的边框 $info = $db->getDataByClassGrade($c_v['class'], $g_v['grade']);//查询每个班级的学生信息 $objSheet->setCellValue($nameIndex . "3", $c_v['class'] . "班");//填充班级信息 $objSheet->getStyle($nameIndex)->getAlignment()->setWrapText(true);//设置文字自动换行 $objSheet->setCellValue($nameIndex . "4", "姓名\n换行")->setCellValue($scoreIndex . "4", "分数"); $objSheet->getStyle($scoreIndex)->getNumberFormat() ->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_TEXT);//设置某列单元格格式为文本格式 $j = 5; foreach ($info as $key => $val) { $objSheet->setCellValue($nameIndex . $j, $val['username'])->setCellValue($scoreIndex . $j, $val['score']);//填充学生信息 $j++; } $index++; } $endGradeIndex = getCells($index * 2 - 1);//获得每个年级的终止单元格 $objSheet->mergeCells($gradeIndex . "2:" . $endGradeIndex . "2");//合并每个年级的单元格 $objSheet->getStyle($gradeIndex . "2:" . $endGradeIndex . "2")->getFill() ->setFillType(PHPExcel_Style_Fill::FILL_SOLID) ->getStartColor()->setRGB('c1b644');//填充年级背景颜色 $gradeBorder = getBorderStyle("c144b1");//获取年级边框样式代码 $objSheet->getStyle($gradeIndex . "2:" . $endGradeIndex . "2")->applyFromArray($gradeBorder);//设置每个年级的边框 } //die; //debug($index); $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');//按照指定格式生成excel文件 //保存在服务器 //$objWriter->save($dir . '/export.xlsx'); //输出到浏览器 browser_export('Excel5','browser_export03.xls'); $objWriter->save('php://output'); exit; /** * 输出到浏览器 * * @param $type * @param $filename */ 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');//禁止缓存 } function getCells($index) { $arr = range('A', 'Z'); //$arr=array(A,B,C,D,E,F,G,H,I,J,K,L,M,N,....Z); return $arr[$index]; } /** **获取边框样式代码 **/ function getBorderStyle($color) { $styleArray = array( 'borders' => array( 'outline' => array( 'style' => PHPExcel_Style_Border::BORDER_THICK, 'color' => array('rgb' => $color), ), ), ); return $styleArray; }

演示结果:

3.png

3.png

插入图片、添加丰富的文字块、添加超链接、添加批注等

<?php $dir=dirname(__FILE__);//查找当前脚本所在路径 require $dir."/db.php";//引入mysql操作类文件 require $dir."./../PHPExcel/PHPExcel.php";//引入PHPExcel $objPHPExcel=new PHPExcel();//实例化PHPExcel类, 等同于在桌面上新建一个excel $objSheet=$objPHPExcel->getActiveSheet();//获得当前活动sheet /**插入图片代码开始**/ $objDrawing=new PHPExcel_WorkSheet_Drawing();//获得一个图片的操作对象 $objDrawing->setPath($dir."./../1.png");//加载图片路径 $objDrawing->setCoordinates("F6");//设置图片插入位置的左上角坐标 $objDrawing->setWidth(500);//设置插入图片的大小 等比 //$objDrawing->setHeight(100);//会覆盖上面的setWidth //$objDrawing->setOffsetX(20)->setOffsetY(40);//设定单元格内偏移量 $objDrawing->setWorkSheet($objSheet);//将图片插入到sheet /**代码结束**/ /**添加丰富的文字块**/ $objRichText=new PHPExcel_RichText();//获得一个文字块操作对象 $objRichText->createText("我的测试");//添加普通的文字 不能操作样式 $objStyleFont=$objRichText->createTextRun("我的测试");//生成可以添加样式的文字块 $objStyleFont->getFont()->setSize(16)->setBold(True)->setColor(new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_GREEN));//加一些样式 $objRichText->createText(",我的测试"); $objSheet->getCell("F4")->setValue($objRichText);//将文字块插入sheet里 /**代码结束**/ /**添加批注代码开始**/ $objSheet->mergeCells("F4:N4");//合并单元格 $objSheet->getComment("F4")->getText()->createTextRun("Van:\r\n我的测试\n\n时尚时尚最时尚");//添加批注 /**代码结束**/ /**超链接代码开始**/ $objSheet->setCellValue("I3","我的测试");//添加文字 $objSheet->getStyle("I3")->getFont()->setSize(16)->setBold(true)->setUnderline(true)->setColor(new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_BLUE));//添加样式 $objSheet->getCell("I3")->getHyperlink()->setUrl("http://www.baidu.com");//给文字加上链接地址 /**代码结束**/ $objWriter=PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel2007');//生成excel文件 //$objWriter->save($dir."/export_1.xls");//保存文件 browser_export('Excel2007','browser_excel03.xlsx');//输出到浏览器 $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');//禁止缓存 } ?>

演示:
6.png

6.png

图表绘制

<?php $dir=dirname(__FILE__);//查找当前脚本所在路径 require $dir."/db.php";//引入mysql操作类文件 require $dir."/PHPExcel/PHPExcel.php";//引入PHPExcel $db = db::getInstance($dbconfig);//实例化db类 连接数据库 $objPHPExcel=new PHPExcel();//实例化PHPExcel类, 等同于在桌面上新建一个excel $objSheet=$objPHPExcel->getActiveSheet();//获得当前活动sheet /**本节课程代码编写开始**/ $array=array( array("","一班","二班","三班"), array("不及格",20,30,40), array("良好",30,50,55), array("优秀",15,17,20) );//准备数据 $objSheet->fromArray($array);//直接加载数组填充进单元格内 //开始图表代码编写 $labels=array( new PHPExcel_Chart_DataSeriesValues('String','Worksheet!$B$1',null,1),//一班 new PHPExcel_Chart_DataSeriesValues('String','Worksheet!$C$1',null,1),//二班 new PHPExcel_Chart_DataSeriesValues('String','Worksheet!$D$1',null,1),//三班 );//先取得绘制图表的标签 $xLabels=array( new PHPExcel_Chart_DataSeriesValues('String','Worksheet!$A$2:$A$4',null,3)//取得图表X轴的刻度 ); $datas=array( new PHPExcel_Chart_DataSeriesValues('Number','Worksheet!$B$2:$B$4',null,3),//取一班的数据 new PHPExcel_Chart_DataSeriesValues('Number','Worksheet!$C$2:$C$4',null,3),//取二班的数据 new PHPExcel_Chart_DataSeriesValues('Number','Worksheet!$D$2:$D$4',null,3)//取三班的数据 );//取得绘图所需的数据 $series=array( new PHPExcel_Chart_DataSeries( PHPExcel_Chart_DataSeries::TYPE_LINECHART,//线状图 PHPExcel_Chart_DataSeries::GROUPING_STANDARD,//类别 range(0,count($labels)-1), $labels, $xLabels, $datas ) );//根据取得的东西做出一个图表的框架 //设置所在位置的值 $layout=new PHPExcel_Chart_Layout(); $layout->setShowVal(true); $areas=new PHPExcel_Chart_PlotArea($layout,$series); //设置靠右位置 $legend=new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_RIGHT,$layout,false); $title=new PHPExcel_Chart_Title("高一学生成绩分布"); $ytitle=new PHPExcel_Chart_Title("value(人数)"); $chart=new PHPExcel_Chart( 'line_chart', $title, $legend, $areas, true, false, null, $ytitle );//生成一个图标 // 左上和右下角位置确定 $chart->setTopLeftPosition("A7")->setBottomRightPosition("K25");//给定图表所在表格中的位置 $objSheet->addChart($chart);//将chart添加到表格中 $objWriter=PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel2007');//生成excel文件 $objWriter->setIncludeCharts(true); //$objWriter->save($dir."/export_1.xls");//保存文件 browser_export('Excel2007','browser_chart.xlsx');//输出到浏览器 $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');//禁止缓存 } ?>

演示:
7.png

7.png

读取excel:

<?php header("Content-Type:text/html;charset=utf-8"); $dir = dirname(__FILE__);//找到当前脚本所在路径 require $dir . "/PHPExcel/PHPExcel/IOFactory.php";//引入读取excel的类文件 $filename = $dir . "/demo.xlsx"; $fileType = PHPExcel_IOFactory::identify($filename);//自动获取文件的类型提供给phpexcel用 $objReader = PHPExcel_IOFactory::createReader($fileType);//获取文件读取操作对象 $sheetName = array("demo"); $objReader->setLoadSheetsOnly($sheetName);//只加载指定的sheet $objPHPExcel = $objReader->load($filename);//加载文件 //$sheetCount=$objPHPExcel->getSheetCount();//获取excel文件里有多少个sheet // for($i=0;$i<$sheetCount;$i++){ // $data=$objPHPExcel->getSheet($i)->toArray();//读取每个sheet里的数据 全部放入到数组中 // print_r($data); //} foreach ($objPHPExcel->getWorksheetIterator() as $sheet) {//循环取sheet foreach ($sheet->getRowIterator() as $row) {//逐行处理 if ($row->getRowIndex() < 2) { continue; } foreach ($row->getCellIterator() as $cell) {//逐列读取 $data = $cell->getValue();//获取单元格数据 echo $data . " "; } echo '<br/>'; } echo '<br/>'; } exit; ?>

**拓展:

PHP启用缓存

  • 默认 -----------按cell占用PHP内存
  • cache_ in memory serialized ------------ 序列化存放PHP内存
  • cache in memory gzip ----------进一 步压缩
  • cache_ in memory_ disclSAM ------------ 存放于硬盘
  • cache_ in memory .phpTemp -----------存放于临时文件夹
  • cache in memory_ memcache ----------存放于memcache里
以memcache为例子简单的说明一下、具体使用请参考文档
<?php $dir = dirname(__FILE__); require_once $dir . '/PHPExcel/PHPExcel.php'; $cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_memcache; $cacheSettings = array( 'memcacheServer' => 'localhost', 'memcachePort' => 11211, 'cache Time' => 600 ); PHPExcel_Settings:setCacheStorageMethod($cacheMethod, $cacheSettings); ?>

PHPExcel相关文章、大文件导出数据相关文章


Last modification:September 19, 2019
如果觉得我的文章对你有用,请随意赞赏