php excel模板导出、openoffice excel转pdf、多文件压缩下载
最近两周都在弄关于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、多文件压缩下载相关推荐
- php excel模板导出
最近两周都在弄关于excel模板导出.excel转pdf.多文件压缩下载.弄得头都大了,接下来说说实现的方法吧. 我用的是laravel5.1的框架,读取模板生成excel,并且插入图片,直接上代码 ...
- Excel模板导出之动态导出
说明 目前Magicodes.IE已支持Excel模板导出时使用JObject.Dictionary和ExpandoObject来进行动态导出,具体使用请看本篇教程. 本功能的想法.部分实现初步源于a ...
- .Net NPOI 根据excel模板导出excel、直接生成excel
一.根据Excel模板导出excel 1.导入NPOI.dll 2.DAL中添加类ExportExcel.cs using NPOI.SS.UserModel; using System; usin ...
- Excel模板导出之导出教材订购表
说明 本教程主要说明如果使用Magicodes.IE.Excel完成教材订购表的Excel模板导出. 要点 本教程使用Magicodes.IE.Excel来完成Excel模板导出 需要通过创建Dto来 ...
- 6、jeecg 笔记之 自定义excel 模板导出(一)
6.jeecg 笔记之 自定义excel 模板导出(一) 1.前言 jeecg 中已经自带 excel 的导出导出功能,其所使用的是 easypoi,尽管所导出的 excel 能满足大部分需求, 但总 ...
- 基于SpringMVC+EasyPoi,采用Excel模板方式实现Excel在线预览和导出(2021版)
一.背景:某工厂需要查看指定年度的设备维护计划,一般需要把全年72个周,每个周做哪些维护工作排班排出以及工时统计出来,在正式生成维护工单之前,需要先确认下.维护计划大概是某一周要执行哪些维护项,大概长 ...
- 基于Excel模板导出——ExcelTemplate
什么是ExcelTemplate ExcelTemplate项目是一个基于Excel模板,依靠配置文件描述导出过程的Excel导出工具. 它提供了大量适用于各种场景的常用配置(导出规则),同时提供一些 ...
- 使用EasyPoi利用excel模板导出excel表格下载
前言:使用excel模板导出excel的好处在于可以事先在模板上定义颜色.格式等,适用于模板设计得比较灵活复杂的场景 一.添加jar包 <dependency><groupId> ...
- springboot+poi开发excel导出 加载Excel模板导出 Excel批量导出详解
提到Excel导出功能,可能很多人都使用springmvc框架做过,笔者今天要给大家分享的是基于springBoot开发Excel复杂模板导出功能(所谓复杂模板指在模板里的特定表头里有不同的单元格合并 ...
最新文章
- mysql自增变量插入行时需要赋值
- PMCAFF微课堂|前codefollow运营女神:深剖女性社群电商的心理需求和特征
- 计算机开机显示器无显示桌面,电脑开机后显示器不亮故障排除方法
- C#调用存储过程的通用类
- 怎么才能成为一名PHP专家?
- 《Arduino奇妙之旅:智能车趣味制作天龙八步》一第2章
- 类型转换操作符(C++)
- 在线教育开源 java_新款SpringBoot在线教育平台开源了
- a4b5笔记本大小对比_2L大小的迷你电脑上班拎着走
- EXCEL常用函数总结
- 抽奖h5小游戏还能这么玩?h5抽奖游戏种类详解
- 程序员也要学英语——名词和代词
- 如何用cocos2d-x来开发简单的Uphone游戏:(三) 射击子弹 碰撞检测
- Conflux TokenGazer AMA活动内容回顾
- 小白装openstack(二) 安装NTP服务
- Lenovo 使用BoMC工具制作微码升级U盘刷新System x
- [论文笔记] 视频广告内容结构的多模态表示学习
- 苹果手机有4g信号但是微信未连接服务器,苹果5s有显示4g网络但无上微信 是不是那里设置了 今天才出现的...
- 视频编码h264怎么看_你所要知道的音视频--04
- 美国计算机游戏设计专业排名,美国游戏设计专业大学排名TOP5推荐!
热门文章
- 这才叫酷!戴上这些装备喝酒你就是酒仙了(组图)
- 记英语单词的有效方法就那么几个,别整一些花里胡哨的
- 李敖之子李戡:《严正声明─我对韩…
- 易燃易爆炸。你根本不爱我。
- swak4foam的安装(v7测试有效)
- r语言remarkdown展示图_为什么Markdown R有较大概率成为科技写作主流? ← 阳志平的个人网站::技术...
- 台式计算机怎么截屏,台式电脑,怎么截图全屏?
- gpu-z怎么用,显卡怎么看体质
- 股民学堂:短线炒股绝招 值得一学
- @EnableConfigurationProperties 注解