最近两周都在弄关于excel模板导出、excel转pdf、多文件压缩下载。弄得头都大了,接下来说说实现的方法吧。

我用的是laravel5.1的框架,读取模板生成excel,并且插入图片,直接上代码

/*需要引用的扩展
use Excel;
use PHPExcel_IOFactory;
use PHPExcel;
use PHPExcel_Writer_Excel5;
use PHPExcel_Worksheet_Drawing;//这个是引入图表和图片的扩展
*/
$filename = "./whan.xls";  //模板名称
$objPHPExcel = PHPExcel_IOFactory::load($filename);
/*
$objPHPExcel->setActiveSheetIndex(0)->setCellValue('G7', "text");
*/
$objDrawing = new PHPExcel_Worksheet_Drawing;
$objDrawing->setPath( public_path($user['NamePic']) );
$objDrawing->setCoordinates('D53');
// 设置图片宽度高度
$objDrawing->setHeight(20);
$objDrawing->setWidth(80);
// 图片偏移距离
// $objDrawing->setOffsetX(200);
// $objDrawing->setRotation(100);
$objDrawing->setWorksheet($objPHPExcel->getActiveSheet());
$objPHPExcel->setActiveSheetIndex(0);
$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
$objWriter->save('./uploads/temp/newfilename.xls');

模板导出可以导出样式、图片、图表,但是不能导出用画图工具画出来的线跟图形,这个问题纠结了我好久,各大网站各大贴吧逛啊,最后还是我部长给我出的招,让我把线换成图片,这样就可以导出来了,生成的excel会有一点点走形,在可接受范围之内。

接下来说说excel转pdf这个坑,这个是真坑啊,好多说什么用dompdf、mpdf。最后我都把phpexcel换成PhpSpreadsheet这个了,总算是转换成功了,但是问题来了,中文乱码,样式大改变,果断先放弃,看看别的办法,实在不行再回来研究。试试之前看的com加openoffice吧,这个可以实现,最开始觉得麻烦没爱用,先上代码。

