Як працювати з полями у .NET
У цьому посібнику показано, як працювати з полями Word — DATE, IF, REF, DATABASE та безліччю інших — у Aspose.Words FOSS для .NET: вставка поля та читання його результату, оновлення полів після програмного редагування, налаштування поведінки оновлення, відстеження оновлень за допомогою зворотного виклику та перетворення або видалення поля. Aspose.Words FOSS для .NET доступний через NuGet або шляхом збірки з вихідного коду.
Покроковий посібник
Крок 1: Отримати бібліотеку
Клонувати репозиторій і зібрати Aspose.Words.sln у конфігурації Release, потім додайте посилання на проект до Aspose.Words.csproj з вашого власного проекту .NET, як описано в Посібнику з інсталяції. Додайте using Aspose.Words; and using Aspose.Words.Fields; на початку будь-якого файлу, який працює з полями.
Крок 2: Вставити поле та прочитати його результат
DocumentBuilder.InsertField() вставляє нове поле в позицію курсора, з перевантаженнями, які або одразу оновлюють результат поля, або залишають його для подальшого проходу оновлення. Кожне поле є екземпляром Field, що складається з трьох маркерних вузлів — FieldStart, Separator та FieldEnd, доступних як Field.Start / Field.Separator / Field.End. Field.Type визначає, який FieldType він представляє, Field.Result і Field.DisplayResult містять останнє обчислене значення, Field.Format містить будь-які перемикачі формату, прикріплені до коду, а Field.GetFieldCode() повертає необроблений текст коду поля.
Крок 3: Оновити поля після програмного редагування
Aspose.Words FOSS не перераховує поля під час завантаження або збереження документа. Після редагування, яке має змінити результат поля, викличте Range.UpdateFields(), щоб перерахувати кожне поле в цьому діапазоні — використайте Document.Range.UpdateFields() для всього документа — або Field.Update() для окремого поля. Range.UnlinkFields() перетворює кожне поле в діапазоні у статичний текст одним викликом, а Range.NormalizeFieldTypes() приводить тип коду збереженого поля у відповідність до його фактичного коду після ручного редагування.
Крок 4: Налаштувати поведінку оновлення полів за допомогою FieldOptions
Document.FieldOptions (екземпляр FieldOptions) керує тим, як поля всього документа поводяться під час оновлення: CurrentUser (екземпляр UserInformation — Name, Initials, Address) надає ідентичність, з якої читаються поля, пов’язані з іменем автора та користувача, DefaultDocumentAuthor заповнює результати, пов’язані з автором, а LegacyNumberFormat / UseInvariantCultureNumberFormat / PreProcessCulture / FieldUpdateCultureSource керують форматуванням чисел і дат. Для безконтрольних конвеєрів призначте FieldOptions.UserPromptRespondent ( IFieldUserPromptRespondent), щоб поля, що вимагають підказок, такі як ASK і FILLIN, не блокувалися в очікуванні інтерактивного вводу, і задайте власний IFieldDatabaseProvider для FieldOptions.FieldDatabaseProvider, щоб забезпечити рядки поля DATABASE зі свого джерела даних замість реального підключення до бази даних.
Крок 5: Відстежувати оновлення полів за допомогою зворотного виклику
Реалізуйте IFieldUpdatingCallback (FieldUpdating і FieldUpdated) і призначте його FieldOptions, щоб виконувати код безпосередньо перед і після кожного перерахунку поля — це корисно для аудиту того, які саме поля змінилися у пакетному завданні. Для звітування про прогрес у великому документі реалізуйте IFieldUpdatingProgressCallback (Notify), який отримує FieldUpdatingProgressArgs, що розкриває TotalFieldsCount, UpdatedFieldsCount і UpdateCompleted.
Крок 6: Перетворити або видалити поле
Field.Unlink() замінює поле його останнім обчисленим результатом у вигляді звичайного статичного тексту, відкидаючи підлягаючий код поля — використовуйте його, коли потрібно постійно закріпити значення в документі. Field.Remove() видаляє вузли FieldStart, Separator і FieldEnd разом із кодом та результатом поля, повністю видаляючи поле. Надавайте перевагу цим двом методам замість прямого видалення маркерних вузлів, оскільки ручне видалення лише частини структури поля може залишити дерево документа несумісним.
Типові проблеми та їх вирішення
Відображений результат поля застаріває після редагування документа. Aspose.Words FOSS не оновлює поля автоматично під час завантаження або збереження. Викличте Range.UpdateFields() or Field.Update() явно після редагування.
PAGE, NUMPAGES, або номер сторінки змісту завжди відображається 0. Розмітка/візуалізація сторінки не входить до цього випуску, тому поля, результат яких залежить від пагінації, оцінюються як заповнювач 0. Це очікувана поведінка у цьому випуску.
Здається, пакетне оновлення полів зависає. Поле, кероване підказкою (ASK, FILLIN) не має IFieldUserPromptRespondent призначено. Призначити FieldOptions.UserPromptRespondent, або встановити DefaultResponse на індивідуальному екземплярі поля.
Цей DATABASE поле не повертає рядків. Немає IFieldDatabaseProvider призначено до FieldOptions.FieldDatabaseProvider. Реалізуйте інтерфейс і призначте його перед викликом Range.UpdateFields().
Часті питання
Чи оцінює Aspose.Words FOSS кожен тип поля Word?
Модель об’єктів Field представляє кожне значення FieldType і оновлює більшість з них, але поля, результат яких залежить від макету сторінки — такі як PAGE і NUMPAGES — оцінюються як заповнювач 0, оскільки ця версія не включає движок макетування/рендерингу.
Як переоцінити поля після програмного редагування?
Викличте Range.UpdateFields() на діапазоні, що охоплює відредагований вміст, або Document.Range.UpdateFields() для всього документа.
Чи можу я перетворити поле на простий, статичний текст?
Так — Field.Unlink() замінює поле його останнім обчисленим результатом у вигляді звичайного тексту.
Як повністю видалити поле, включаючи його результат?
Викличте Field.Remove(). Він видаляє вузли FieldStart, Separator та FieldEnd разом з кодом поля та вмістом результату.
Як надати власні дані полю DATABASE?
Реалізуйте IFieldDatabaseProvider і присвойте його Document.FieldOptions.FieldDatabaseProvider. Його GetQueryResult() реалізація повертає FieldDatabaseDataTable, побудований з FieldDatabaseDataRow екземплярів.