چگونه با فهرست و جدولهای Word در .NET کار کنیم
چگونه با فهرست و جداول Word در .NET کار کنیم
این راهنما نشان میدهد چگونه ساختارهای مرجع مبتنی بر فیلد که اسناد Word برای خلاصهسازی محتوای خود استفاده میکنند — فهرست مطالب، فهرست الفبایی، و جدول مراجع — را با Aspose.Words FOSS برای .NET وارد و بسازیم. هر کدام از اینها از فیلدهای نشانگر در جای دیگری از سند ترکیب میشوند: FieldToc ورودیهای مبتنی بر عنوان و علامتگذاری شده با FieldTC را ترکیب میکند، FieldIndex نشانگرهای FieldXE را ترکیب میکند، و FieldToa ارجاعات FieldTA را ترکیب میکند. هر کلاس فیلد در این خانواده از نوع پایه Field در فضای نام Aspose.Words.Fields ارث میبرد.
راهنمای گام به گام
مرحله ۱: درج فهرست مطالب
در موقعیتی که فهرست مطالب باید ظاهر شود، DocumentBuilder.InsertTableOfContents(switches) را فراخوانی کنید و یک رشته سوئیچ فیلد به سبک Word — به عنوان مثال "\o \"1-3\" \h \z \u" — را برای کنترل سطوح عنوان گنجانده شده و نحوه قالببندی نتیجه پاس دهید، همان سوئیچهایی که Word هنگام درج فهرست مطالب از طریق رابط کاربری خود مینویسد. این کار یک FieldToc را وارد میکند که همان ساختار را بهصورت مستقیم بهعنوان ویژگیها نیز نمایان میکند: HeadingLevelRange/EntryLevelRange برای سطوح طرحواره گنجاندهشده، InsertHyperlinks، PreserveTabs/PreserveLineBreaks، و BookmarkName. برای جدول شکلها بهجای فهرست مطالب، TableOfFiguresLabel یا CaptionlessTableOfFiguresLabel را بر روی همان FieldToc تنظیم کنید.
مرحله ۲: علامتگذاری ورودیهای سفارشی فهرست مطالب
همۀ ورودیهایی که فهرست مطالب (TOC) باید شاملشان باشد، لزوماً از سبک عنوان نمیآیند. یک FieldTC را در مکان خاصی وارد کنید تا بهعنوان ورودی فهرست، مستقل از سبک پاراگراف، علامتگذاری شود: FieldTC.Text متن ورودی است، EntryLevel سطح طرحبندیای است که باید در آن ظاهر شود، و OmitPageNumber شماره صفحهٔ آن ورودی را حذف میکند. وقتی سند به بیش از یک فهرست نیاز دارد — مثلاً فهرست اصلی و جدول جداگانهای از شکلها — FieldTC.TypeIdentifier را طوری تنظیم کنید که با EntryIdentifier مربوط به FieldToc که باید آن را جمعآوری کند، مطابقت داشته باشد.
مرحله 3: ساخت فهرست از ورودیهای علامتگذاریشده
هر مکان که باید در فهرست باشد را با یک FieldXE علامتگذاری کنید، Text را به متن ورودی تنظیم کنید؛ EntryType ورودیها را با استفاده از سینتکس جداشده با دو نقطه به سطوح زیرمجموعه گروهبندی میکند، و PageRangeBookmarkName یک نشانک را علامتگذاری میکند که دامنهٔ آن در فهرست بهجای یک شماره صفحه، یک بازهٔ صفحه میشود. FieldIndex تمام علامتگذاران FieldXE موجود در سند را به نتیجهٔ الفبایی ترکیب میکند — Heading را تنظیم کنید تا جداکنندههای حرف-سرصفحه (A, B, C…) را وارد کند، LetterRange برای محدود کردن فهرست به بخشی از الفبا، و RunSubentriesOnSameLine برای کنترل چیدمان زیرورودیها. PageNumberSeparator، PageRangeSeparator، SequenceSeparator و CrossReferenceSeparator نقطهگذاری بین یک ورودی و مرجع صفحهٔ آن را کنترل میکنند. سبکهای بصری فهرست داخلی Word بهصورت enum FieldIndexFormat در دسترس هستند (Template, Classic, Fancy, Modern, Bulleted, Formal, Simple).
مرحله 4: ساخت جدول مراجع از نقلقولها
هر نقلقول در متن را با یک FieldTA علامتگذاری کنید: LongCitation و ShortCitation متن نقلقول را در بر میگیرند، EntryCategory آن را زیر یک سرعنوان مانند «موارد» یا «قوانین» گروهبندی میکند، و IsBold/IsItalic قالببندی آن را کنترل میکنند. FieldToa این نقلقولها را به یک جدول ترکیب میکند — EntryCategory دستهای که باید ترکیب شود را انتخاب میکند، UseHeading تعیین میکند آیا سرعنوانهای دسته ظاهر شوند یا نه، UsePassim قاعدهٔ «پاسیم» را برای منابعی که بارها نقل شدهاند اعمال میکند، و PageRangeSeparator/PageNumberListSeparator/SequenceSeparator/EntrySeparator/RemoveEntryFormatting چیدمان را کنترل میکنند.
مرحله 5: بهروزرسانی فیلدها پس از تغییرات سند
یک فهرست مطالب، فهرست یا جدول مراجع خود بهطور خودکار وقتی محتوای اطراف تغییر میکند، بهروزرسانی نمیشود. برای محاسبهٔ دوبارهٔ نتیجهٔ آن، Update() را بر روی فیلد مشخص صدا بزنید — برای مثال FieldToc.Update() — یا FieldToc.UpdatePageNumbers() را وقتی فقط بخش شماره صفحه نیاز به تازهسازی دارد، استفاده کنید. برای تازهسازی همهٔ فیلدهای یک سند بهصورت همزمان بهجای یکییکی، Document.UpdateFields() را فراخوانی کنید. به خاطر داشته باشید که شمارههای صفحه در نتایج این فیلدها در این نسخه بهعنوان مقادیر جایگزین ارزیابی میشوند، زیرا چیدمان صفحه و صفحهبندی جزئی از آن نیست.
مرحله 6: گنجاندن ورودیها از اسناد دیگر
یک FieldRD وارد کنید تا فهرست مطالب (TOC)، فهرست شاخص یا جدول مراجع بتوانند ورودیها را از فایل دیگری هنگام کامپایل کردن دریافت کنند. FieldRD.FileName نام سند مرجع را مشخص میکند و IsPathRelative کنترل میکند که آیا مسیر نسبت به سند جاری حل شود یا خیر. برای هر سند اضافه یک FieldRD اضافه کنید و پس از آن فیلد کامپایل را بهروزرسانی کنید تا نتیجه ترکیبی شامل محتوای مرجع باشد.
مشکلات رایج و راهحلها
فهرست مطالب سرفصلهای مورد انتظار را شامل نمیشود. رشتهٔ سوئیچ فهرست مطالب (یا HeadingLevelRange) سطوح طرحوارهٔ آن را مستثنی میکند. سوئیچهای عبور دادهشده به InsertTableOfContents, یا تنظیم کنید FieldToc.HeadingLevelRange بهصورت مستقیم.
یک ورودی فهرست نمایه در جایی که انتظار میرفت ظاهر نمیشود. علامت مربوطهٔ FieldXE علامت گمشده است، یا EntryType نحو سطحپایینی با آنچه که FieldIndex انتظار دارد. FieldXE نشانهها وجود دارند و EntryType مقادیر بهصورت یکدست قالببندی شدهاند.
نتایج فیلد پس از ویرایش محتوا کهنه بهنظر میرسند. فیلد پس از ویرایش بهروز نشده بود. فراخوانی Update() روی فیلد خاص، یا Document.UpdateFields() برای تازهسازی تمام فیلدها بهصورت همزمان.
ورودیهای یک سند دیگر هنگام کامپایل گنجانده نمیشوند. نه FieldRD ارجاع به آن سند وجود دارد، یا IsPathRelative با نحوهی حل مسیر مطابقت ندارد. یک FieldRD با صحیح FileName and IsPathRelative تنظیم.
سوالات متداول
چگونه میتوانم فهرست مطالب را بهصورت برنامهنویسی وارد کنم؟
متد DocumentBuilder.InsertTableOfContents(switches) را با یک رشتهٔ سوئیچ شبیه به "\o \"1-3\" \h \z \u"، در موقعیتی که فهرست مطالب باید ظاهر شود، فراخوانی کنید.
چگونه متن را بهعنوان ورودی فهرست علامتگذاری کنم؟
یک فیلد FieldXE را در آن مکان وارد کنید و ویژگی Text آن را روی متن ورودی تنظیم کنید؛ FieldIndex تمام نشانگرهای FieldXE را در سند جمعآوری کرده و نتیجهٔ فهرست را تولید میکند.
تفاوت بین FieldTC و یک ورودی فهرست مطالب مبتنی بر عنوان چیست؟
رفتار پیشفرض فهرست مطالب در Word ورودیها را از پاراگرافها با استفاده از سبکهای عنوان جمعآوری میکند. FieldTC یک مکان دلخواه را بهعنوان ورودی فهرست مطالب علامتگذاری میکند بدون وابستگی به سبک پاراگراف، که FieldToc میتواند آن را از طریق مقادیر مطابقتدار EntryIdentifier/TypeIdentifier شامل شود.
چگونه پس از تغییرات سند، فهرست مطالب یا فهرست را بهروز کنم؟
متد Update() را روی فیلد خاص فراخوانی کنید (یا UpdatePageNumbers() را روی یک FieldToc برای فقط شمارهٔ صفحات)، یا Document.UpdateFields() را برای بهروزرسانی تمام فیلدهای سند استفاده کنید.
آیا میتوان یک TOC یا فهرست (index) را در چند سند ترکیب کرد؟
بله — یک FieldRD وارد کنید که به هر سند اضافهای از طریق FileName اشاره داشته باشد. فیلد ترکیب (FieldToc، FieldIndex یا FieldToa) پس از بهروزرسانی، ورودیهای اسناد مرجع را شامل میشود.