background image

使用

PHP 导出 Word 文档的原理和实例

 原理
 一般,有 2 种方法可以导出 doc 文档,一种是使用 com,并且作为 php 的一个扩展库

安装到服务器上,然后创建一个

com,调用它的方法。安装过 office 的服务器可以调用一个

word.application 的 com,可以生成 word 文档,不过这种方式我不推荐,因为执行效率比

较低(我测试了一下,在执行代码的时候,服务器会真的去打开一个

word 客户端)。理想

com 应该是没有界面的,在后台进行数据转换,这样效果会比较好,但是这些扩展一般

需要收费。

    第 2 种方法,就是用 PHP 将我们的 doc 文档内容直接写入一个后缀为 doc 的文件中即可。
使用这种方法不需要依赖第三方扩展,而且执行效率较高。

    word 本身的功能还是很强大的,它可以打开 html 格式的文件,并且能够保留格式,即使
后缀为

doc,它也能识别正常打开。这就为我们提供了方便。但是有一个问题,html 格式的

文件中的图片只有一个地址,真正的图片是保存在其他地方的,也就是说,如果将

HTML

格式写入

doc 中,那么 doc 中将不能包含图片。那我们如何创建包含图片的 doc 文档呢?我

们可以使用和

html 很接近的 mht 格式。

      mht 格式和 html 很类似,只不过在 mht 格式中,外部链接进来的文件,比如图片 、
Javascript、CSS 会被 base64 进行编码存储。因此,单个 mht 文件就可以保存一个网页中的所
有资源,当然,相比

html,它的尺寸也会比较大。

    mht 格式能被 word 识别吗?我将一个网页保存成 mht,然后修改后缀名为 doc,再用
word 打开,OK,word 也可以识别 mht 文件,并且可以显示图片。
    好了,既然 doc 可以识别 mht,下面就是考虑如何将图片放入 mht 了。由于 html 代码中的
图片的地址都是写在

img 标签的 src 属性中,因此,只要提取 html 代码中的 src 属性值,就

可以获得图片地址。当然,有可能您获取到的是相对路径,没关系,加上

URL 的前缀,改

成绝对路径就可以了。有了图片地址,我们就可以通过

file_get_content 函数获取到图片文件

的具体内容,然后调用

base64_encode 函数将文件内容编码成 base64 编码,最后插入到 mht

文件的合适位置即可。

    最后,我们有两种方法将文件发送给客户端,一种是先在服务器端生成一个 doc 文档,
然后将这个

doc 文档的地址记录下来,最后,通过 header("location:xx.doc");就可以让客户

端下载这个

doc。还有一种是直接发送 html 请求,修改 HTML 协议的 header 部分,将它的

content-type 设置为 application/doc,将 content-disposition 设置为 attachment,后面跟上文件
名,发送完

html 协议以后,直接将文件内容发送给客户端,也可以让客户端下载到这个

doc 文档。

实现

通过以上的原理介绍,相信大家应该对实现的过程有个初步的了解了,下面我给出一

个导出函数,这个函数可以将

HTML 代码导出成一个 mht 文档,参数有 3 个,其中后 2 个

为可选参数

    content:要转换的 HTML 代码
    absolutePath: 如果 HTML 代码中的图片地址都是相对路径,那么这个参数就是 HTML 代
码中缺少的绝对路径。