<?php
namespace App\Libs;class Office2pdf
{private $osm;public function __construct(){$this->osm = new \COM("com.sun.star.ServiceManager")or die ("Please be sure that OpenOffice.org is installed.n"); }public function MakePropertyValue($name,$value){$oStruct = $this->osm->Bridge_GetStruct("com.sun.star.beans.PropertyValue");$oStruct->Name = $name;$oStruct->Value = $value;return $oStruct;}public function transform($input_url, $output_url){$args = array($this->MakePropertyValue("Hidden",true));$oDesktop = $this->osm->createInstance("com.sun.star.frame.Desktop");$oWriterDoc = $oDesktop->loadComponentFromURL($input_url,"_blank", 0, $args);$export_args = array($this->MakePropertyValue("FilterName","writer_pdf_Export"));$oWriterDoc->storeToURL($output_url,$export_args);$oWriterDoc->close(true);return $this->getPdfPages($output_url);}public function run($input,$output){$input = "file:///" . str_replace("\\","/",$input);$output = "file:///" . str_replace("\\","/",$output);return $this->transform($input, $output);}/*** 获取PDF文件页数的函数获取* 文件应当对当前用户可读(linux下)* @param  [string] $path [文件路径]* @return int*/public function getPdfPages($path){if(!file_exists($path)) return 0;if(!is_readable($path)) return 0;// 打开文件$fp=@fopen($path,"r");if (!$fp) {return 0;}else {$max=0;while(!feof($fp)) {$line = fgets($fp,255);if (preg_match('/\/Count [0-9]+/', $line, $matches)){preg_match('/[0-9]+/',$matches[0], $matches2);if ($max<$matches2[0]) $max=$matches2[0];}}fclose($fp);// 返回页数return $max;}}}

这个方法是转发的,在这里谢过大神,想必都看到了,有命名空间,那就简单说一下laravel引用自己的类库方法吧,度娘都可以找到,在App下建一个文件夹Libs,然后把类库放进去,写好命名空间,然后在composer.json中……上代码

"autoload": {"files": ["app/Libs/Office2pdf.php"]}
/*这段是加入的,如果有files直接把你的类文件路径放进去就行
"files": ["app/Libs/Office2pdf.php"]
*/

然后在项目根目录下执行composer dump-autoload,然后在控制器中引用,new就行了

use app\Libs\Office2pdf;
$r = new Office2pdf;  //实例化后就可以用了

逻辑好像出现了一点问题,没有告诉你们安装openoffice,去下载一个安装上,然后需要设置一下,东西都写一起了,有点乱啊,接下来上配置,百度都有教程,我也记录下来吧,方便以后自己用

OpenOffice 安装完成之后,按 win+R 快捷键进入运行菜单,输入 Dcomcnfg 打开组件服务。

[组件服务] >> [计算机] >> [我的电脑] >> [DCOM配置] >> [OpenOffice Service Manager]

右键打开属性面板,选择安全选项卡,分别在 启动和激活权限 和 访问权限 上勾选自定义,添加 Everyone 的权限。权限全开

再选择标识选项卡,勾选 交互式用户,保存设置后退出。

安装完 OpenOffice 后,需要启动一次确认软件可以正常运行,然后再打开命令行运行以下命令:

切换到安装目录:  cd C:\Program Files\OpenOffice 4\program

后台运行该软件:  soffice -headless-accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard

PS:该命令只需要执行一次,就可以使软件一直在后台运行,即使重启服务器也不受影响。

接下来配置开启php扩展

如果是 PHP5.4 以前的版本,需要在 php.ini 里把 com.allow_dcom = true 打开(即去掉前面的分号)。

如果是 PHP5.4 之后的版本,则要在 php.ini 里增加一行扩展 extension = php_com_dotnet.dll 。

重启 Apache 或 IIS 服务器,打印 phpinfo() 信息,检查 com_dotnet 扩展是开启。

检查 php 的 ext 目录中 是否存在 com_dotnet.dll 文件,如果没有请自行下载对应版本的 dll。

然后用上面的类方法就可以实现excel转pdf了,这里还有一些需要注意的就是打印区域、打印大小、是否打印到一页,这个问题要在excel模板中定义好,转换的时候会读取excel中的源数据,这个问题也难了我好久,好像就没有不难的,如果你们厉害可以研究下有没有接口可以在openoffice中设置,如果有请把链接给我,嘿嘿

接下来说说laravel多文件压缩下载吧,我这个pdf生成之后是要下载下来的,会多选下载,之前我的想法是把路径返回给前台,然后用循环一个一个下载,这样文件要一个一个下,还可能出现什么内存啊什么的问题,反正能不能出现我不知道,毕竟我菜,但是如果是好几十个文件一起下载,那么来吧浏览器下边一排,密密麻麻的不知道看哪个,所以就想到压缩下载了,说了一堆废话……直接用laravel大扩展,上代码

使用composer引入 composer require chumper/zipper

配置app/config/app.php

Chumper\Zipper\ZipperServiceProvider::class

'Zipper' => Chumper\Zipper\Zipper::class 这两个去文件里找到对应的,放进去就可以了

然后找个方法测试一下

use Chumper\Zipper\Zipper; //头部引用//单个文件压缩
public function zipone(){$zipper=new Zipper();//方法里实例化,然后dd打印一下结果,看看有没有东西$filename = public_path('./whan.xls');//被压缩的文件名$filenames = public_path('./whan.zip');//压缩之后的文件名$arr = glob( $filename );   $zipper->make( $filenames )->add($arr)->close(); //这个地方有个坑,make方法会根据$filenames文件的存在与否而作出追加或是生成文件的动作
}//多个文件压缩
public function ziptwo(){$zipper=new Zipper();//方法里实例化,然后dd打印一下结果,看看有没有东西$array = array('./whan.xls','./whan1.xls','./whan2.xls','./whan3.xls');$filenames = public_path('./whan.zip');//压缩之后的文件名is_files($filenames)?unlink($filenames):'';$zipper->make( $filenames );foreach($array  as  $k => $v){$arr = glob( public_path($v) );$zipper->add( $arr );}$zipper->close(); //这样就ok了,记得每次要删除whan.zip文件哦,要不然就是往这个文件里边追加了
}//解压文件,这个没测试
public function zipthree(){$zipper=new Zipper();//方法里实例化,然后dd打印一下结果,看看有没有东西$array = array('./whan.xls','./whan1.xls','./whan2.xls','./whan3.xls');$filenames = public_path('./whan.zip');//压缩包的名$filename = public_path('./whan');//要解压到的文件夹Zipper::make( $filenames )->extractTo( $filename );//看好了啊,这次make的是压缩包
}//这个是流的,我在博客看到的
public function zipthree(){$zip = new \ZipArchive();$logFiles = Zipper::make($path)->listFiles('/\.png$/i');if ($zip->open($path) === TRUE) {foreach ($logFiles as $key) {$stream = $zip->getStream($key);$str = stream_get_contents($stream); //这里注意获取到的文本编码$name = iconv("utf-8", "gb2312//IGNORE", $key);file_put_contents(storage_path() . '\temp\\' . $name, $str);}} else {return 'message';}}

都准备发布了,想起来php自带的ZipArchive压缩扩展也不错

废话就这么多,希望多年以后看到本帖会有种感想,当时的自己真的是菜菜的

php excel模板导出、openoffice excel转pdf、多文件压缩下载相关推荐

  1. php excel模板导出

    最近两周都在弄关于excel模板导出.excel转pdf.多文件压缩下载.弄得头都大了,接下来说说实现的方法吧. 我用的是laravel5.1的框架,读取模板生成excel,并且插入图片,直接上代码 ...

  2. Excel模板导出之动态导出

    说明 目前Magicodes.IE已支持Excel模板导出时使用JObject.Dictionary和ExpandoObject来进行动态导出,具体使用请看本篇教程. 本功能的想法.部分实现初步源于a ...

  3. .Net NPOI 根据excel模板导出excel、直接生成excel

    一.根据Excel模板导出excel 1.导入NPOI.dll  2.DAL中添加类ExportExcel.cs using NPOI.SS.UserModel; using System; usin ...

  4. Excel模板导出之导出教材订购表

    说明 本教程主要说明如果使用Magicodes.IE.Excel完成教材订购表的Excel模板导出. 要点 本教程使用Magicodes.IE.Excel来完成Excel模板导出 需要通过创建Dto来 ...

  5. 6、jeecg 笔记之 自定义excel 模板导出(一)

    6.jeecg 笔记之 自定义excel 模板导出(一) 1.前言 jeecg 中已经自带 excel 的导出导出功能,其所使用的是 easypoi,尽管所导出的 excel 能满足大部分需求, 但总 ...

  6. 基于SpringMVC+EasyPoi,采用Excel模板方式实现Excel在线预览和导出(2021版)

    一.背景:某工厂需要查看指定年度的设备维护计划,一般需要把全年72个周,每个周做哪些维护工作排班排出以及工时统计出来,在正式生成维护工单之前,需要先确认下.维护计划大概是某一周要执行哪些维护项,大概长 ...

  7. 基于Excel模板导出——ExcelTemplate

    什么是ExcelTemplate ExcelTemplate项目是一个基于Excel模板,依靠配置文件描述导出过程的Excel导出工具. 它提供了大量适用于各种场景的常用配置(导出规则),同时提供一些 ...

  8. 使用EasyPoi利用excel模板导出excel表格下载

    前言:使用excel模板导出excel的好处在于可以事先在模板上定义颜色.格式等,适用于模板设计得比较灵活复杂的场景 一.添加jar包 <dependency><groupId> ...

  9. springboot+poi开发excel导出 加载Excel模板导出 Excel批量导出详解

    提到Excel导出功能,可能很多人都使用springmvc框架做过,笔者今天要给大家分享的是基于springBoot开发Excel复杂模板导出功能(所谓复杂模板指在模板里的特定表头里有不同的单元格合并 ...

最新文章

  1. mysql自增变量插入行时需要赋值
  2. PMCAFF微课堂|前codefollow运营女神:深剖女性社群电商的心理需求和特征
  3. 计算机开机显示器无显示桌面,电脑开机后显示器不亮故障排除方法
  4. C#调用存储过程的通用类
  5. 怎么才能成为一名PHP专家?
  6. 《Arduino奇妙之旅:智能车趣味制作天龙八步》一第2章
  7. 类型转换操作符(C++)
  8. 在线教育开源 java_新款SpringBoot在线教育平台开源了
  9. a4b5笔记本大小对比_2L大小的迷你电脑上班拎着走
  10. EXCEL常用函数总结
  11. 抽奖h5小游戏还能这么玩?h5抽奖游戏种类详解
  12. 程序员也要学英语——名词和代词
  13. 如何用cocos2d-x来开发简单的Uphone游戏:(三) 射击子弹 碰撞检测
  14. Conflux TokenGazer AMA活动内容回顾
  15. 小白装openstack(二) 安装NTP服务
  16. Lenovo 使用BoMC工具制作微码升级U盘刷新System x
  17. [论文笔记] 视频广告内容结构的多模态表示学习
  18. 苹果手机有4g信号但是微信未连接服务器,苹果5s有显示4g网络但无上微信 是不是那里设置了 今天才出现的...
  19. 视频编码h264怎么看_你所要知道的音视频--04
  20. 美国计算机游戏设计专业排名,美国游戏设计专业大学排名TOP5推荐!

热门文章

  1. 这才叫酷!戴上这些装备喝酒你就是酒仙了(组图)
  2. 记英语单词的有效方法就那么几个,别整一些花里胡哨的
  3. 李敖之子李戡:《严正声明─我对韩…
  4. 易燃易爆炸。你根本不爱我。
  5. swak4foam的安装(v7测试有效)
  6. r语言remarkdown展示图_为什么Markdown R有较大概率成为科技写作主流? ← 阳志平的个人网站::技术...
  7. 台式计算机怎么截屏,台式电脑,怎么截图全屏?
  8. gpu-z怎么用,显卡怎么看体质
  9. 股民学堂:短线炒股绝招 值得一学
  10. @EnableConfigurationProperties 注解