本文已参与「新人创作礼」活动,一起开启掘金创作之路。
在开发项目中,遇到的需求:把后台录入的数据保存成word文档,以便其他人员使用。
上一篇介绍的是用
PHPWord把html转成word文档并支持下载,在寻求方法的时候,发现除了使用PHPWord还可以使用缓存区来处理,也是本篇所介绍的方法。
一、 缓存区函数
PHP官方函数地址:www.php.net/manual/zh/r…
- flush — 刷新输出缓冲
- ob_clean — 清空(擦掉)输出缓冲区
- ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲
- ob_end_flush — 冲刷出(送出)输出缓冲区内容并关闭缓冲
- ob_flush — 冲刷出(送出)输出缓冲区中的内容
- ob_get_clean — 得到当前缓冲区的内容并删除当前输出缓。
- ob_get_contents — 返回输出缓冲区的内容
- ob_get_flush — 刷出(送出)缓冲区内容,以字符串形式返回内容,并关闭输出缓冲区。
- ob_get_length — 返回输出缓冲区内容的长度
- ob_get_level — 返回输出缓冲机制的嵌套级别
- ob_get_status — 得到所有输出缓冲区的状态
- ob_gzhandler — 在ob_start中使用的用来压缩输出缓冲区中内容的回调函数。ob_start callback function to gzip output buffer
- ob_implicit_flush — 打开/关闭绝对刷送
- ob_list_handlers — 列出所有使用中的输出处理程序。
- ob_start — 打开输出控制缓冲
- output_add_rewrite_var — 添加URL重写器的值(Add URL rewriter values)
- output_reset_rewrite_vars — 重设URL重写器的值(Reset URL rewriter values)
相关函数使用顺序,仅供参考:
ob_start();
// 内容
……
ob_end_flush();
ob_flush();//每次执行前刷新缓存
flush();
二、封装方法
/**
* Function getDownLoadWordFile
* 获取下载文档 【使用 缓冲区】 第二种 方法
* @access public
* @param int $ds_id 疾病id
* @param int $save_type 保存类型 0 不保存仅下载 1 只保存 ;2 即保存又下载 默认 0
* @param string $need_file_dir 文件路径;
* @return null
* @throws
* @author sunct
* @time 2022/5/12 上午10:06
* @since 1.0
*/
public function getDownLoadWordFile($ds_id=0,$save_type=0,$need_file_dir=''){
if(!in_array($save_type,[0,1,2])){
return ;
}
// html 内容
// $wordData = $this->getHtmlInfo();
$wordData = "<div style='margin-bottom: 20px;text-align: center;font-size:24px;font-weight: bold;font-family:微软雅黑, Microsoft YaHei, SimHei,Helvetica,sans-serif;'>测试使用缓冲区把html转成word文档并支持下载</div> <div style='max-width:300px; text-align: left;'><img width='260' src='https://自己的图片地址/FCA0B454DCE0665230E7EBAEA57CFEC6.jpg'/></div>";
//打开缓冲区
$this->getDownLoadWordStart($wordData);
// 文件路径
if(!$need_file_dir) {
$need_file_dir = self::$file_dir . '测试';
}
if (!is_dir($need_file_dir)) {
mkdir($need_file_dir, 0777, true);
chmod($need_file_dir,0777);
}
// 文件名字
$file_name = "测试_".date("Y年m月d日H时i分s秒").".docx";
// 保存
if($save_type != 0 ){
$data = ob_get_contents();
ob_end_clean();
$this->writeFile ($need_file_dir.'/'.$file_name,$data);
}
// 下载
if($save_type != 1 ){
header("Cache-Control: public");
Header("Content-type: application/octet-stream");
Header("Accept-Ranges: bytes");
//判断浏览器类型
if (strpos($_SERVER["HTTP_USER_AGENT"],'MSIE')) {
header('Content-Disposition: attachment; filename='.$file_name);
}else if (strpos($_SERVER["HTTP_USER_AGENT"],'Firefox')) {
Header('Content-Disposition: attachment; filename='.$file_name);
} else {
header('Content-Disposition: attachment; filename='.$file_name);
}
//不使用缓存
header("Pragma:no-cache");
//过期时间
header("Expires:0");
//输出全部内容到浏览器
ob_end_flush();
}
ob_flush();//每次执行前刷新缓存
flush();
}
其中 getDownLoadWordStart 如下:
/**
* Function getDownLoadWordStart
* 打开缓冲区并输出内容
* @access public
* @param string $wordData 内容
* @return null
* @throws Exception
* @author sunct
* @time 2022/5/12 上午10:06
* @since 1.0
*/
public function getDownLoadWordStart($wordData=''){
//打开缓冲区
ob_start();
echo "<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'>";
echo "<head><!--[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>";
echo $wordData;
echo "</html>";
}
说明:如果不设置
<html>和<head>,生成的word文档将会默认以Web版式打开。
调用封装的函数即可。
文件信息如下图所示:
生成的word文件内容如下图所示:
注意:html样式自己调整即可。
完美!
END
如有问题请在下方留言。
或关注我的公众号“孙三苗”(sunsanmiao),输入“联系方式”。获得进一步帮助。