MDWORD使用心得与总结

173 阅读1分钟

使用背景

之前客户要导出签证的word信息用来做签证使用,当时就使用了MDWORd,最近客户又要导出退款确认单,毫不犹豫 又掏出了MDWORD 不得不说对于需要母版的WORD生成操作来说已经很简单了

母版

image.png

在图中可以看出,使用了WORD批注的功能,将需要修改的地方都进行了批注,之后在代码中我们会使用批注作为变量 也就是key值来对母版进行赋值.

实操

安装MDWORD

composer require mkdreams/mdword

代码

/**
 * @param $templateFile 模版文件source
 * @param $saveFile  保存文件source
 * @param $data  数据源
 * 以MDWord为基础,导出Word
 */
static function createAttachmentWordOne($saveFile,$data){
    //new出一个新对象
    $TemplateProcessor = new WordProcessor();
    // 母版文件地址(要注意的是这里文件必须可读取,要注意文件权限)
    $template = './uploads/attachment1.docx';
    // 加载模板文件
    $TemplateProcessor->load($template);
    // 这里clones 的作用是将item批注的内容复制count($data)份
    $TemplateProcessor->clones('item' ,count($data));
    // 标记位置
    $flag = -1;
    //循环数据
    foreach ($data as $key => $value){
        $flag++;
        //与item同理 
        $TemplateProcessor->clones('content#' . $flag,count($value));
        // 设置country批注的值,要注意的是clones之后要选中具体某个country 格式为: 变量名# + 下标
        $TemplateProcessor->setValue("country#" . $flag,$value[0]['nationality']);
        $TemplateProcessor->setValue("number#" . $flag,count($value));
        foreach ($value as $k => $v){
        // 由于name被clones两次,所以这里有两层# 第一层指的是第一次复制的位置,第二个#同理,如果还有多层,则依次类推
            $TemplateProcessor->setValue("name#" . $flag . '#' . $k,$v['family_name_en'] .' ' . $v['name_en']);
            $TemplateProcessor->setValue("idNumber#" . $flag . '#'  . $k,$v['id_number']);
            $TemplateProcessor->setValue("company#" . $flag . '#'  . $k,$v['company_name_en']);
            $TemplateProcessor->setValue("postion#" . $flag . '#'  . $k,$v['postion_en']);
        }
    }
    //保存生成好的文件
    $TemplateProcessor->saveAs('./uploads/' . $saveFile);
}

项目背景为tp5.0+php7.0.

其他案例可参考码云