本文主要介绍了php生成word的三种方式,并利用PHP将内容写入Word。有需要的话可以看看。
最近,我的工作遇到了一些关于生成word的问题。
现在总结一下生成word的三种方法。
Btw:好像只要标题有php,点击量都不是很高(兄弟,我标题上还有PHP)。我不知道为什么。据估计,博客花园里有大量的网络技术。如果是java,把net和PHP比作程序员的闺蜜,那么java就是Oracle之下的贵族家庭,net微软是贵族家庭,PHP是草根下的山村大妈。这让我等着PHP的伙计们生闷气。发完牢骚,正式写。
PHP生成word原理
利用windows下的com组件
用PHP将内容写入doc文件。
具体实现:
利用windows下面的 com组件
原理:com是PHP的扩展类。安装了office的服务器会自动调用word.application的com,可以自动生成文档。PHP官方文档手册:http://www.php.net/manual/en/class.com.php
使用官方实例:
?服务器端编程语言(Professional Hypertext Preprocessor的缩写)
//起始字
$word=new COM(word.application )或die(无法实例化Word );
“echo”已加载Word,Version { $ Word-Version } n”;
//放在前面
$ word-Visible=1;
//打开一个空文档
$ word-Documents-Add();
//做一些奇怪的事情
$word-Selection-TypeText(这是一个测试.);
$word-Documents[1]-SaveAs(无用的test . doc );
//结束词
$ word-Quit();
//释放对象
$ word=null
?
个人建议:com instance之后的所有方法都需要查官方文档才能知道是什么意思。编辑器没有代码提示,很不方便。况且这个效率不是很高,所以不推荐。
利用PHP将内容写入doc文件之中
这种方法可以分为两种方法。
生成mht格式(类似HTML)并写入word
把纯HTML格式写成word
生成mht格式(和HTML很相似)写入word
/**
*根据HTML代码获取word文档内容
*创建一个mht性质的文档。这个函数将分析文件的内容并远程下载页面中的图片资源。
*该函数依赖于MhtFileMaker类
*该函数将分析img标签并提取src的属性值。但是src的属性值必须用引号括起来,否则无法提取。
*
* @param string $content HTML内容
* @param string $absolutePath网页的绝对路径。如果HTML内容中的图片路径是相对路径,则需要填入该参数,使函数自动填入绝对路径。此参数需要以/结尾
* @param bool $isEraseLink是否要删除HTML内容中的链接?
*/
函数getWordDocument( $content,$absolutePath= ,$isEraseLink=true)
{
$ MHT=new MHT file maker();
if ($isEraseLink)
$content=preg_replace(/as*。*?s*(s*)。*?s*)/a/i , $1 ,$ content);//移除链接
$ images=array();
$ files=array();
$ matches=array();
//这个算法要求src后面的属性值必须用引号括起来。
if ( preg_match_all(/img[。n]*?srcs*?=s*?[](.*?)[](.*?)//i ,$content,$matches))
{
$ arr path=$ matches[1];
for($ I=0;$ icount($ arr path);$i)
{
$ path=$ arr path[$ I];
$ img path=trim($ path);
if ( $imgPath!= )
{
$ files[]=$ img path;
if( substr($imgPath,0,7)==http://)
{
//绝对链接,不带前缀
}
其他
{
$imgPath=$absolutePath。$ imgPath
}
$ images[]=$ img path;
}
}
}
$mht-AddContents(tmp.html ),$mht-GetMimeType(tmp.html ),$ content);
for($ I=0;$ icount($ images);$i)
{
$ image=$ images[$ I];
if ( @fopen($image, r ))
{
$ img content=@ file _ get _ contents($ image);
如果(内容)
$mht-AddContents($files[$i],$mht-GetMimeType($image),$ img content);
}
其他
{
“回显”文件:“”。$image。不存在!br/;
}
}
返回$ MHT-GetFile();
}
这个函数的主要作用其实就是分析HTML代码中的所有图片地址,依次下载。获取图片内容后,调用MhtFileMaker类将图片添加到mht文件中。具体的添加细节封装在MhtFileMaker类中。
用途:远程通话。
url=http://www。***.com
$ content=file _ get _ contents($ URL);
$ file content=get word document($ content, https://www .jb51。net/Music/etc/);
$fp=fopen(test.doc , w );
fwrite($fp,$文件内容);
fclose($ FP);
其中,$内容变量应该是超文本标记语言源代码,后面的链接应该是能填补超文本标记语言代码中图片相对路径的统一资源定位器地址
本地生成调用:
header(Cache-Control: no-cache,must-revalidate );
header(" Pragma:no-cache ");
$ wordStr= https://www。jb51。net/;
$ file content=get word document($ wordStr);
$fileName=iconv(utf-8 , GBK , jb51 ._.$intro ._ .兰特(100,999);
头(内容类型:应用程序/文档);
标题(内容-处置:附件;文件名=。$ fileName . doc );
回显$ fileContent
注意,在使用这个函数之前,您需要先包含类MhtFileMaker,这个类可以帮助我们生成多项健康试验文档。
?服务器端编程语言(专业超文本预处理器的缩写)
/***********************************************************************
类别:Mht文件生成器
版本:1.2测试版
日期:2007年11月2日
作者:吴迪
描述:该类可以制作100 . MHT文件。
***********************************************************************/
MhtFileMaker类{
var $ config=array();
var $ headers=array();
var $ headers _ exists=array();
var $ files=array();
var $ boundary
var $ dir _ base
var $ page _ first
函数MhtFile($config=array()){
}
函数SetHeader($header){
$ this-headers[]=$ header;
$key=strtolower(substr($header,0,strpos($header,:));
$ this-headers _ exists[$ key]=TRUE;
}
函数set from(from){
$ this-set头( From:$ From );
}
函数SetSubject($subject){
$ this-set头( Subject:$ Subject );
}
函数SetDate($date=NULL,$istimestamp=FALSE){
if ($date==NULL) {
$ date=time();
}
if ($istimestamp==TRUE) {
$date=date(D,d M Y H:i:s O ,$ date);
}
$ this-set标头( Date:$ Date );
}
函数SetBoundary($boundary=NULL){
if ($boundary==NULL) {
$this-boundary= - .strtoupper(md5(mt_rand()))._ MULTIPART _ MIXED ;
}否则{
$ this-boundary=$ boundary;
}
}
函数SetBaseDir($dir){
$this-dir_base=str_replace( ,/,realpath($ dir));
}
函数SetFirstPage($filename){
$ this-page _ first=str _ replace( ,/,realpath( { $ this-dir _ base }/$ filename );
}
函数AutoAddFiles(){
如果(!isset($this-page_first)) {
退出(不设置首页。);
}
$ file path=str _ replace($ this-dir _ base,,$ this-page _ first);
$filepath=http://mhtfile .$文件路径
$this-AddFile($this-page_first,$filepath,NULL);
$ this-AddDir($ this-dir _ base);
}
函数AddDir($dir){
$ handle _ dir=opendir($ dir);
while($ filename=readdir($ handle _ dir)){
if (($filename!=.)($filename!=.)( $dir/$filename !=$this-page_first)) {
if(is _ dir( $ dir/$ filename ){
$ this-AddDir($ dir/$ filename));
} else if(is _ file( $ dir/$ filename ){
$ file path=str _ replace($ this-dir _ base,, $ dir/$ filename );
$filepath=http://mhtfile .$文件路径
$this-AddFile($dir/$filename ,$filepath,NULL);
}
}
}
closedir($ handle _ dir);
}
函数AddFile($filename,$filepath=NULL,$encoding=NULL){
if ($filepath==NULL) {
$ filepath=$ filename
}
$ mime type=$ this-getmime type($ filename);
$ file cont=file _ get _ contents($ filename);
$this-AddContents($filepath,$mimetype,$filecont,$ encoding);
}
函数AddContents($filepath,$mimetype,$filecont,$encoding=NULL){
if ($encoding==NULL) {
$ file cont=chunk _ split(base64 _ encode($ file cont),76);
$ encoding= base64
}
$ this-files[]=array( file path =$ file path,
mimetype=$mimetype,
filecont=$filecont,
encoding =$ encoding);
}
函数CheckHeaders(){
如果(!array_key_exists(date ,$this-headers_exists)) {
$this-SetDate(NULL,TRUE);
}
if ($this-boundary==NULL) {
$ this-set boundary();
}
}
函数CheckFiles(){
if (count($this-files)==0) {
返回错误的
}否则{
返回真实的
}
}
函数GetFile(){
$ this-check头();
如果(!$this-CheckFiles()) {
退出(未添加文件。);
}
$contents=内爆( rn ,$ this-headers);
$内容s= r n
$内容. 1= MIME-Version:1.0 r n ;
$内容“Content-Type:multipart/related; r n ;
$内容.= t boundary= { $ this-boundary } ; r n ;
$内容. t= t类型= 。$this-files[0][mimetype]. r n ;
$内容. X= X-mime ole:由多项健康试验文件生成器1.0测试版生成 r n ;
$内容s= r n
$内容。=这是哑剧格式的多部分消息“. r n”;
$内容s= r n
foreach ($this-files as $file) {
$内容.=-{ $ this-boundary } r n ;
$内容 Content-Type:$ file[mime Type] r n ;
$内容.= Content-Transfer-Encoding:$ file[Encoding] r n ;
$内容 Content-Location:$ file[文件路径] r n ;
$内容s= r n
$内容. file=$ file[ file cont ];
$内容s= r n
}
$内容.=-{ $ this-boundary }- r n ;
返回$内容
}
函数MakeFile($filename){
$ contents=$ this-GetFile();
$fp=fopen($filename, w );
fwrite($fp,$ contents);
fclose($ FP);
}
函数GetMimeType($filename){
$ pathinfo=pathinfo($ filename);
开关($pathinfo[extension]) {
case " htm ":$ mime type=" text/html ";打破;
case " html ":$ mime type=" text/html ";打破;
case“txt”:$ mime type=“text/plain”;打破;
case“CGI”:$ mime type=“text/plain”;打破;
case PHP :$ mime type= text/plain ;打破;
case“CSS”:$ mime type= text/CSS ;打破;
case " jpg ":$ mime type=" image/JPEG ";打破;
大小写" JPEG ":$ mime type=" image/JPEG ";打破;
case " jpe ":$ mime type=" image/JPEG ";打破;
case " gif ":$ mime type=" image/gif ";打破;
case " png ":$ mime type=" image/png ";打破;
默认值:$ mime type= application/octet-stream ;打破;
}
返回$ mimetype
}
}
?
点评:这种方法的缺点是不支持批量生成下载,因为一个页面只能有一个标题,(无论远程使用还是本地生成声明页眉页面只能输出一个标题),即使你循环生成,结果还是只有一个单词生成(当然你可以修改上面的方式来实现)
2.纯HTML格式写入word
原理:
利用ob _开始把超文本标记语言页面先存储起来(解决一下页面多个页眉问题,可以批量生成),然后在写入文件文档内容利用
代码:
?服务器端编程语言(专业超文本预处理器的缩写)
类别词
{
函数开始()
{
ob _ start();
echo html xmlns:o= urn:schemas-Microsoft-com:office:office
xmlns:w= urn:schemas-Microsoft-com:office:word
xmlns= http://www。w3。org/TR/REC-html 40 " ";
}
功能保存($path)
{
echo "/html ";
$ data=ob _ get _ contents();
ob _ end _ clean();
$this-wirtefile ($path,$ data);
}
函数wirtefile(fn,data)
{
$fp=fopen($fn, WB );
fwrite($fp,$ data);
fclose($ FP);
}
}
$html=
表格宽度=600单元格填充=6 单元格间距=1 bgcolor=#336699
tr bgcolor=White
tdPHP10086/td
TDA。PHP 10086。com target= _ blank http://www.php10086.com/a/td
/tr
tr bgcolor=red
tdPHP10086/td
TDA。PHP 10086。com target= _ blank http://www.php10086.com/a/td
/tr
tr bgcolor=White
td colspan=2
PHP10086br
最靠谱的服务器端编程语言(专业超文本预处理器的缩写)技术博客分享网站
img src= http://www。PHP 10086。com/WP-content/themes/WPortal-Blue/images/logo。 gif
/td
/tr
/表格
;
//批量生成
for($ I=1;$ I=3;$i ){
$ word=new word();
$ word-start();
//$html=aaa .$ I;
$wordname=PHP淮北的个人网站-PHP10086.com的.一美元.doc ;
echo $ html
$ word-save($ word name);
ob _ flush();//每次执行前刷新缓存
flush();
}
个人点评:这种方法效果最好,原因有两个:
第一代码比较简洁,很容易理解,第二种支持批量生成单词(这个很重要)
第三支持完整的超文本标记语言代码
生成了三个单词文档:并且内容支持完整的超文本标记语言代码显示,第三种方法强烈推荐
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。