php完美导出word,PHP使用phpword生成word文档
使用phpword生成文檔有兩種方式直接使用代碼編寫word文檔,用代碼生成word,但是設置樣式,格式,圖片非常麻煩,不建議使用。如果客戶或產品提供一份word的樣式,我們也難以完全復原,調樣式很頭疼的。
讀取原有word模板,替換相關變量。個人感覺這種方式能滿足絕大部分需求,實現起來也比較簡單,所有的樣式,格式直接在word模板里設置好,替換變量就可以了,還可以很方便的切換模板。本文主要介紹這種方式,畢竟我們是為了快速實現客戶的需求,讓客戶提供一份word模板,我們稍微一改就可以了。
開始干活
1,通過composer安裝phpword包composer require phpoffice/phpword
2,準備一個word模板(讓客戶或產品提供吧,docx格式的)
$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類似
//?陳列獎勵
//?循環替換
$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);?//內容
總結
以上是生活随笔為你收集整理的php完美导出word,PHP使用phpword生成word文档的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: flash 火狐总是崩溃_win10系统
- 下一篇: buffsize 缓冲区的大小多少合适_