2012-10-31 32 views
6

Tôi đã đọc nhiều bài viết về vấn đề này, và dường như không có kết luận nào phù hợp với câu hỏi của tôi. (Có lẽ tôi đang cố gắng để xem có bất cứ điều gì đã xuất hiện gần đây không.)Làm cách nào để làm việc với Tài liệu Word mà không sử dụng COM Automation?

Tôi có một ứng dụng từ thiện nhỏ xử lý các cam kết. Khi làm như vậy, nó cần phải làm việc với và in tài liệu.

Thing là, nếu Word đang mở ở chế độ nền, chuỗi ứng dụng sẽ treo và sẽ không phản hồi việc đóng Word, và tôi phải quay lại theo cách thủ công và gần. Chắc chắn, rằng tất cả các công trình tốt, nhưng tôi chỉ đơn giản là không thể đảm bảo rằng người dùng cuối sẽ đóng Word, ngay cả khi tôi đưa các hướng dẫn trong một hướng dẫn sử dụng.

Tôi không quá lo lắng về tốc độ, nhưng tôi đoán rằng nếu nó có thể được tăng cường, nó sẽ là một tiền thưởng ít tốt đẹp.

Có thư viện nào được phát hành cho Delphi để cho phép tôi mở, chỉnh sửa, in và lưu tài liệu không? Nếu không, có cách nào để sử dụng Tự động hóa từ theo cách sao cho nó sẽ không xung đột với một tay cầm mở khác của Word khi được mở?

+0

Bạn có thể thử Aspose trên .net. Không có gì là toàn diện cho Delphi. Có lẽ lựa chọn tốt nhất là sử dụng một cái gì đó khác với một tài liệu Word. Một số tập tin văn bản dựa. –

+0

Tôi không quan tâm đến việc viết trình bao bọc và mọi thứ, nếu điều đó thậm chí còn có thể với Aspose. Tôi đã không thực sự nhìn vào nó anyway, chỉ đơn giản bởi vì nó là. Net. Thành thật mà nói, Word cho tôi sự linh hoạt tốt nhất với các tài liệu, đặc biệt là cho một người dùng cuối. Vì vậy, không sử dụng Word không thực sự là một lựa chọn. Cảm ơn mặc dù. :) –

+0

* Chuỗi ứng dụng sẽ treo *, cuộc gọi nào chính xác? –

Trả lời

5

Nếu bạn sử dụng GetActiveOleObject, bạn sẽ nhận được phiên bản Word đang hoạt động. Bằng cách sử dụng CreateOleObject, bạn sẽ nhận được một phiên bản mới và không nên gặp rắc rối bởi các phiên bản đang chạy khác.

Trong trường hợp bạn sử dụng TWordApplication, trình bao bọc, bạn có thể đặt ConnectKind thành ckNewInstance để thực hiện việc này. Theo mặc định, TWordApplication sẽ cố gắng kết nối với một cá thể đang chạy.

+0

Có cách nào để thiết lập ConnectKind (hoặc một cái gì đó tương tự) mà không cần sử dụng TWordApplication? Tôi có xu hướng thích sử dụng các hàm Ole thô hơn, nếu bạn biết ý tôi là gì. Tôi sử dụng CreateOleObject. –

+5

Tại sao bạn thích sau này bị ràng buộc COM? Chắc chắn ràng buộc sớm là tốt hơn. –

+0

Tôi có thể làm, và nó không phải là một ý tưởng khủng khiếp, nhưng đó là cách duy nhất tôi có thể thay đổi ConnectKind? Tôi chắc rằng có một vài lợi ích khác của việc ràng buộc sớm, nhưng tôi không chắc liệu tôi có cần chúng hay không. –

0

Nếu bạn muốn mở chỉnh sửa và in tài liệu Word và bạn không ngại sử dụng định dạng RTF cho những gì bạn đang làm, hãy điều tra TRichView.

Nó sẽ tạo các tài liệu phong phú có định dạng RTF, là một trong các định dạng MS hỗ trợ. Tôi không nghĩ rằng nó trực tiếp đọc các tệp .DOC nhưng bạn có thể chuyển đổi .DOC và .DOCX thành RTF, cho hầu hết các tệp đơn giản, nhưng một số tính năng định dạng nâng cao nhất định sẽ bị mất trong chuyển đổi.

Có lợi thế khi làm việc mà không cần bất kỳ bản sao nào của MS Word được cài đặt trên máy sẽ xử lý tài liệu. Để sản xuất hóa đơn và các tài liệu đơn giản khác, đây sẽ là kỹ thuật đáng tin cậy nhất; Không sử dụng trực tiếp Word.

+1

Vấn đề với định dạng tệp RTF là đầu trang và chân trang không được hỗ trợ, cho đến khi tôi biết. Nó sẽ là không khôn ngoan để hạn chế khả năng của khách hàng. Lý do tương tự của nó là tôi sẽ không chuyển hoàn toàn sang OpenOffice cho mục đích này (trong khi nó được hỗ trợ). –

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; 
Các vấn đề liên quan