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、多文件压缩下载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: day12摇色子游戏--笔记
- 下一篇: 手把手教你进行Python网络爬虫中的C