Cách làm việc với tài liệu trong .NET
Hướng dẫn này cho thấy cách làm việc với mô hình đối tượng Document trong Aspose.Words FOSS cho .NET: tạo tài liệu trống, tải tài liệu hiện có một cách an toàn, duyệt cấu trúc phần/đoạn, kết hợp các tài liệu, và áp dụng hạn chế chỉnh sửa. Aspose.Words FOSS cho .NET có sẵn qua NuGet hoặc bằng cách biên dịch từ mã nguồn.
Hướng dẫn từng bước
Bước 1: Lấy Thư viện
Sao chép kho lưu trữ và biên dịch Aspose.Words.sln ở cấu hình Release, sau đó thêm tham chiếu dự án tới Aspose.Words.csproj từ dự án .NET của bạn. Các lệnh sao chép và biên dịch đầy đủ có trong Hướng dẫn cài đặt. Sau khi đã tham chiếu, thêm using Aspose.Words; ở đầu bất kỳ tệp nào làm việc với tài liệu.
Bước 2: Tạo hoặc tải tài liệu
Gọi new Document() để tạo tài liệu trống, hoặc truyền đường dẫn tệp hoặc Stream vào hàm khởi tạo Document(fileName) / Document(stream) để mở một tài liệu hiện có. Một overload chấp nhận đối số LoadOptions cho phép bạn cung cấp mật khẩu cho tệp được mã hóa. Trước khi tải một tệp mà định dạng của nó bạn chưa tin cậy, hãy gọi FileFormatUtil.DetectFileFormat(fileName) — nó trả về một FileFormatInfo báo cáo LoadFormat được phát hiện và liệu tệp IsEncrypted, HasDigitalSignature hoặc HasMacros, để bạn có thể từ chối đầu vào không mong muốn trước khi Document cố gắng phân tích nó.
Bước 3: Tạo nội dung với DocumentBuilder
DocumentBuilder bao bọc một Document với một con trỏ mà bạn di chuyển qua cây khi chèn nội dung. Write(text) và Writeln(text) chèn văn bản tại con trỏ, và InsertParagraph() bắt đầu một đoạn mới. Định dạng được đặt trên các thuộc tính Font, ParagraphFormat, ListFormat, và PageSetup của builder sẽ áp dụng cho bất kỳ nội dung nào bạn viết tiếp theo. Di chuyển lại con trỏ bằng MoveToDocumentStart(), MoveToDocumentEnd(), MoveToSection(sectionIndex), MoveToBookmark(bookmarkName), hoặc MoveToParagraph(paragraphIndex, characterIndex), và đọc CurrentNode / CurrentParagraph / CurrentSection để xác nhận vị trí của builder.
Bước 4: Kiểm tra cấu trúc Phần và Thân
Một Document hiển thị một SectionCollection thông qua Document.Sections (cộng với FirstSection / LastSection). Mỗi Section có đúng một Body, nội dung chính của nó có thể truy cập qua Body.Paragraphs (một ParagraphCollection) và Body.Tables. Để đọc hoặc tìm kiếm văn bản mà không phải duyệt các nút thủ công, sử dụng Range có sẵn trên Document, Section, Paragraph, và các nút khác — Range.Text trả về văn bản thuần, và Range.Replace(pattern, replacement) thực hiện tìm-thay trong phạm vi chỉ của đoạn đó.
Bước 5: Kết hợp Hai Tài liệu
Để sao chép toàn bộ một tài liệu, gọi Document.Clone(). Để đưa nội dung cụ thể từ một thể hiện Document vào một thể hiện khác, gọi ImportNode(srcNode, isImportChildren) trên tài liệu đích, hoặc gọi Document.AppendDocument(srcDoc, importFormatMode) để nối mỗi phần của tài liệu nguồn vào cuối tài liệu hiện tại. DocumentBuilder.InsertDocument(srcDoc, importFormatMode) thực hiện cùng thao tác nhưng chèn tại con trỏ của builder thay vì ở cuối. Trong cả ba trường hợp, hãy chọn giá trị ImportFormatMode — KeepSourceFormatting, UseDestinationStyles, hoặc KeepDifferentStyles — một cách có chủ ý, vì nó quyết định phong cách của tài liệu nào sẽ thắng khi hai tài liệu xung đột.
Bước 6: Áp dụng Hạn chế Chỉnh sửa
Gọi Document.Protect(type, password) với một giá trị ProtectionType — ReadOnly, AllowOnlyComments, AllowOnlyRevisions, hoặc AllowOnlyFormFields — để hạn chế các chỉnh sửa mà Word chấp nhận cho tài liệu. Unprotect() (có hoặc không có mật khẩu tương ứng) sẽ gỡ bỏ hạn chế. Điều này chỉ ảnh hưởng đến việc chỉnh sửa trong Word; nó không mã hoá tệp đã lưu. Để yêu cầu mật khẩu chỉ để mở tệp, đặt OoxmlSaveOptions.Password khi bạn lưu.
Các vấn đề thường gặp và cách khắc phục
Document(fileName) báo lỗi cho một tệp mở bình thường trong Word. Định dạng của tệp không được bộ tải của phiên bản này hỗ trợ. Gọi FileFormatUtil.DetectFileFormat(fileName) đầu tiên và kiểm tra kết quả trả về LoadFormat trước khi cố gắng tải.
Nội dung sao chép giữa các tài liệu sẽ nhận phông chữ hoặc kiểu dáng sai. Cái ImportFormatMode được truyền tới AppendDocument or InsertDocument không khớp với những gì bạn mong đợi. Truyền KeepSourceFormatting or UseDestinationStyles một cách rõ ràng thay vì dựa vào mặc định.
Unprotect() dường như không có tác dụng. Hoặc tài liệu không được bảo vệ bằng mật khẩu (gọi Unprotect() không có đối số), hoặc mật khẩu đã cung cấp không khớp với mật khẩu Protect() được gọi kèm theo.
Định dạng được áp dụng thông qua DocumentBuilder không hiển thị ở vị trí mong đợi. Định dạng cấp Builder (Font, ParagraphFormat) chỉ áp dụng cho nội dung được viết after được thiết lập. Di chuyển con trỏ và đặt định dạng trước khi gọi Write/Writeln, không phải sau.
Câu hỏi thường gặp
Làm thế nào để tạo một tài liệu Word mới, trống?
Gọi new Document(). Bao quanh nó bằng một DocumentBuilder để bắt đầu chèn nội dung ngay lập tức.
Sự khác nhau giữa Document.Clone() và ImportNode là gì?
Clone() sao chép toàn bộ tài liệu vào một thể hiện Document mới. ImportNode(srcNode, isImportChildren) đưa một nút duy nhất — và tùy chọn các nút con của nó — từ cây của một tài liệu sang tài liệu khác, đây là cách bạn dùng để kết hợp nội dung cụ thể thay vì toàn bộ tài liệu.
Làm sao tôi có thể kiểm tra định dạng của tệp một cách an toàn trước khi tải nó?
Gọi FileFormatUtil.DetectFileFormat(fileName) (hoặc phiên bản Stream) và kiểm tra các thuộc tính LoadFormat, IsEncrypted, HasDigitalSignature, và HasMacros của FileFormatInfo trả về trước khi truyền tệp cho Document.
Làm sao tôi có thể đọc chỉ các đoạn văn bên trong phần thân của tài liệu?
Sử dụng bộ sưu tập Body.Paragraphs trên Body của phần, hoặc Body.GetChildNodes(nodeType, isDeep) cho các loại nút khác.
Liệu Document.Protect có mã hoá tệp đã lưu không?
Không — đây là một hạn chế chỉnh sửa mà Word áp dụng khi tệp được mở. Để yêu cầu mật khẩu mở tệp, đặt OoxmlSaveOptions.Password khi gọi Document.Save.