Cách làm việc với các trường trong .NET
Hướng dẫn này chỉ cách làm việc với các trường Word — DATE, IF, REF, DATABASE, và hàng chục trường khác — trong Aspose.Words FOSS cho .NET: chèn một trường và đọc kết quả của nó, cập nhật các trường sau khi chỉnh sửa bằng chương trình, cấu hình hành vi cập nhật, theo dõi các cập nhật bằng callback, và chuyển đổi hoặc xóa một trường. Aspose.Words FOSS cho .NET có sẵn qua NuGet hoặc bằng cách biên dịch từ nguồn.
Hướng dẫn từng bước
Bước 1: Lấy Thư viện
Sao chép kho và biên dịch Aspose.Words.sln trong 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, như mô tả trong Hướng dẫn cài đặt. Thêm using Aspose.Words; and using Aspose.Words.Fields; ở đầu bất kỳ tệp nào làm việc với các trường.
Bước 2: Chèn một trường và đọc kết quả của nó
DocumentBuilder.InsertField() chèn một trường mới tại con trỏ, với các overload cho phép cập nhật kết quả của trường ngay lập tức hoặc để lại cho lần cập nhật sau. Mỗi trường là một thể hiện Field gồm ba nút đánh dấu — FieldStart, Separator, và FieldEnd, được lộ ra dưới dạng Field.Start / Field.Separator / Field.End. Field.Type xác định FieldType nào mà nó đại diện, Field.Result và Field.DisplayResult chứa giá trị đã tính cuối cùng, Field.Format chứa bất kỳ công tắc định dạng nào gắn vào mã, và Field.GetFieldCode() trả về văn bản mã trường thô.
Bước 3: Cập nhật các trường sau khi chỉnh sửa bằng chương trình
Aspose.Words FOSS không tự động tính lại các trường khi tài liệu được tải hoặc lưu. Sau một chỉnh sửa mà nên thay đổi kết quả của một trường, gọi Range.UpdateFields() để tính lại mọi trường trong phạm vi đó — dùng Document.Range.UpdateFields() cho toàn bộ tài liệu — hoặc Field.Update() cho một trường duy nhất. Range.UnlinkFields() chuyển mọi trường trong phạm vi thành văn bản tĩnh trong một lần gọi, và Range.NormalizeFieldTypes() đồng bộ mã loại trường đã lưu với mã trường thực tế sau khi chỉnh sửa thủ công.
Bước 4: Cấu hình hành vi cập nhật trường với FieldOptions
Document.FieldOptions (một thể hiện FieldOptions) điều khiển cách các trường của toàn bộ tài liệu hoạt động trong quá trình cập nhật: CurrentUser (một thể hiện UserInformation — Name, Initials, Address) cung cấp danh tính mà các trường liên quan đến tác giả và tên người dùng đọc từ, DefaultDocumentAuthor cung cấp dữ liệu cho các kết quả liên quan đến tác giả, và LegacyNumberFormat / UseInvariantCultureNumberFormat / PreProcessCulture / FieldUpdateCultureSource kiểm soát định dạng số và ngày. Đối với các pipeline không có người dùng, chỉ định FieldOptions.UserPromptRespondent (một IFieldUserPromptRespondent) để các trường dựa trên lời nhắc như ASK và FILLIN không chặn chờ đầu vào tương tác, và gán một IFieldDatabaseProvider tùy chỉnh cho FieldOptions.FieldDatabaseProvider để cung cấp các hàng của trường DATABASE từ nguồn dữ liệu của bạn thay vì kết nối cơ sở dữ liệu thực.
Bước 5: Theo dõi cập nhật trường bằng Callback
Triển khai IFieldUpdatingCallback (FieldUpdating và FieldUpdated) và gán nó cho FieldOptions để chạy mã ngay trước và sau mỗi lần tính lại trường — hữu ích cho việc kiểm toán chính xác những trường nào đã thay đổi trong một công việc batch. Để báo cáo tiến độ trên một tài liệu lớn, triển khai IFieldUpdatingProgressCallback (Notify), nó nhận một FieldUpdatingProgressArgs tiết lộ TotalFieldsCount, UpdatedFieldsCount, và UpdateCompleted.
Bước 6: Chuyển đổi hoặc Xóa một Trường
Field.Unlink() thay thế trường bằng kết quả tính cuối cùng của nó dưới dạng văn bản tĩnh thông thường, loại bỏ mã trường gốc — sử dụng khi bạn muốn giá trị được nhúng vào tài liệu vĩnh viễn. Field.Remove() xóa các nút FieldStart, Separator, và FieldEnd cùng với mã và kết quả của trường, loại bỏ hoàn toàn trường. Ưu tiên hai phương pháp này hơn việc xóa trực tiếp các nút đánh dấu, vì việc tự tay xóa chỉ một phần cấu trúc của trường có thể khiến cây tài liệu không nhất quán.
Các vấn đề thường gặp và cách khắc phục
Kết quả hiển thị của một trường trở nên lỗi thời sau khi chỉnh sửa tài liệu. Aspose.Words FOSS không tự động cập nhật các trường khi tải hoặc lưu. Gọi Range.UpdateFields() or Field.Update() rõ ràng sau khi chỉnh sửa.
PAGE, NUMPAGES, hoặc số trang mục lục luôn hiển thị 0. Bố cục/trình bày trang không phải là một phần của phiên bản này, vì vậy các trường có kết quả phụ thuộc vào việc phân trang sẽ được đánh giá thành một chỗ giữ chỗ 0. Đây là hành vi mong đợi trong phiên bản này.
Một cập nhật trường hàng loạt dường như bị treo. Một trường được kích hoạt bằng lời nhắc (ASK, FILLIN) không có IFieldUserPromptRespondent được chỉ định. Gán FieldOptions.UserPromptRespondent, hoặc đặt DefaultResponse trên thể hiện trường riêng lẻ.
Cái DATABASE trường không tạo ra hàng nào. Không IFieldDatabaseProvider được gán cho FieldOptions.FieldDatabaseProvider. Thực hiện giao diện và gán nó trước khi gọi Range.UpdateFields().
Câu hỏi thường gặp
Liệu Aspose.Words FOSS có đánh giá mọi loại trường Word không?
Mô hình đối tượng Field đại diện cho mọi giá trị FieldType và cập nhật hầu hết chúng, nhưng các trường mà kết quả phụ thuộc vào bố cục trang — chẳng hạn như PAGE và NUMPAGES — được đánh giá thành một placeholder 0 vì phiên bản này không bao gồm động cơ bố cục/định dạng.
Làm sao tôi có thể đánh giá lại các trường sau khi thực hiện chỉnh sửa theo chương trình?
Gọi Range.UpdateFields() trên phạm vi bao phủ nội dung đã chỉnh sửa, hoặc Document.Range.UpdateFields() cho toàn bộ tài liệu.
Tôi có thể chuyển một trường thành văn bản thuần, tĩnh không?
Có — Field.Unlink() thay thế trường bằng kết quả đã tính toán lần cuối của nó dưới dạng văn bản thông thường.
Làm sao tôi có thể xóa hoàn toàn một trường, bao gồm cả kết quả của nó?
Gọi Field.Remove(). Nó sẽ xóa các nút FieldStart, Separator và FieldEnd cùng với mã và nội dung kết quả của trường.
Làm sao tôi có thể cung cấp dữ liệu tùy chỉnh cho trường DATABASE?
Triển khai IFieldDatabaseProvider và gán nó cho Document.FieldOptions.FieldDatabaseProvider. Việc triển khai GetQueryResult() của nó trả về một FieldDatabaseDataTable được xây dựng từ các thể hiện FieldDatabaseDataRow.