用PHPWord.php.ini等函數(shù)讀取WORD的話
2021-06-27
如果使用FILE、OPEN等函數(shù)直接讀取WORD,經(jīng)常會出現(xiàn)亂碼。最初,我不得不使用COM。這是我在新 WORD 中讀取和存儲的簡單文件
一、 首先打開PHP.ini的COM,操作如下
1.
extension=php_com_dotnet.dll
2.
com.allow_dcom = true
二、開啟后,可以嘗試以下操作
1、為新的 COM 組件創(chuàng)建索引
$word = new COM("word.application") or die("Can't start Word!");
2、顯示當(dāng)前使用的Word版本號
echo "Loading Word, v. {$word->Version}";
3、設(shè)置其可見性為0(),如果想在前端打開就用1(true)
$word->Visible = 0;
4、打開文檔
$word->Documents->open(dirname(__FILE__)."/1.doc");
5、閱讀文檔內(nèi)容
$test= $word->ActiveDocument->content->Text;
6、輸出文檔內(nèi)容
echo $test;
更多PHP中讀寫WORD文檔的代碼總結(jié)如下:
1.使用COM組件
? //?建立一個指向新COM組件的索引? $word?=?new?COM(”word.application”)?or?die(”Can't?start?Word!”);? //?顯示目前正在使用的Word的版本號? //echo?“Loading?Word,?v.?{$word->Version}<br>”;? //?把它的可見性設(shè)置為0(假),如果要使它在最前端打開,使用1(真)? //?to?open?the?application?in?the?forefront,?use?1?(true)? //$word->Visible?=?0;? //打?一個文檔? $word->Documents->OPen(”d:\myweb\muban.doc”);? //讀取文檔內(nèi)容? $test=?$word->ActiveDocument->content->Text;? echo?$test;? echo?“<br>”;? //將文檔中需要換的變量更換一下? $test=str_replace(”<{變量}>”,”這是變量”,$test);? echo?$test;? $word->Documents->Add();? //?在新文檔中添加文字? $word->Selection->TypeText(”$test”);? //把文檔保存在目錄中? $word->Documents[1]->SaveAs(”d:/myweb/comtest.doc”);? //?關(guān)閉與COM組件之間的連接? $word->Quit();? ?>?
2.是更簡潔的方法,可以跨平臺
以下是詳細(xì)代碼:
.word.php
HTML XMLns:o="urn:Schemas-microsoft-com:office:office"'; echo 'xmlns:w="urn:schemas-microsoft-com:office:word"'; echo 'xmlns="http://www.w3.org/TR/REC-html40">'; } function save($path){ echo "html>"; $data=ob_get_contents(); //返回輸出緩沖區(qū)的內(nèi)容 ob_end_clean(); //清空緩沖區(qū)并關(guān)閉輸出緩沖 $this->writeFile($path,$data); //將緩沖區(qū)內(nèi)容寫入word } function writeFile($fn,$data){ $fp=fopen($fn,"wb+"); fwrite($fp,$data); fclose($fp); } }
.php
start(); //以下內(nèi)容會保存在WORD文件中,可以使用HTML標(biāo)簽 ?> <h1>直接用php創(chuàng)建word文檔h1> 作者:axgle <hr size=1> <p>如果你打開data.doc,看到了這里的介紹,則說明word文檔創(chuàng)建成功了。 <p> 不論是在什么操作系統(tǒng)下,使用本方法都可以直接用PHP生成word文檔。絕對不是吹牛! 就算是沒有安裝word,也能夠生成word文件。 當(dāng)然了,生成的word文件可以用word,wps或者其他軟件打開。 <p> <b>使用方法:b> <br> 首先用$word->start()表示要生成word文件了。 然后你可以輸出任何的HTML代碼,不論是從文件讀過來再寫到這里, 還是直接在這里輸出HTML,都沒有關(guān)系。 <p>等你輸出完畢后,用$word->save($path)方法,其中$path是你想 生成的word文件的名稱(可以給出完整的路徑).當(dāng)你使用了$word->save() 方法后,這后面的任何輸出都和word文件沒有關(guān)系了,也就是說word的生成 工作就完成了。之后就和你平常使用php的方式一樣拉。隨便你輸出什么東西, 都直接在瀏覽器里輸出,而不會寫到word里面去。 <p>這是本人想到的一個很有意思的方法,它的實(shí)現(xiàn)方法出人意料的簡單,并且避免 了對windows環(huán)境的依賴。 <br>哈哈,很有意思吧?享受它吧! <hr size=1> save("data.doc");//保存word并且結(jié)束. //以下內(nèi)容正常輸出在頁面文件中 header("Content-type:text/html;charset=utf-8"); echo 'data.doc生成成功,請到目錄下查看<br>'; ?>
3.通過Web API讀取和顯示word文檔
可以使用API??,可以看到寫應(yīng)用的API
申請一個就可以用了,可以看看...免費(fèi)版有限制
比如,如果你支持它,你可以參考我。我申請了,所以你可以使用它...
保存本地html文件,打開后直接使用
詞相似
<!DOCTYPE html PUBLIC "-//w3c//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>測試百會格格遠(yuǎn)程APItitle> head> <body> <form action="http://gege.baihui.com/remotedoc.im?apikey=079c6475174c7a46351260ed35e54ecd&output=editor" target="_self" enctype="multipart/form-data" method="post"> 上傳文件: <input type="file" name="content" site="38"/> <input type="hidden" name="filename" value="my.xls,my.xlsx" /> <input type="hidden" name="saveurl" value="http://vai.com" /> <input type="hidden" name="id" value="21012145" /> <input type="hidden" name="format" value="xlsx" /> <input type="hidden" name="persistence" value="true" /> <input type="submit" value="提交" /> form> body> html>
4.PHP 導(dǎo)出Word文檔的原理和例子
原理
一般導(dǎo)出doc文檔有兩種方式,一種是使用com作為php的擴(kuò)展庫安裝在服務(wù)器上,然后創(chuàng)建一個com并調(diào)用其方法。安裝好的服務(wù)器可以調(diào)用一個名為word的com。生成word文檔,但是我不推薦這種方式php導(dǎo)出word格式數(shù)據(jù)的實(shí)現(xiàn)代碼,因?yàn)閳?zhí)行效率比較低(我測試過,在word客戶端執(zhí)行代碼的時候服務(wù)端居然會打開一個)。理想的com應(yīng)該沒有接口,在后臺進(jìn)行數(shù)據(jù)轉(zhuǎn)換。這個效果會好一些,但是這些擴(kuò)展一般是需要收費(fèi)的。
第二種方法是使用PHP將我們的doc文檔的內(nèi)容直接寫入一個后綴為doc的文件中。使用該方法不需要依賴第三方擴(kuò)展,執(zhí)行效率高。
word本身的功能還是很強(qiáng)大的,可以打開html格式的文件,并且可以保留格式,即使后綴是doc也能正常識別和打開。這為我們提供了便利。但有一個問題。 html格式文件中的圖片只有一個地址,真實(shí)圖片保存在別處。也就是說,如果將 HTML 格式寫入 doc,則 doc 將不包含圖片。那么我們?nèi)绾蝿?chuàng)建一個包含圖片的doc文檔呢?我們可以使用非常接近html的mht格式。
mht 格式與 html 非常相似,只是在 mht 格式中,來自外部鏈接的文件,例如圖片和 CSS 會被編碼和存儲。因此,單個 mht 文件可以保存一個網(wǎng)頁中的所有資源。當(dāng)然,相比html,它的尺寸會更大。
mht格式可以用word識別嗎?我把一個網(wǎng)頁保存為mht,然后修改后綴為doc,然后用word打開,OK,word也能識別mht文件,顯示圖片。
好的,既然doc可以識別mht,接下來就是考慮如何將圖片放入mht。由于html代碼中圖片的地址寫在img標(biāo)簽的src屬性中,所以只要提取html代碼中的src屬性值,就可以得到圖片地址。當(dāng)然有可能你得到的是相對路徑,沒關(guān)系,加上URL前綴,改成絕對路徑即可。有了圖片地址,我們就可以通過函數(shù)獲取圖片文件的具體內(nèi)容,然后調(diào)用函數(shù)將文件內(nèi)容編碼成代碼,最后插入到mht文件的合適位置。
最后,我們有兩種方法可以將文件發(fā)送到客戶端。一種是先在服務(wù)器端生成一個doc文檔,然后記錄doc文檔的地址,最后通過(":xx.doc");就可以讓客戶端下載這個doc了。另一種是直接發(fā)送html請求,修改html協(xié)議部分,將其-type設(shè)置為/doc,set-to,后跟文件名,發(fā)送html協(xié)議后,直接將文件內(nèi)容發(fā)送到 ,你也可以讓客戶端下載這個doc文件。
實(shí)現(xiàn)
通過以上原理的介紹,相信大家應(yīng)該對實(shí)現(xiàn)過程有了初步的了解。下面我將給出一個導(dǎo)出功能。該函數(shù)可以將 HTML 代碼導(dǎo)出為帶有 3 個參數(shù)的 mht 文檔。 2 為可選參數(shù)
:要轉(zhuǎn)換的HTML代碼
:如果HTML代碼中的圖片地址都是相對路徑,那么這個參數(shù)就是HTML代碼中缺失的絕對路徑。
:是否去除HTML代碼中的超鏈接
返回值為mht的文件內(nèi)容,可以保存為后綴為doc的文件
這個函數(shù)的主要作用其實(shí)就是分析HTML代碼中的所有圖片地址,依次下載。獲取到圖片內(nèi)容后,調(diào)用類將圖片添加到mht文件中。具體的添加細(xì)節(jié)封裝在類中。
/** ?* 根據(jù)HTML代碼獲取word文檔內(nèi)容 ?* 創(chuàng)建一個本質(zhì)為mht的文檔,該函數(shù)會分析文件內(nèi)容并從遠(yuǎn)程下載頁面中的圖片資源 ?* 該函數(shù)依賴于類MhtFileMaker ?* 該函數(shù)會分析img標(biāo)簽,提取src的屬性值。但是,src的屬性值必須被引號包圍,否則不能提取 ?* ?* @param string $content HTML內(nèi)容 ?* @param string $absolutePath 網(wǎng)頁的絕對路徑。如果HTML內(nèi)容里的圖片路徑為相對路徑,那么就需要填寫這個參數(shù),來讓該函數(shù)自動填補(bǔ)成絕對路徑。這個參數(shù)最后需要以/結(jié)束 ?* @param bool $isEraseLink 是否去掉HTML內(nèi)容中的鏈接 * by www.365jz.com ?*/ function getWordDocument( $content , $absolutePath = "" , $isEraseLink = true ) { ??? $mht = new MhtFileMaker(); ??? if ($isEraseLink) ??????? $content = preg_replace('/<a\s*.*?\s*>(\s*.*?\s*)<\/a>/i' , '$1' , $content);?? //去掉鏈接 $images = array(); ??? $files = array(); ??? $matches = array(); ??? //這個算法要求src后的屬性值必須使用引號括起來 ??? if ( preg_match_all('/<img[.\n]*?src\s*?=\s*?[\"\'](.*?)[\"\'](.*?)\/>/i',$content ,$matches ) ) ??? { ??????? $arrPath = $matches[1]; ??????? for ( $i=0;$i<count($arrPath);$i++) ??????? { ??????????? $path = $arrPath[$i]; ??????????? $imgPath = trim( $path ); ??????????? if ( $imgPath != "" ) ??????????? { ??????????????? $files[] = $imgPath; ??????????????? if( substr($imgPath,0,7) == 'http://') ??????????????? { ??????????????????? //絕對鏈接,不加前綴 ??????????????? } ??????????????? else ??????????????? { ??????????????????? $imgPath = $absolutePath.$imgPath; ??????????????? } ??????????????? $images[] = $imgPath; ??????????? } ??????? } ??? } ??? $mht->AddContents("tmp.html",$mht->GetMimeType("tmp.html"),$content); ??? for ( $i=0;$i<count($images);$i++) ??? { ??????? $image = $images[$i]; ??????? if ( @fopen($image , 'r') ) ??????? { ??????????? $imgcontent = @file_get_contents( $image ); ??????????? if ( $content ) ??????????????? $mht->AddContents($files[$i],$mht->GetMimeType($image),$imgcontent); ??????? } ??????? else ??????? { ??????????? echo "file:".$image." not exist!<br />"; ??????? } ??? } ??? return $mht->GetFile(); }
使用方法:
$fileContent = getWordDocument($content,"https://www.365jz.com/Music/etc/"); $fp = fopen("test.doc", 'w'); fwrite($fp, $fileContent); fclose($fp);
其中$變量應(yīng)該是HTML源代碼,下面的鏈接應(yīng)該是可以在HTML代碼中填寫圖片相對路徑的URL地址
注意在使用這個函數(shù)之前,需要先包含這個類,這個類可以幫助我們生成Mht文檔。
wudicgi@yahoo.de> Description:? The class can make .mht file. ***********************************************************************/ class MhtFileMaker{ ??? var $config = array(); ??? var $headers = array(); ??? var $headers_exists = array(); ??? var $files = array(); ??? var $boundary; ??? var $dir_base; ??? var $page_first; ??? function MhtFile($config = array()){ ??? } ??? function SetHeader($header){ ??????? $this->headers[] = $header; ??????? $key = strtolower(substr($header, 0, strpos($header, ':'))); ??????? $this->headers_exists[$key] = TRUE; ??? } ??? function SetFrom($from){ ??????? $this->SetHeader("From: $from"); ??? } ??? function SetSubject($subject){ ??????? $this->SetHeader("Subject: $subject"); ??? } ??? function 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->SetHeader("Date: $date"); ??? } ??? function SetBoundary($boundary = NULL){ ??????? if ($boundary == NULL) { ??????????? $this->boundary = '--' . strtoupper(md5(mt_rand())) . '_MULTIPART_MIXED'; ??????? } else { ??????????? $this->boundary = $boundary; ??????? } ??? } ??? function SetBaseDir($dir){ ??????? $this->dir_base = str_replace("\\", "/", realpath($dir)); ??? } ??? function SetFirstPage($filename){ ??????? $this->page_first = str_replace("\\", "/", realpath("{$this->dir_base}/$filename")); ??? } ??? function AutoAddFiles(){ ??????? if (!isset($this->page_first)) { ??????????? exit ('Not set the first page.'); ??????? } ??????? $filepath = str_replace($this->dir_base, '', $this->page_first); ??????? $filepath = 'http://mhtfile' . $filepath; ??????? $this->AddFile($this->page_first, $filepath, NULL); ??????? $this->AddDir($this->dir_base); ??? } ??? function 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"); ??????????????? } elseif (is_file("$dir/$filename")) { ??????????????????? $filepath = str_replace($this->dir_base, '', "$dir/$filename"); ??????????????????? $filepath = 'http://mhtfile' . $filepath; ??????????????????? $this->AddFile("$dir/$filename", $filepath, NULL); ??????????????? } ??????????? } ??????? } ??????? closedir($handle_dir); ??? } ??? function AddFile($filename, $filepath = NULL, $encoding = NULL){ ??????? if ($filepath == NULL) { ??????????? $filepath = $filename; ??????? } ??????? $mimetype = $this->GetMimeType($filename); ??????? $filecont = file_get_contents($filename); ??????? $this->AddContents($filepath, $mimetype, $filecont, $encoding); ??? } ??? function AddContents($filepath, $mimetype, $filecont, $encoding = NULL){ ??????? if ($encoding == NULL) { ??????????? $filecont = chunk_split(base64_encode($filecont), 76); ??????????? $encoding = 'base64'; ??????? } ??????? $this->files[] = array('filepath' => $filepath, ?????????????????????????????? 'mimetype' => $mimetype, ?????????????????????????????? 'filecont' => $filecont, ?????????????????????????????? 'encoding' => $encoding); ??? } ??? function CheckHeaders(){ ??????? if (!array_key_exists('date', $this->headers_exists)) { ??????????? $this->SetDate(NULL, TRUE); ??????? } ??????? if ($this->boundary == NULL) { ??????????? $this->SetBoundary(); ??????? } ??? } ??? function CheckFiles(){ ??????? if (count($this->files) == 0) { ??????????? return FALSE; ??????? } else { ??????????? return TRUE; ??????? } ??? } ??? function GetFile(){ ??????? $this->CheckHeaders(); ??????? if (!$this->CheckFiles()) { ??????????? exit ('No file was added.'); ??????? } //www.365jz.com ??????? $contents = implode("\r\n", $this->headers); ??????? $contents .= "\r\n"; ??????? $contents .= "MIME-Version: 1.0\r\n"; ??????? $contents .= "Content-Type: multipart/related;\r\n"; ??????? $contents .= "\tboundary=\"{$this->boundary}\";\r\n"; ??????? $contents .= "\ttype=\"" . $this->files[0]['mimetype'] . "\"\r\n"; ??????? $contents .= "X-MimeOLE: Produced By Mht File Maker v1.0 beta\r\n"; ??????? $contents .= "\r\n"; ??????? $contents .= "This is a multi-part message in MIME format.\r\n"; ??????? $contents .= "\r\n"; ??????? foreach ($this->files as $file) { ??????????? $contents .= "--{$this->boundary}\r\n"; ??????????? $contents .= "Content-Type: $file[mimetype]\r\n"; ??????????? $contents .= "Content-Transfer-Encoding: $file[encoding]\r\n"; ??????????? $contents .= "Content-Location: $file[filepath]\r\n"; ??????????? $contents .= "\r\n"; ??????????? $contents .= $file['filecont']; ??????????? $contents .= "\r\n"; ??????? } ??????? $contents .= "--{$this->boundary}--\r\n"; ??????? return $contents; ??? } ??? function MakeFile($filename){ ??????? $contents = $this->GetFile(); ??????? $fp = fopen($filename, 'w'); ??????? fwrite($fp, $contents); ??????? fclose($fp); ??? } ??? function GetMimeType($filename){ ??????? $pathinfo = pathinfo($filename); ??????? switch ($pathinfo['extension']) { ??????????? case 'htm': $mimetype = 'text/html'; break; ??????????? case 'html': $mimetype = 'text/html'; break; ??????????? case 'txt': $mimetype = 'text/plain'; break; ??????????? case 'cgi': $mimetype = 'text/plain'; break; ??????????? case 'php': $mimetype = 'text/plain'; break; ??????????? case 'css': $mimetype = 'text/css'; break; ??????????? case 'jpg': $mimetype = 'image/jpeg'; break; ??????????? case 'jpeg': $mimetype = 'image/jpeg'; break; ??????????? case 'jpe': $mimetype = 'image/jpeg'; break; ??????????? case 'gif': $mimetype = 'image/gif'; break; ??????????? case 'png': $mimetype = 'image/png'; break; ??????????? default: $mimetype = 'application/octet-stream'; break; ??????? } ??????? return $mimetype; ??? } } ?>
上面討論了如何通過mht文件從PHP中導(dǎo)出doc格式。這種方法可以解決一個難題,就是在導(dǎo)出的doc文件中包含圖片。當(dāng)然,如果你想包含更多的內(nèi)容,比如CSS樣式表php導(dǎo)出word格式數(shù)據(jù)的實(shí)現(xiàn)代碼,你只需要使用正則表達(dá)式來分析HTML代碼中的link標(biāo)簽并提取css即可。然后讀取樣式文件的地址并進(jìn)行編碼,最后添加到 mht 文件中。
以上就是本文的全部內(nèi)容,希望大家喜歡。