2012-10-31 14 views
6

Przeczytałem wiele postów na ten temat i żadne z nich nie wydaje się należycie rozstrzygać na moje pytanie. (Być może próbuję sprawdzić, czy coś ostatnio się pojawiło.)Jak pracować z dokumentami programu Word bez korzystania z automatyzacji COM?

Mam małą aplikację charytatywną, która zajmuje się zastawami. Czyniąc to, musi pracować z dokumentami i drukować je.

Rzecz polega na tym, że jeśli Word jest otwarty w tle, wątek aplikacji zawiesi się i nie odpowie na zamknięcie Worda, a ja muszę ręcznie wycofać i zamknąć słowo. Oczywiście, że wszystko działa dobrze, ale po prostu nie mogę zagwarantować, że użytkownik końcowy zamknie program Word, nawet jeśli wstawię instrukcję do instrukcji użytkownika.

Nie jestem zbyt poruszony szybkością, ale myślę, że jeśli można ją ulepszyć, byłaby to niezła premia.

Czy zostały wydane jakiekolwiek biblioteki dla Delphi, które pozwolą mi otwierać, edytować, drukować i zapisywać dokumenty? Jeśli nie, czy istnieje sposób na wykorzystanie programu Word Automation w taki sposób, aby po otwarciu nie kolidował z innym otwartym uchwytem programu Word?

+0

Możesz wypróbować Aspose na .net. Nic tak kompleksowego dla Delphi. Być może najlepszą opcją jest użycie czegoś innego niż dokument Word. Coś opartego na pliku tekstowym. –

+0

Nie jestem strasznie zainteresowany pisaniem owijaczy i rzeczy, jeśli jest to nawet możliwe z Aspose. Tak naprawdę nie patrzyłem na to, po prostu dlatego, że jest .Net. Mówiąc szczerze, program Word zapewnia mi najlepszą elastyczność w zakresie dokumentów, szczególnie dla użytkownika końcowego. Więc nie używanie Worda nie jest tak naprawdę opcją. W każdym razie dzięki. :) –

+0

* Wątek aplikacji zawiesza się *, na którym dokładnie polega połączenie? –

Odpowiedz

5

Jeśli użyjesz GetActiveOleObject, otrzymasz działającą instancję programu Word. Używając CreateOleObject, otrzymasz nową instancję i nie powinny niepokoić inne uruchomione instancje.

Jeśli używasz TWordApplication, otoki można ustawić ConnectKind na , aby to osiągnąć. Domyślnie TWordApplication spróbuje połączyć się z działającą instancją.

+0

Czy istnieje sposób ustawić ConnectKind (lub coś podobnego) bez użycia TWordApplication? Wolę używać surowych funkcji Ole, jeśli wiesz o co mi chodzi. Używam CreateOleObject. –

+5

Dlaczego wolisz później związany COM? Z pewnością wczesna granica jest lepsza. –

+0

Mogę zrobić i to nie jest straszny pomysł, ale czy to jedyny sposób, w jaki mogę zmienić ConnectKind? Jestem pewien, że jest kilka innych zalet wczesnego wiązania, ale nie jestem pewien, czy ich potrzebuję. –

0

Jeśli chcesz otworzyć i wydrukować dokumenty Word i nie masz nic przeciwko używaniu formatu RTF do tego, co robisz, sprawdź, TRichView.

Wygeneruje bogate dokumenty w formacie RTF, które jest jednym z formatów obsługiwanych przez słowa MS. Nie sądzę, że bezpośrednio czyta pliki .DOC, ale można przekonwertować .DOC i .DOCX na RTF, dla większości prostych plików, ale pewne zaawansowane funkcje formatowania zostaną utracone podczas konwersji.

Zaletą jest praca bez potrzeby instalowania nawet jakiejkolwiek kopii MS Word na komputerze, który będzie przetwarzał dokumenty. W przypadku produkcji paragonów i innych prostych dokumentów byłaby to najbardziej niezawodna technika; Nie używaj w ogóle programu Word.

+1

Problem z formatem plików RTF polega na tym, że nagłówki i stopki nie są obsługiwane, o ile wiem. Byłoby nierozsądnie ograniczać możliwości klienta. Z tego samego powodu nie będę w pełni migrować do OpenOffice w tym celu (jeśli jest obsługiwany). –

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; 
Powiązane problemy