使用缓冲区把html转成word文档并支持下载

194 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

在开发项目中,遇到的需求:把后台录入的数据保存成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版式打开。

image.png

调用封装的函数即可。

文件信息如下图所示:

image.png

生成的word文件内容如下图所示:

image.png

注意:html样式自己调整即可。

完美!




END


如有问题请在下方留言。

或关注我的公众号“孙三苗”(sunsanmiao),输入“联系方式”。获得进一步帮助。