php完美导出word,PHP使用phpword生成word文档

使用phpword生成文档有两种方式直接使用代码编写word文档,用代码生成word,但是设置样式,格式,图片非常麻烦,不建议使用。如果客户或产品提供一份word的样式,我们也难以完全复原,调样式很头疼的。

读取原有word模板,替换相关变量。个人感觉这种方式能满足绝大部分需求,实现起来也比较简单,所有的样式,格式直接在word模板里设置好,替换变量就可以了,还可以很方便的切换模板。本文主要介绍这种方式,毕竟我们是为了快速实现客户的需求,让客户提供一份word模板,我们稍微一改就可以了。

开始干活

1,通过composer安装phpword包composer require phpoffice/phpword

2,准备一个word模板(让客户或产品提供吧,docx格式的)

808523552035bbe53cbbc2aa19c8d0f1.png$tpl = 'template/word/display_agreement.docx';

$doc = new TemplateProcessor($tpl);//打开模板

// 简单替换

$doc->setValue('dealer_name', $oneCust->dealer->dealer_name, 2);//替换变量 第二个参数替换次数

$doc->setValue('cust_name', $oneCust->customer->cust_name);//替换变量cust_name

$doc->setValue('start_time', $arrOneCust['start_time_text']);

$doc->setValue('end_time', $arrOneCust['end_time_text']);

$doc->setValue('show_day', $arrOneCust['show_day']);

$doc->setValue('signing_date', date('Y年m月d日', $arrOneCust['create_at']));

// 陈列要求

// 循环替换

$arr = [

['goods_name'=>'苹果手机8','specs'=>'128G','number'=>'2台'],

['goods_name'=>'苹果手机11','specs'=>'128G','number'=>'2台'],

['goods_name'=>'苹果手机12','specs'=>'128G','number'=>'2台'],

]

if (!empty($arr)) {

$j = 1;

$rows = count($arr);

$doc->cloneRow('customergoods_name', $rows);//复制行

foreach ($arr as $oneGoods) {

$dTmp = $oneGoods->toArray();

$doc->setValue("customergoods_name#" . $j, "产品名称:{$oneGoods['goods_name']}");//替换变量

$doc->setValue("customergoods_spce#" . $j, "产品规格:{$oneGoods['specs']}");//替换变量

$doc->setValue("customergoods_num#" . $j, "数量:{$oneGoods['number']}");//替换变量

$j++;

}

}

有时我们需要有“陈列奖励”数据时就显示没有时就不显示,此里需要用到块标签了与html类似

7bebfe8d27f9e6969317201212e2da7c.png// 陈列奖励

// 循环替换

$arr = [

['goods_name'=>'苹果手机8','time'=>'1606011063','number'=>'2台'],

['goods_name'=>'苹果手机11','time'=>'1606011063','number'=>'2台'],

['goods_name'=>'苹果手机12','time'=>'1606011063','number'=>'2台'],

]

$doc->cloneBlock('WIN_BLOCK',0);

if (!empty($arr)) {

//显示块

$doc->cloneBlock('WIN_BLOCK',1);

$j = 1;

$rows = count($arr);

$doc->cloneRow('customergoods_name', $rows);//复制行

foreach ($onePhase->customerGoodList as $oneGoods) {

$doc->setValue("phase_date#" . $j, date('Y-m-d', $onePhase['time']));//替换变量

$doc->setValue("phase_type#" . $j, '兑付');//替换变量

$doc->setValue("phase_goods#" . $j, $oneGoods['goods_name']);//替换变量

$doc->setValue("phase_num#" . $j, "数量:{$oneGoods['number']}");//替换变量

$j++;

}

}

替换图片// 只渲染

$tmp->setImageValue('header',['path'=>'1.jpeg']);

// 设置图片宽高

$tmp->setImageValue('header', ['path' => '1.jpg','width'=>500,'height'=>500]);

// 设置多次替换

$tmp->setImageValue('header', ['path' => '1.jpg','width'=>500,'height'=>500],3);

一些常用的word符号

换行符

分页符

制表符

html预留字符要替换为实体字符,如&要替换为&,可以使用htmlspecialchars()

使用方式

