2012-03-12 63 views
1

我的網站是使用AJAX調用服務器端PHP的HTML/Javascript。我想讓用戶點擊一個圖標並從MySQL數據創建一個報告,然後將其保存在客戶端桌面而不是進行頁面重新加載。在用戶桌面上動態創建doc/docx文檔

創建文檔的選項,我可以收集它,看起來如下所示。 (我收集它需要完成服務器端,而不是使用Javascript。)我不知道在每種情況下文件的結尾。請隨時糾正我的誤解:)

方法1 - 這隻出現創建一個.doc文件。我不確定文件的放置位置。

$fp = fopen("method1.doc", 'w+'); 
$str = "<B>This is the text for the word file created through php programming</B>"; 
fwrite($fp, $str); 
fclose($fp); 

方法2 - 這也似乎創建一個.doc文件。

$word = new COM("word.application") or die ("couldnt create an instance of word"); 
echo "loaded , word version{$word->version}"; 
$word->visible = 1; 
$word->Documents->Add(); 
$word->Selection->TypeText("Sample text."); 
$word->Documents[1]->SaveAs("method2.doc"); 
$word->Quit(); 
$word->Release(); 
$word = null; 

方法3 - 也是一個.doc文件,我想。

header('Content-type: application/vnd.ms-word'); 
header("Content-Disposition: attachment;Filename=method3.doc"); 

echo "<html>"; 
echo "<body>"; 
echo "<b>My first document</b>"; 
echo "</body>"; 
echo "</html>"; 

方法4 - PHPWord

方法5 - PHPDocx

我測試過1 & 2在我家的開發環境,但我無法找到文件!請問最好的方法是什麼?

謝謝:)

順便說一句,我知道有相關的帖子hereherehere,但沒有真正回答了這個問題。

+0

在您的第一次和第二次嘗試中,文件被保存在服務器上,而不是發送到客戶端。如果你需要客戶端來保存文件,你應該輸出生成的內容並設置適當的響應頭文件,就像你在第三個例子中那樣(儘管這不會產生一個「正確」的Word文檔)。 – 2012-03-12 07:14:20

回答

1

方法1 & 2在服務器端文件系統中的某處創建文檔(之後,您需要將其傳輸到客戶端)。

方法3創建文檔作爲對客戶端請求的響應 - 取決於設置,瀏覽器將保存它或在窗口中打開(或詢問「保存/打開/取消?」)。

我個人會製作java applet或flash應用程序,它可以訪問你的本地文件系統。它可以從服務器加載文件並保存到本地文件系統,無需重新加載頁面。

2

如果你想有一個圖標,並且點擊圖標時它會下載沒有頁面重新加載,那麼你只需要鏈接到一個圖標,該圖標帶來一個腳本,使用適當的頭文件開始下載。

例子:

header ('Pragma: no-cache'); 
header('Content-Disposition: attachment; filename="'.$File.'"'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Cache-Control: public'); 
header('Content-Description: File Transfer'); 
header('Content-Transfer-Encoding: binary'); 
header('Content-Length: '.$Len); 

這樣做,下載將開始,但如果用戶點擊該頁面將不會改變,也不重新加載。

如果要生成要下載的動態DOCX文件,我推薦使用OpenTBS。該庫可以使用模板生成DOCX(以及XLSX,PPTX,ODT,ODS ...)。它有一個功能,可以讓您直接下載結果,無需臨時文件,或讓您保存在服務器端。