2014-01-14 16:52:03  浏览:1360

cakephp word

在网上找了很多php生成word的代码,感觉都不适合cakephp,所以参照了一下CakeEmail,照着写了一个根据模板,生成word文档。

首先创建一个conponent,方便其他controller调用

地址:appControllerComponentToolsComponent.php


<?php
App::uses ( 'Component', 'Controller' );
class ToolsComponent extends Component {
	protected $_viewVars = array ();
	protected $_helpers = array ();
	var $charset = "utf-8";
	
	public function __construct(ComponentCollection $collection, $settings = array()) {
		parent::__construct ( $collection, $settings );
	}
	/**
	 * 根据模板生成world文档
	 */
	public function makeWordByTemplate($data = array(), $template = "students") {
		$View = new View ();
		// $layout = "default";
		$layout = null;
		$this->_viewVars = array (
				"title_for_layout" => "学生管理" 
		);
		if (! empty ( $data )) {
			$this->_viewVars = array_merge ( $this->_viewVars, $data );
		}
		$View->viewVars = $this->_viewVars;
		$View->helpers = $this->_helpers;
		$View->hasRendered = false;
		$View->viewPath = $View->layoutPath = 'Tools';
		
		$render = $View->render ( $template, $layout );
		$render = str_replace ( array (
				"
",
				"
" 
		), "
", $render );
		return $render;
	}
}

创建工具类的默认布局文件appViewLayoutsToolsdefault.ctp

内容:


<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml"
xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title><?php echo $title_for_layout;?></title>
<style>
@font-face {
font-family:"Times New Roman";
}
@font-face {
font-family:"&#23435;&#20307;";
}
@font-face {
font-family:"Arial";
}
table{border-collapse:collapse;border-color:#000;}
td{ border-color:#000; padding:10px 5px; vertical-align:middle;}
h1{ text-align:center}
.f_ri{ text-align:right;}
table {
width: 100%;
background-color: transparent;
border-collapse: collapse;
border-spacing: 0;
}
</style>
<!--[if gte mso 9]><xml><w:WordDocument><w:View>Print</w:View><w:TrackMoves>false</w:TrackMoves><w:TrackFormatting/><w:ValidateAgainstSchemas/><w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid><w:IgnoreMixedContent>false</w:IgnoreMixedContent><w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText><w:DoNotPromoteQF/><w:LidThemeOther>EN-US</w:LidThemeOther><w:LidThemeAsian>ZH-CN</w:LidThemeAsian><w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript><w:Compatibility><w:BreakWrappedTables/><w:SnapToGridInCell/><w:WrapTextWithPunct/><w:UseAsianBreakRules/><w:DontGrowAutofit/><w:SplitPgBreakAndParaMark/><w:DontVertAlignCellWithSp/><w:DontBreakConstrainedForcedTables/><w:DontVertAlignInTxbx/><w:Word11KerningPairs/><w:CachedColBalance/><w:UseFELayout/></w:Compatibility><w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel><m:mathPr><m:mathFont m:val="Cambria Math"/><m:brkBin m:val="before"/><m:brkBinSub m:val="--"/><m:smallFrac m:val="off"/><m:dispDef/><m:lMargin m:val="0"/> <m:rMargin m:val="0"/><m:defJc m:val="centerGroup"/><m:wrapIndent m:val="1440"/><m:intLim m:val="subSup"/><m:naryLim m:val="undOvr"/></m:mathPr></w:WordDocument></xml><![endif]-->
</head>
<body>
<?php echo $content_for_layout;?>
</body>
</html>
再创建模板文件,appViewToolsstudents.ctp


内容:


<table  border="1" cellpadding="0" cellspacing="0" >
	<tr> <th>姓名</th>
		<th>学号</th> <th>密码</th>
	</tr>
	<?php if(!empty($students)){foreach($students as $k=>$v){?>
	<tr>
		<td><?php echo $v["username"]?></td>
		<td><?php echo $v["userId"]?></td>
		<td><?php echo $v["pwd"]?></td>
	</tr>
	<?php }}?>
</table>


在controller中,引入这个文件

var $components = array ("Tools");

创建一个action,专门用来生成并下载这个文件


public function download() {
		$id = ! empty ( $_REQUEST ["cid"] ) ? intval ( $_REQUEST ["cid"] ) : 0;
		// 查询学生列表
		$student = $this->getStudentById ( $id );
		
		$data = array ( "students" => $student 
		);
		$word = $this->Tools->makeWordByTemplate ( $data, "students" );//传入数据和模板名称
		// 保存到文件
		$student_file_path_prev = TMP . "cache" .  DS;
		$sf_name = time() . "_file" . ".doc";
		$sf_name2 =  "下载测试文件.doc";
		$student_file_path = $student_file_path_prev . $sf_name;
		$fp = fopen ( $student_file_path, 'w' ); // 打开生成的文档
		fwrite ( $fp, $word ); // 写入包保存文件
		fclose ( $fp );
		$params = array (
				'id' => $sf_name,
				'name' => $sf_name2,
				'download' => true,
				'path' => $student_file_path_prev 
		);//下载参数
		$this->viewClass = 'Media';
		$this->set ( $params );
	}


现在访问:localhost/download 会下载一个“下载测试文件.doc”,同时在缓存目录下,生成一个时间戳的doc文件

返回首页