比如我们数据库存的换行符一般是 \n\r 这个在word中是无效的,要替换为
才行$content = str_replace("\r\n", '
', $content);

$doc->setValue('content', $content); //内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/562295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《springcloud超级入门》Spring Cloud开发环境的准备和Lombok安装步骤《四》

开发环境的准备主要涉及三个方面:JDK、Maven、Spring Tools 4 for Eclipse。 1. JDK JDK 的版本用 1.8 即可,环境变量大家自行去配置。配置好环境变量,在命令行中输入“java–version”能够显示出版本信息即可,如图 1 所示。 …

php 制作ppt,PPT制作三个基本要素是什么?

PPT制作三个基本要素是什么?1、一个PPT只为一类人服务,针对不同听众制作不同层次内容;2、PPT永远是为听者服务;3、PPT只讲一个重点,不要试图在某个PPT中既讲技术,又讲管理。PPT优势1.使用 Microsoft Office…

《springcloud超级入门》Spring Boot简介《五》

Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式进行配置,从而使开发人员不再需要定义样板化的配置。 Spring Boot 致力于在蓬勃发展的快速应用开发领域(rapid …

php代理m3u8,PHP实现m3u8并发下载

直接上代码//php下载m3u8文件$url $argv[1];if(!file_exists(./tmp/)) {if(!mkdir(./tmp/)) {die(请手动在当前目录创建tmp目录);}}$indexPage file_get_contents($url);preg_match_all(/.*.ts/, $indexPage, $matches);if(empty($matches)) {die(m3u8 文件格式错误);}go(fun…

《SpringCloud超级入门》Spring Boot项目搭建步骤(超详细)《六》

目录 编写第一个 REST 接口 读取配置文件 profiles 多环境配置 热部署 actuator 监控 自定义 actuator 端点 统一异常处理 异步执行 随机端口 编译打包 在 Spring Tools 4 for Eclipse 中选择 File->New->Maven Project, 在 pom.xml 中添加 Spri…

《SpringCloud超级入门》Spring Boot Starter的介绍及使用《七》

目录 Spring Boot Starter项目创建 自动创建客户端 使用 Starter 使用注解开启 Starter 自动构建 使用配置开启 Starter 自动构建 配置 Starter 内容提示 Spring Boot 的便利性体现在,它简化了很多烦琐的配置,这对于开发人员来说是一个福音&#…

php 发送短信 sms,php 调用百度sms来发送短信的实现示例

BaiduSms百度云 sms php版本官方没有给出php版本的短信发送sdk, 在此借鉴 [ 点击这里 ],并在此基础上将方法改成 单例模式 在原来的基础上更加容易调用1.打开 BaiduSms.php 修改 sms函数中 accessKey 、 secretAccessKey 这两个参数登录百度云账号,在右上…

《SpringCloud超级入门》Spring Cloud Eureka是什么?《八》

Spring cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 做了二次封装,主要负责实现微服务架构中的服务治理功能。 Spring Cloud Eureka 是一个基于 REST 的服务,并且提供了基于 Java 的客户端组件&#xff0c…

php 常用编译参数,php编译参数,不用怕!!

很多初学者,在编译php的时候,容易被php的编译参数吓到!例如:./configure \--prefix/usr/local/php \--with-config-file-path/usr/local/php/etc \--enable-inline-optimization \--disable-debug \--disable-rpath \--enable-sha…

《SpringCloud超级入门》使用Eureka编写注册中心服务《九》

首先创建一个 Maven项目&#xff0c;取名为 eureka-server&#xff0c;在 pom.xml 中配置 Eureka 的依赖信息&#xff0c;代码如下所示。 <!-- Spring Boot --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot…

php设置表单为整数,PHP中如何判断FROM表单提交的数字是否为整数?

在php开发中我们经常需要用表单传递数据&#xff0c;如果我们传递的是整数(int)&#xff0c;经过表单传递后&#xff0c;在接收页面整数的数值类型将会变成字符串(string)类型,这样我们就不能用is_int()函数来判断是否为整数&#xff0c;但是我们可以用is_numeric()和strpos()函…

《SpringCloud超级入门》使用Eureka编写服务提供者《十》

创建项目注册到 Eureka 将一个服务提供者 eureka-client-user-service 注册到 Eureka 中&#xff0c;并提供一个接口给其他服务调用。 创建一个 Maven 项目&#xff0c;在 pom.xml 中增加相关依赖 <parent> <groupId>org.springframework.boot</groupId> &l…

PHP苹果不给上架,苹果商城上架拒绝

苹果商城一直被拒绝&#xff0c;原因说是有支付宝支付功能&#xff0c;需要内购。但我配置中已经把支付宝支付功能去掉了&#xff0c;也勾上了应用内支付&#xff0c;但还是被拒绝&#xff0c;不知道什么原因&#xff0c;请问我该如何整改&#xff1f;是由于HBuilderX云打包默认…

《SpringCloud超级入门》使用Eureka编写服务消费者《十一》

我们先从 Nginx 说起&#xff0c;了解为什么需要微服务。最初的服务化解决方案是给相同服务提供一个统一的域名&#xff0c;然后服务调用者向这个域发送 HTTP 请求&#xff0c;由 Nginx 负责请求的分发和跳转。 这种架构存在很多问题&#xff1a;Nginx 作为中间层&#xff0c;在…

java echarts 散点图,echarts在地图上绘制散点图(任意点)

项目需求&#xff1a;在省份地图上绘制散点图&#xff0c;散点位置不一定是哪个城市或哪个区县&#xff0c;即任意点通过查询官网文档&#xff0c;找到一个与需求类似的Demo&#xff1a;https://www.echartsjs.com/gallery/editor.html?cscatter-map&#xff0c;更改代码&…

《SpringCloud超级入门》Eureka注册中心开启密码认证《十二》

Eureka 自带了一个 Web 的管理页面&#xff0c;方便我们查询注册到上面的实例信息&#xff0c;但是有一个问题&#xff1a;如果在实际使用中&#xff0c;注册中心地址有公网 IP 的话&#xff0c;必然能直接访问到&#xff0c;这样是不安全的。所以我们需要对 Eureka 进行改造&a…

php如何直接使用iview,iview 使用总结

vueiview 开发后台系统问题总结tags用了keep-alive 包裹 router-view,页面进行缓存点击tag可切换,不会重新渲染在特定页面比如详情页需要每次刷新的时候,添加watch $route 进行相关的刷新,导致了另外一个问题,最初跳转时用的 params传参,刷新参数就没了,特改为query传参.涉及到…

基于java+springboot+mybatis+laiyu实现学科竞赛管理系统《建议收藏》

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我&#xff0c;都给你】 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f…

JAVA输出菱形并使用绝对值,案例用绝对值的方法打印出菱形

import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner sc new Scanner(System.in);System.out.println("请输入菱形的层高(层高为奇数):");int num sc.nextInt();// 控制输入层高为奇数while (num % 2 0) {System.out.p…

基于java TCP实现网络通信聊天室《建议收藏附完整源码》

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我&#xff0c;都给你】 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f…