不能听命于自己者,就要受命于他人。网站首页学海无涯

利用PHPWORD类替换word模版文字,图片等

陈佚2018-12-13 22:51:292人围观暂无分类
简介今天有个需求是生成销售合同,其中有一些客户信息,还有销售产品的表格图片信息等。替换图片文字之前都做过,有些经验,创建表格也弄过,就是替换表格真是让我一头雾水。

还是先把相关文件分享给你们 PHPWORD类

链接:https://pan.baidu.com/s/1d0bmve6xMrHN-GA2z5Wmbg 密码:tmy2

image.png

里面是word包和一些测试文件


1.第一步引入文件autoload.php,这是这个包的自动加载文件,所以引入这个就行了

这是个老项目用的是TP3.1的框架,所以我是用vendor引入的

vendor("ReplaceWord.autoload");


2.第二步创建模版文件,首先我来创建一个测试使用的word模版文件 

image.png

$templateProcessor = new \PhpOffice\PhpWord\TemplateProcessor('public/word/Template.docx');
$templateProcessor->setValue('Name', 'PHP54技术博客');
$templateProcessor->setImg('Image',['src' => 'public/img/logo.png']);
$templateProcessor->saveAs('public/word/Template1.docx');

首先是实例化word类  参数就是模版文件的地址

setValue是将用与替换文字文字  setValue('Name', 'PHP54技术博客');是将word文档中的 ${Name}替换为PHP54技术博客

setImg是用与替换图片的setImg('Image',['src' => 'public/img/logo.png']); 是将word文档中的${Image}替换为站点中的图片public/img/logo.png

image.png


其实比较简单但是好像并没有替换成表格的功能,真的头疼。

但是还是想到一个办法就是生成一个表格图片然后用替换图片的形式,将表格放到word中,听起来就比较复杂,但是客户要求没办法。

