2012-10-31 40 views
6

我已經閱讀了關於這個問題的多篇文章,而且似乎也沒有對我的問題做出正確的結論。 (也許我試圖看看最近是否有任何東西出現)。如何在不使用COM Automation的情況下使用Word文檔?

我有一個處理承諾的小型慈善應用程序。這樣做時,它需要使用和打印文檔。

事情是,如果Word在後臺打開,應用程序線程將掛起並且不會響應Word的關閉,我必須手動回滾並關閉單詞。當然,這一切都很好,但我不能保證最終用戶會關閉Word,即使我將該說明放在用戶手冊中。

我對速度沒有太大的興趣,但我想如果能夠提高的話,這將是一個不錯的小紅利。

是否有任何圖書館爲Delphi發佈,允許我打開,編輯,打印和保存文檔?如果沒有,有沒有辦法以這樣的方式使用Word Automation,使其在打開時不會與另一個打開的Word句柄發生衝突?

+0

您可以在.net上試用Aspose。對於Delphi來說沒有什麼全面的也許最好的選擇是使用除了Word文檔之外的其他東西。基於文本文件的東西。 –

+0

我不是非常熱衷於編寫包裝和東西,如果這甚至可以與Aspose一起使用。無論如何,我還沒有真正看過它,因爲它是.Net。說實話,Word給了我最好的文檔靈活性,特別是對於最終用戶。所以不使用Word不是一個真正的選擇。不過謝謝。 :) –

+0

*應用程序線程將掛起*,完全在哪個電話上? –

回答

5

如果您使用GetActiveOleObject,您將獲得Word的運行實例。 通過使用CreateOleObject,您將得到一個新的實例,不應該被其他正在運行的實例困擾。

如果您使用TWordApplication包裝,您可以將ConnectKind設置爲ckNewInstance來完成此操作。默認情況下,TWordApplication將嘗試連接正在運行的實例。

+0

有沒有方法可以在不使用TWordApplication的情況下設置ConnectKind(或類似的東西)?如果你知道我的意思,我傾向於使用原始的Ole函數。我確實使用CreateOleObject。 –

+5

你爲什麼喜歡後來綁定的COM?當然早綁定更好。 –

+0

我可以這樣做,這不是一個可怕的想法,但它是我可以改變ConnectKind的唯一方法嗎?我相信早期綁定還有其他一些好處,但我不確定是否需要它們。 –

0

如果您想要打開編輯和打印Word文檔,並且不介意使用RTF格式進行所做的操作,請調查TRichView

它將生成RTF格式的豐富文檔,這是MS word支持的格式之一。我不認爲它直接讀取.DOC文件,但可以將.DOC和.DOCX轉換爲RTF,適用於大多數簡單文件,但某些高級格式化功能在轉換中會丟失。

它的優點是無需任何需要將MS Word的任何副本安裝在要執行文檔處理的機器上。爲了製作收據和其他簡單的文件,這將是最可靠的技術;根本不要直接使用Word。

+1

就我所知,RTF文件格式的問題是不支持頁眉和頁腳。限制客戶的能力是不明智的。這與我爲此目的不完全遷移到OpenOffice(同時支持它)的原因相同。 –

1
procedure PrintViaWord (const filename: string); 
const 
wdUserTemplatesPath = 2; 

var 
    wrdApp, wrdDoc, wrdSel: variant; 

begin 
wrdApp:= CreateOleObject ('Word.Application'); // create new instance 
sleep (5000); // this fixes a bug in Word 2010 to do with opening templates 
wrdDoc:= wrdApp.documents.add (
      wrdApp.Options.DefaultFilePath[wdUserTemplatesPath] + '\mytemplate.dot'); 

wrdDoc.Select; 
wrdSel:= wrdApp.selection; 
wrdApp.Options.CheckSpellingAsYouType:= 0; 
wrdSel.paragraphformat.alignment:= 1; 
wrdSel.typetext ('This is a program demonstrating how to open Word in the background' 
        + ' and add some text, print it, save it and exit Word'); 
wrdDoc.SaveAs (filename + '.doc'); 
wrdApp.ActivePrinter:= 'Konica Minolta 211'; 
wrdApp.PrintOut; 
WrdDoc.SaveAs (filename + '.doc'); 
wrdApp.quit; 

wrdSel:= unassigned; 
wrdDoc:= unassigned; 
wrdApp:= unassigned 
end; 
相關問題