php生成并下载word文件到本地实现方法详解
安装phpword包
通过composer安装phpword包。因为是使用thinkphp架构,安装挺方便的。
直接下载phpword压缩包有问题。
composer require phpoffice/phpword
准备一个word模板(docx格式)
准备好word模板后,只需要用变量替换需要替换的值,如下图所示,将房东名替换成${name}。
前端调用代码
系统前端是使用vue3+element Ui开发的。所以请求用到axios。其中设置responseType
。responseType
表示服务器响应的数据类型,可以是 ‘arraybuffer’, ‘blob’, ‘document’, ‘json’, ‘text’, ‘stream’。默认的 responseType: ‘json’,
而axios下载文件需要设置responseType: ‘blob’,
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | axios.post(url, data, { headers: { 'X-CSRF-TOKEN' : this.token }, responseType: 'blob' }) .then((res) => { const { data, headers } = res const contentDisposition = headers[ 'content-disposition' ] const patt = new RegExp( 'filename=([^;]+\.[^\.;]+);*' ) const result = patt. exec (contentDisposition) const filename = decodeURI(JSON.parse(result[1])) // 处理文件名,解决中文乱码问题 const blob = new Blob([data], { type: headers[ 'content-type' ] }) let dom = document.createElement( 'a' ) let url = window.URL.createObjectURL(blob) dom.href = url dom.download = decodeURI(filename) dom.style.display = 'none' document.body.appendChild(dom) dom.click() dom.parentNode.removeChild(dom) window.URL.revokeObjectURL(url) }). catch ((err) => { }) |
PHP处理代码
后端方面的代码如下。Talk is cheap, show me the code.
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public function contract() { $tmp = new \PhpOffice\PhpWord\TemplateProcessor( 'static/wordfile/contract.docx' ); //打开模板 $tmp ->setValue( 'name' , '君常笑' ); //替换变量name $tmp ->setValue( 'mobile' , '12' ); //替换变量mobile $tmp ->saveAs( '../tempfile/简历.docx' ); //另存为 $file_url = '../tempfile/简历.docx' ; $file_name = basename ( $file_url ); $file_type = explode ( '.' , $file_url ); $file_type = $file_type [ count ( $file_type )-1]; $file_type = fopen ( $file_url , 'r' ); //打开文件 //输入文件标签 header( "Content-type: application/octet-stream" ); header( "Accept-Ranges: bytes" ); header( "Accept-Length: " . filesize ( $file_url )); header( "Content-Disposition:attchment; filename=" . json_encode( '合同.docx' )); //输出文件内容 echo fread ( $file_type , filesize ( $file_url )); fclose( $file_type ); } |
one more thing
在传输过程中,可能会出现文件名是乱码的问题。也就是Content-Disposition中filename中文是乱码。解决方法如下:
php端使用json_encode(filename)
前端使用JSON.parse()
到此这篇关于php生成并下载word文件到本地实现方法详解的文章就介绍到这了,更多相关php下载word文件内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/m0_61078449/article/details/126459231
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。