PHP将Excel另存为Word
//这里引入PHPExcel类 $filePath = 'Excel文件.xls'; $fileType = PHPExcel_IOFactory::identify($filePath); //文件名自动判断文件类型 $objReader = PHPExcel_IOFactory::createReader($fileType); $objPHPExcel = $objReader->load($filePath); $savePath = '文件保存路径/文件名.doc'; //这里直接改为word后缀即可 $objWriter = new PHPExcel_Writer_HTML($objPHPExcel); //注意这里,比上篇文章多了这行代码 $objWriter->setUseInlineCss(true); //采用内联样式 $objWriter->setSheetIndex(0); $objWriter->save($savePath);
真心感觉这就像是连续剧,刚搞完另存为html,又搞了一个另存为word。
下面说原理:
其实原理不难,经过测试,fwrite写入html代码时,只要将css样式以内联样式写入,最后另存为的word即可显示对应的样式内容(关于内联、外联、嵌入样式的定义,请自行好搜)。比如html代码这么写:
<div style='color:red;font-weight:bold;'></div>
那么在生成的word中即可看到红色加粗的文字。但,如果div只是写成 class='className' 的形式,word则不会解析。
基于此思路,即将原本写在head中的css样式直接追加到Table内部,学名叫做 嵌入式样式表(内部样式表) 改为 内联样式,即可实现在保留样式的前提下另存为word。
我最初的方法是将PHPExcel自带的HTML类拷贝了一份,修改后作为Word类使用,但在修改过程中,发现了 setUseInlineCss 方法,从方法名就可以看出,这是设置是否采用内联样式的,悲催的是,当时我已经改了快一半...才发现,原来追加这一行代码即可,由此可见,通读代码是多么的重要,还好原作者的代码写的非常棒,要不然只能头疼着去读了...严重怀疑原作者当时也是为了保存为word,所以特意加了这么一个功能...(⊙﹏⊙)b
不过,还另有收获,源代码中针对PDF另存为html时,还增加了 Tab 标签功能,即会对多个sheet生成navigation...算是个彩蛋吧,留着以后也许会用到。