function create_table(){
    $data = array();//生成演示数据
    for($i = 0;$i < 10; $i++){
        $data[] = [
            'nice_name' => '测试名' . $i,
            'zhuang' => 100,
            'xian' => 50,
            'he' => 50,
            'zhuang_dui' => 500,
            'xian_dui' => 5000,
        ];
    }
    $params = [
        'row' => 11,//数据的行数
        'file_name' => '1.png',
        'title' => '数据表',
        'table_time' => '2018-4-29 22:50:43',
        'data' => $data
    ];
    $base = [
        'border' => 10,//图片外边框
        'file_path' => 'img/',//图片保存路径
        'title_height' => 30,//报表名称高度
        'title_font_size' => 16,//报表名称字体大小
        'font_ulr' => 'img/simsun.ttc',//字体文件路径
        'text_size' => 12,//正文字体大小
        'row_hight' => 30,//每行数据行高
        'filed_id_width' => 60,//序号列的宽度
        'filed_name_width' => 120,//玩家名称的宽度
        'filed_data_width' => 100,//数据列的宽度
        'table_header' => ['序号','昵称','数据1','数据2','数据3','数据4','数据5'],//表头文字
        'column_text_offset_arr' => [45,90,55,55,55,65,65],//表头文字左偏移量
        'row_text_offset_arr' => [50,110,90,90,90,90,90],//数据列文字左偏移量
    ];
    $base['img_width'] = $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 5 + $base['border'] * 2;//图片宽度
    $base['img_height'] = $params['row'] * $base['row_hight'] + $base['border'] * 2 + $base['title_height'];//图片高度
    $border_top = $base['border'] + $base['title_height'];//表格顶部高度
    $border_bottom = $base['img_height'] - $base['border'];//表格底部高度
    $base['column_x_arr'] = [
        $base['border'] + $base['filed_id_width'],//第一列边框线x轴像素
        $base['border'] + $base['filed_id_width'] + $base['filed_name_width'],//第二列边框线x轴像素
        $base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 1,//第三列边框线x轴像素
        $base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 2,//第四列边框线x轴像素
        $base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 3,//第五列边框线x轴像素
        $base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 4,//第五列边框线x轴像素
        $base['border'] + $base['filed_id_width'] + $base['filed_name_width'] + $base['filed_data_width'] * 5,//第五列边框线x轴像素
    ];
    $img = imagecreatetruecolor($base['img_width'], $base['img_height']);//创建指定尺寸图片
    $bg_color = imagecolorallocate($img, 255, 255, 255);//设定图片背景色
    $text_coler = imagecolorallocate($img, 0, 0, 0);//设定文字颜色
    $border_coler = imagecolorallocate($img, 0, 0, 0);//设定边框颜色
    $white_coler = imagecolorallocate($img, 255, 255, 255);//设定边框颜色
    imagefill($img, 0, 0, $bg_color);//填充图片背景色
    //先填充一个黑色的大块背景
    imagefilledrectangle($img, $base['border'], $base['border'] + $base['title_height'], $base['img_width'] - $base['border'], $base['img_height'] - $base['border'], $border_coler);//画矩形
    //再填充一个小两个像素的 背景色区域,形成一个两个像素的外边框
    imagefilledrectangle($img, $base['border'] + 2, $base['border'] + $base['title_height'] + 2, $base['img_width'] - $base['border'] - 2, $base['img_height'] - $base['border'] - 2, $bg_color);//画矩形
    //画表格纵线 及 写入表头文字
    foreach($base['column_x_arr'] as $key => $x){
        imageline($img, $x, $border_top, $x, $border_bottom,$border_coler);//画纵线
        imagettftext($img, $base['text_size'], 0, $x - $base['column_text_offset_arr'][$key] + 1, $border_top + $base['row_hight'] - 8, $text_coler, $base['font_ulr'], $base['table_header'][$key]);//写入表头文字
    }
    //画表格横线
    foreach($params['data'] as $key => $item){
        $border_top += $base['row_hight'];
        imageline($img, $base['border'], $border_top, $base['img_width'] - $base['border'], $border_top, $border_coler);
        imagettftext($img, $base['text_size'], 0, $base['column_x_arr'][0] - $base['row_text_offset_arr'][0], $border_top + $base['row_hight'] - 10, $text_coler, $base['font_ulr'], $key + 1);//写入序号
        $sub = 0;
        foreach ($item as $value){
            $sub++;
            imagettftext($img, $base['text_size'], 0, $base['column_x_arr'][$sub] - $base['row_text_offset_arr'][$sub], $border_top + $base['row_hight'] - 10, $text_coler, $base['font_ulr'], $value);//写入data数据
        }
    }
    //计算标题写入起始位置
    $title_fout_box = imagettfbbox($base['title_font_size'], 0, $base['font_ulr'], $params['title']);//imagettfbbox() 返回一个含有 8 个单元的数组表示了文本外框的四个角:
    $title_fout_width = $title_fout_box[2] - $title_fout_box[0];//右下角 X 位置 - 左下角 X 位置 为文字宽度
    $title_fout_height = $title_fout_box[1] - $title_fout_box[7];//左下角 Y 位置- 左上角 Y 位置 为文字高度
    //居中写入标题
    imagettftext($img, $base['title_font_size'], 0, ($base['img_width'] - $title_fout_width)/2, $base['title_height'], $text_coler, $base['font_ulr'], $params['title']);
    //写入制表时间
    imagettftext($img, $base['text_size'], 0, $base['border'], $base['title_height'], $text_coler, $base['font_ulr'], '时间:' . $params['table_time']);
    $save_path = $base['file_path'] . $params['file_name'];
    if(!is_dir($base['file_path'])){
        mkdir($base['file_path'],0777,true);//可创建多级目录
    }
    imagepng($img,$save_path);//输出图片,输出png使用imagepng方法,输出gif使用imagegif方法
    echo '<img src="/'.$save_path.'"/>';
}
create_table();

image.png

要注意的是生成表格使用了字体资源

这样就勉强实现了客户的需求,糟心

image.png

文章评论

    共有0条评论来说两句吧...