php excel转pdf

接下来说说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中设置,如果有请把链接给我,嘿嘿

已标记关键词 清除标记
相关推荐
<div class="post-text" itemprop="text"> <p>This code works fine on localhost but on live server it shows</p> <blockquote> <p>File Not Found</p> </blockquote> <p>Check the file name for capitalization or other typing errors. Check to see if the file was moved, renamed or deleted.</p> <p>Here is my code </p> <p><strong>excel.php</strong></p> <pre><code><?php error_reporting(1); ini_set('display_errors', 0); ini_set('display_startup_errors', TRUE); $target = 'Myfile.xlsx'; include 'phpexcel/Classes/PHPExcel/IOFactory.php'; $inputFileType = PHPExcel_IOFactory::identify($target); function datefix_excel($excel) { $dif=(41885-$excel)*86400; $seconds=1409737670-$dif; $date=date("d/m/Y",$seconds); return $date; } //echo 'File ',pathinfo($inputFileName,PATHINFO_BASENAME),' has been identified as an ',$inputFileType,' file<br />'; //echo 'Loading file ',pathinfo($inputFileName,PATHINFO_BASENAME),' using IOFactory with the identified reader type<br />'; $objReader = PHPExcel_IOFactory::createReader($inputFileType); $objPHPExcel = $objReader->load($target); $i = 0; $found = false; try { // foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) { // //$objWorksheet = $objPHPExcel->getActiveSheet(); //now do whatever you want with the active sheet $worksheet->setShowGridLines(false); $worksheet->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::PAPERSIZE_A2_PAPER ); $worksheet->getPageSetup()->setPaperSize(PHPExcel_Worksheet_PageSetup::PAPERSIZE_A2_PAPER ); $worksheet->getPageSetup()->setFitToPage(true); $worksheet->getPageSetup()->setFitToWidth(1); $worksheet->getPageSetup()->setFitToHeight(0); $worksheet->getPageSetup()->setScale(40); $worksheet->getStyle('F1:F4')->getAlignment()->setWrapText(false); $worksheet->getStyle('D6:D8')->getAlignment()->setWrapText(false); $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true); $count = 0; $found == false; // $worksheetTitle = $worksheet->getTitle(); $highestRow = $worksheet->getHighestRow(); // e.g. 10 $highestColumn = $worksheet->getHighestColumn(); // e.g 'F' $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); $nrColumns = ord($highestColumn) - 64; for ($row = 1; $row <= $highestRow; ++ $row) { for ($col = 0; $col < $highestColumnIndex; ++ $col) { $cell = $worksheet->getCellByColumnAndRow($col, $row); $val = $cell->getValue(); if($val==$_REQUEST['roll']) { //echo "Roll Number found: ".$_REQUEST['roll']." <br/>"; $found = true; // $objPHPExcel->getActiveSheet()->setCellValue('C23',$val); $objPHPExcel->getActiveSheet()->setCellValue('C23',datefix_excel($objPHPExcel->getActiveSheet()->getCell('C23')->getValue())); $rendererName = PHPExcel_Settings::PDF_RENDERER_DOMPDF; $rendererLibrary = 'dompdf'; $rendererLibraryPath = './' . $rendererLibrary; //require_once (realpath(dirname(dirname(dirname(__FILE__))))."/libraries/pdf.php"); //echo $rendererName.' and '.$rendererLibraryPath; if (!PHPExcel_Settings::setPdfRenderer($rendererName,$rendererLibraryPath)) { die('NOTICE: Please set the $rendererName and $rendererLibraryPath values' .EOL .'at the top of this script as appropriate for your directory structure'); } header("HTTP/1.1 200 OK"); header("Pragma: public"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Cache-Control: private", false); header('Content-Type: application/pdf'); header('Content-Disposition: attachment;filename="rename.pdf"'); //tell browser what's the file name header('Cache-Control: max-age=0'); //no cache $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'PDF'); $objWriter->setSheetIndex($i); //$objWriter->save('test.pdf'); $objWriter->save('php://output'); break; } else{ continue; } } } // } } catch(Exception $e) { //echo $e; } ?> </code></pre> </div>
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页