PhpPresentation ppt 导出PPT
最近老大让我用php做一个生成并下载PPT的功能,从一无所知,到慢慢做成,成就感还是满满的,现在将最近的收获记录下来,以备后用。
通过百度,发现有两个可以生成ppt的工具,一个是PhpPresentation插件,一个是phppowerpoint,但是phppowerpoint已经暂停使用了,只能用PhpPresentation插件来整一下。
要求:PHP版本>php7.1
1.下载 PhpPresentation插件
下载git地址:https://github.com/PHPOffice/PHPPresentation,我用的是develop分支的代码
composer下载方式:composer require phpoffice/phppresentation dev-develop
据说是master 分支 3 年前已经停止合并了,develop 分支仍在维护,有相当一部分 bug 是最近几年修改的
手册地址:https://phppowerpoint.readthedocs.io/en/latest/
2.学习PHPPresentation/samples中的用例
学习用例,一来配置一下环境,二来看是否能快速找到自己想要的功能。
在执行php Sample_04_Table.php时,报错缺少Common\Adapter\Zip\ZipArchiveAdapter,这个Common目录为https://github.com/PHPOffice/Common
忘记自己当时怎么想的了,,我是将Common目录直接放到了PhpPresentation中,修改了一下namespace中的路径什么的,,最终达到的效果是执行php Sample_04_Table.php能够成功ppt。
我使用的PhpPresentation 代码为PhpPresentation.zip
3.将附件运用到wamp环境中
1)将PhpPresentation目录放到Include/Library/Vendor/目录
2)在xxController.class.php的导出ppt方法中引入PhpPresentation
vendor('PHPPresentation.src.PhpPresentation.Autoloader','','.php');
\PhpPresentation\Autoloader::register();
3)使用
(1)新建ppt对象,设置幻灯片大小
#新建ppt对象 $pptObj=new \PhpPresentation\PhpPresentation(); $layout = new \PhpPresentation\DocumentLayout(); #设置幻灯片大小 ##指定长宽 $layout->setDocumentLayout(\PhpPresentation\DocumentLayout::LAYOUT_CUSTOM,true) #set scale ->setCX(959,\PhpPresentation\DocumentLayout::UNIT_POINT) ->setCY(540,\PhpPresentation\DocumentLayout::UNIT_POINT); #33.83cm*19.05cm
$layout->setDocumentLayout(\PhpPresentation\DocumentLayout::LAYOUT_CUSTOM,true) #set scale ->setCX(1280,\PhpPresentation\DocumentLayout::UNIT_PIXEL) ->setCY(720,\PhpPresentation\DocumentLayout::UNIT_PIXEL); #单位是像素px
$layout->setDocumentLayout(\PhpPresentation\DocumentLayout::LAYOUT_CUSTOM,true) #set scale ->setCX(33.87,\PhpPresentation\DocumentLayout::UNIT_CENTIMETER) ->setCY(19.05,\PhpPresentation\DocumentLayout::UNIT_CENTIMETER); #1280x720 ##指定比例 $layout->setDocumentLayout(\PhpPresentation\DocumentLayout::LAYOUT_SCREEN_16X9); $pptObj->setLayout($layout); #移除首页
$pptObj->removeSlideByIndex(0); //remove first page
(2)设置slide背景样式
如果你有ppt模板的话,是可以导入模板的,但是我一开始不知道,所以我定义了一个方法,将需要的版式截图作为背景插入到slide中
public function createTemplatedSlide(\PhpPresentation\PhpPresentation $pptObj,$title){ #title 每个slide最上边的标题 // Create slide $slide = $pptObj->createSlide(); // Add background 实例化背景图片对象 $oBkgImage = new \PhpPresentation\Slide\Background\Image(); $oBkgImage->setPath('./Public/Images/ppt_middle.png'); #ppt_middle.png背景图片 $slide->setBackground($oBkgImage); //add title in text shape $shape = $slide->createRichTextShape() ->setHeight(60) ->setWidth(1200) ->setOffsetX(60) ->setOffsetY(20); $shape->getActiveParagraph()->getAlignment()->setHorizontal(\PhpPresentation\Style\Alignment::HORIZONTAL_LEFT); $textRun = $shape->createTextRun($title); $textRun->getFont()->setBold(true) ->setSize(32) ->setColor(new \PhpPresentation\Style\Color('FFB60005')); return $slide; }
同理,首页、最后一页这些特殊页,都可以用这中插入图片做背景的方式来实现,咋方便咋来
(3)生成表格
#实例化table对象 $shape = $pptObj->createTableShape(2); #2是列数 #设置表格大小,以及偏移量 $shape->setHeight(300)->setWidth(800)->setOffsetX(120)->setOffsetY(120); #创建行 $row = $shape->createRow(); $oCell = $row->nextCell(); $oCell->setWidth(202); $text=$oCell->createTextRun('test'); $text->getFont()->setSize(16)->setBold(true)->setColor(new \PhpPresentation\Style\Color('FFFFFFFF')); #白色字体 $oCell = $row->nextCell(); $oCell->setWidth(104); $text=$oCell->createTextRun('test2'); $text->getFont()->setSize(16)->setBold(true)->setColor(new \PhpPresentation\Style\Color('FFFFFFFF')); #白色字体 $row->setHeight(40); #设置行高 $row->getFill()->setFillType(\PhpPresentation\Style\Fill::FILL_SOLID) #设置行的填充颜色 ->setStartColor(new \PhpPresentation\Style\Color('FFB60005')) ->setEndColor(new \PhpPresentation\Style\Color('FFB60005')); foreach ($row->getCells() as $cell){ #设置单元格的border颜色,FFFFFF为白色,即不要边界线 getTop/getLeft/getRight/getBottom $cell->getBorders()->getTop()->setColor(new \PhpPresentation\Style\Color('FFFFFFFF')); #设置单元格中的字体水平垂直居中 $cell->getActiveParagraph()->getAlignment()->setHorizontal(\PhpPresentation\Style\Alignment::HORIZONTAL_CENTER) ->setVertical(\PhpPresentation\Style\Alignment::VERTICAL_CENTER ); }
(4)生成折线图
#两条线 $line_data=array('line1'=>array('Monday 01' => 2,'Tuesday 02' => 5,'Wednesday 03' => 3,'Thursday 04' => 7,'Friday 05' => 4,'Saturday 06' => 9,'Sunday 07' => 7),
'line2'=>array('Monday 01' => 12,'Tuesday 02' => 15,'Wednesday 03' => 13,'Thursday 04' => 17,'Friday 05' => 14,'Saturday 06' => 19,'Sunday 07' => 17)); #创建chart实例 $shape1 = $pptObj->createChartShape(); $shape1->setResizeProportional(false)->setHeight(260)->setWidth(880) ->setOffsetX(80)->setOffsetY(280); $shape1->getTitle()->setVisible(false); //$shape1->getPlotArea()->getAxisX()->setMajorUnit(1); #设置legend $shape1->getLegend()->setVisible(true); $shape1->getLegend()->getFont()->setSize(12); $shape1->getLegend()->getBorder()->setLineStyle(\PhpPresentation\Style\Border::LINE_NONE); #设置x轴,y轴 $oOutlineAxisX = new \PhpPresentation\Style\Outline(); //$oOutlineAxisX->setWidth(400000000); $oOutlineAxisX->getFill()->setFillType(\PhpPresentation\Style\Fill::FILL_SOLID) ->setStartColor(new \PhpPresentation\Style\Color('FF808080')); $oOutlineAxisY = new \PhpPresentation\Style\Outline(); //$oOutlineAxisY->setWidth(400000000); $oOutlineAxisY->getFill()->setFillType(\PhpPresentation\Style\Fill::FILL_SOLID) ->setStartColor(new \PhpPresentation\Style\Color('FF808080')); $shape1->getPlotArea()->getAxisX()->setOutline($oOutlineAxisX); #显示x轴线 $shape1->getPlotArea()->getAxisY()->setOutline($oOutlineAxisY); #显示y轴线 $shape1->getPlotArea()->getAxisX()->setTitle(''); #不要标题 $shape1->getPlotArea()->getAxisY()->setTitle(''); $shape1->getPlotArea()->getAxisX()->setMajorTickMark(\PhpPresentation\Shape\Chart\Axis::TICK_MARK_OUTSIDE); #x轴上的刻度 $shape1->getPlotArea()->getAxisY()->setMajorTickMark(\PhpPresentation\Shape\Chart\Axis::TICK_MARK_OUTSIDE); #设置网格 $oGridLines2 = new \PhpPresentation\Shape\Chart\Gridlines(); $oGridLines2->getOutline()->setWidth(10); $oGridLines2->getOutline()->getFill()->setFillType(\PhpPresentation\Style\Fill::FILL_SOLID) ->setStartColor(new \PhpPresentation\Style\Color('FF808080')); $shape1->getPlotArea()->getAxisY()->setMajorGridlines($oGridLines2); #只设置了y轴上有网格 #画线 $color=array('FFB60005','FFF08080','FF808080','FF4169E1','FFFF8C00'); $marker=array('diamond','square','triangle','x','star'); #circle,plus $i=0; $lineChart = new \PhpPresentation\Shape\Chart\Type\Line(); foreach($line_data as $name=>$vals){ $series = new \PhpPresentation\Shape\Chart\Series($name, $vals); $series->setShowSeriesName(false); $series->setShowValue(false); $series->setShowLeaderLines(false); #set marker $series->getMarker()->setSymbol($marker[$i]); if(in_array($marker[$i],array('circle','square','diamond','triangle'))){ $series->getMarker()->getFill()->setFillType(\PhpPresentation\Style\Fill::FILL_SOLID); $series->getMarker()->getFill()->setStartColor(new \PhpPresentation\Style\Color($color[$i])); } $series->getMarker()->getBorder()->setColor(new \PhpPresentation\Style\Color($color[$i])); $series->getMarker()->setSize(5); #set color $oOutline = new \PhpPresentation\Style\Outline(); $oOutline->getFill()->setFillType(\PhpPresentation\Style\Fill::FILL_SOLID); $oOutline->getFill()->setStartColor(new \PhpPresentation\Style\Color($color[$i])); $oOutline->setWidth(150000000); $series->setOutline($oOutline); $lineChart->addSeries($series); $i=$i+1; } $shape1->getPlotArea()->setType($lineChart);
4.下载ppt
$ppt_name="test.pptx"; header("Content-Type: application/vnd.openxmlformats-officedocument.presentationml.presentation"); header("Content-Disposition: attachment; filename=$ppt_name"); $oWriterPPTX = \PhpPresentation\IOFactory::createWriter($pptObj,'PowerPoint2007'); $oWriterPPTX->save('php://output'); unlink($ppt_name); exit;
以上只作为工作后的常用命令总结,不保证完全正确性!
参考:https://learnku.com/articles/45161
https://blog.csdn.net/weixin_42412237/article/details/113765765
https://www.5axxw.com/wiki/content/2f7vay