สารบัญ (TOC) เป็นส่วนสำคัญของเอกสาร Word ให้ภาพรวมของเนื้อหาของเอกสารและช่วยให้คุณนำทางไปยังส่วนที่ต้องการได้อย่างรวดเร็ว คุณอาจพบว่าตัวเองอยู่ในสถานการณ์ที่คุณจำเป็นต้องเพิ่ม แยก อัปเดต หรือลบสารบัญออกจากเอกสาร Word โดยทางโปรแกรม ด้วยเหตุนี้ บทความนี้จะสอนวิธีทำงานกับสารบัญในไฟล์ Word โดยใช้ C++
- C++ API สำหรับการทำงานกับสารบัญในเอกสาร Word
- เพิ่มสารบัญในเอกสาร Word
- แยกสารบัญออกจากเอกสาร Word
- ปรับปรุงสารบัญในเอกสาร Word
- ลบสารบัญออกจากเอกสาร Word
C++ API สำหรับการทำงานกับสารบัญในเอกสาร Word
Aspose.Words for C++ คือไลบรารี่ C++ ดั้งเดิมที่ให้คุณสร้าง อ่าน แก้ไข และแปลงเอกสาร Microsoft Word นอกจากนี้ยังรองรับการทำงานกับสารบัญในไฟล์ Word คุณสามารถติดตั้ง API ผ่าน NuGet หรือดาวน์โหลดโดยตรงจากส่วน ดาวน์โหลด
PM> Install-Package Aspose.Words.Cpp
เพิ่มสารบัญในเอกสาร Word
ต่อไปนี้เป็นขั้นตอนในการเพิ่มสารบัญในเอกสาร Word
- โหลดไฟล์ Word โดยใช้คลาส Document
- สร้างอินสแตนซ์ของคลาส DocumentBuilder โดยใช้ออบเจกต์ Document ที่สร้างไว้ก่อนหน้านี้
- แทรกสารบัญโดยใช้เมธอด DocumentBuilder->InsertTableOfContents(System::String switches)
- เติมสารบัญโดยใช้เมธอด Document->UpdateFields()
- บันทึกเอกสาร Word โดยใช้วิธี Document->Save(System::String fileName)
โค้ดตัวอย่างต่อไปนี้แสดงวิธีการเพิ่มสารบัญในเอกสาร Word โดยใช้ C++
// พาธไดเร็กทอรีต้นทางและเอาต์พุต
System::String sourceDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";
// โหลดไฟล์เวิร์ด
System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"Sample 5.docx");
// สร้างอินสแตนซ์ของคลาส DocumentBuilder
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc);
// แทรกสารบัญที่จุดเริ่มต้นของเอกสาร
builder->InsertTableOfContents(u"\\o \"1-3\" \\h \\z \\u");
// สารบัญที่แทรกใหม่จะว่างเปล่าในตอนแรก
// ต้องมีการเติมข้อมูลโดยการอัปเดตฟิลด์ในเอกสาร
doc->UpdateFields();
// เส้นทางไฟล์เอาต์พุต
System::String outputPath = outputDataDir + u"AddTOC.docx";
// บันทึกไฟล์ Word
doc->Save(outputPath);
แยกสารบัญออกจากเอกสาร Word
ต่อไปนี้เป็นขั้นตอนในการแยกสารบัญออกจากเอกสาร Word
- โหลดไฟล์ Word โดยใช้คลาส Document
- ดึงฟิลด์โดยใช้เมธอด Document->getRange()->getFields() แล้ววนซ้ำ
- ตรวจสอบว่าฟิลด์เป็นประเภท FieldType::FieldHyperlink หรือไม่
- ตรวจสอบว่าเขตข้อมูลเป็นของสารบัญหรือไม่
- ดึงและพิมพ์ข้อมูลฟิลด์
โค้ดตัวอย่างต่อไปนี้สาธิตวิธีแยกสารบัญจากเอกสาร Word โดยใช้ C++
// ไดเรกทอรีแหล่งที่มา
System::String inputDataDir = u"SourceDirectory\\";
// โหลดไฟล์เวิร์ด
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"SampleTOC.docx");
// วนรอบสนาม
for (System::SharedPtr<Field> field : System::IterateOver(doc->get_Range()->get_Fields()))
{
// รับเขตข้อมูล FieldHyperlink
if (field->get_Type() == FieldType::FieldHyperlink)
{
System::SharedPtr<FieldHyperlink> hyperlink = System::DynamicCast<FieldHyperlink>(field);
// ตรวจสอบว่าฟิลด์เป็นของ TOC หรือไม่
if (hyperlink->get_SubAddress() != nullptr && hyperlink->get_SubAddress().StartsWith(u"_Toc"))
{
System::SharedPtr<Paragraph> tocItem = System::DynamicCast<Paragraph>(field->get_FieldStart()->GetAncestor(NodeType::Paragraph));
std::cout << System::StaticCast<Node>(tocItem)->ToString(SaveFormat::Text).Trim().ToUtf8String() << std::endl;
std::cout << "------------------" << std::endl;
if (tocItem != nullptr)
{
System::SharedPtr<Bookmark> bm = doc->get_Range()->get_Bookmarks()->idx_get(hyperlink->get_SubAddress());
// รับตำแหน่งที่รายการ TOC นี้ชี้ไป
System::SharedPtr<Paragraph> pointer = System::DynamicCast<Paragraph>(bm->get_BookmarkStart()->GetAncestor(NodeType::Paragraph));
std::cout << System::StaticCast<Node>(pointer)->ToString(SaveFormat::Text).ToUtf8String() << std::endl;
}
}
}
}
ปรับปรุงสารบัญในเอกสาร Word
หากเนื้อหาของเอกสารได้รับการอัปเดตแล้ว และคุณจำเป็นต้องแสดงการเปลี่ยนแปลงเหล่านั้นในสารบัญ คุณเพียงแค่ต้องโหลดไฟล์ Word และเรียกใช้เมธอด Document->UpdateFields() วิธีนี้จะปรับปรุงสารบัญตามเนื้อหาที่แก้ไข หลังจากนี้ ให้บันทึกเอกสาร Word ที่อัปเดตแล้ว
ลบสารบัญออกจากเอกสาร Word
ต่อไปนี้เป็นขั้นตอนในการลบสารบัญออกจากเอกสาร Word
- โหลดไฟล์ Word โดยใช้คลาส Document
- ดึงข้อมูลและจัดเก็บรายการของโหนด FieldStart
- วนซ้ำโหนดจนกว่าคุณจะไปถึงโหนดประเภท NodeType::FieldEnd ที่กำหนดส่วนท้ายของสารบัญ
- ลบสารบัญโดยใช้เมธอด Node->Remove()
- บันทึกเอกสาร Word โดยใช้วิธี Document->Save(System::String fileName)
โค้ดตัวอย่างต่อไปนี้แสดงวิธีการลบสารบัญออกจากเอกสาร Word โดยใช้ C++
void RemoveTableOfContents(const System::SharedPtr<Document>& doc, int32_t index)
{
// จัดเก็บโหนด FieldStart ของฟิลด์ TOC ในเอกสารเพื่อการเข้าถึงที่รวดเร็ว
std::vector<System::SharedPtr<FieldStart>> fieldStarts;
// นี่คือรายการสำหรับจัดเก็บโหนดที่พบใน TOC ที่ระบุ พวกเขาจะถูกลบออก
// ในตอนท้ายของวิธีนี้
std::vector<System::SharedPtr<Node>> nodeList;
for (System::SharedPtr<FieldStart> start : System::IterateOver<System::SharedPtr<FieldStart>>(doc->GetChildNodes(NodeType::FieldStart, true)))
{
if (start->get_FieldType() == FieldType::FieldTOC)
{
// เพิ่ม FieldStarts ทั้งหมดซึ่งเป็นประเภท FieldTOC
fieldStarts.push_back(start);
}
}
// ตรวจสอบให้แน่ใจว่ามี TOC ที่ระบุโดยดัชนีที่ผ่านแล้ว
if (index > fieldStarts.size() - 1)
{
throw System::ArgumentOutOfRangeException(u"TOC index is out of range");
}
bool isRemoving = true;
// รับ FieldStart ของ TOC ที่ระบุ
System::SharedPtr<Node> currentNode = fieldStarts[index];
while (isRemoving)
{
// การจัดเก็บโหนดเหล่านี้และลบออกทั้งหมดในภายหลังจะปลอดภัยกว่า
nodeList.push_back(currentNode);
currentNode = currentNode->NextPreOrder(doc);
// เมื่อเราพบโหนด FieldEnd ประเภท FieldTOC เราจะรู้ว่าเราถึงจุดสิ้นสุดแล้ว
// ของ TOC ปัจจุบัน และเราหยุดไว้ตรงนี้ได้
if (currentNode->get_NodeType() == NodeType::FieldEnd)
{
System::SharedPtr<FieldEnd> fieldEnd = System::DynamicCast<FieldEnd>(currentNode);
if (fieldEnd->get_FieldType() == FieldType::FieldTOC)
{
isRemoving = false;
}
}
}
// ลบโหนดทั้งหมดที่พบใน TOC ที่ระบุ
for (System::SharedPtr<Node> node : nodeList)
{
node->Remove();
}
}
int main()
{
// พาธไดเร็กทอรีต้นทางและเอาต์พุต
System::String sourceDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";
// เปิดเอกสาร Word
System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"SampleTOC.docx");
// ลบสารบัญแรกออกจากเอกสาร
RemoveTableOfContents(doc, 0);
// เส้นทางไฟล์เอาต์พุต
System::String outputPath = outputDataDir + u"RemoveTOC.docx";
// บันทึกไฟล์ Word
doc->Save(outputPath);
}
รับใบอนุญาตฟรี
คุณสามารถลองใช้ API ได้โดยไม่มีข้อจำกัดในการประเมินโดยขอ ใบอนุญาตชั่วคราวฟรี
บทสรุป
ในบทความนี้ คุณได้เรียนรู้วิธีการทำงานกับสารบัญในเอกสาร Word โดยใช้ C++ คุณได้เห็นขั้นตอนและโค้ดตัวอย่างที่จำเป็นในการเพิ่ม แยก ปรับปรุง และลบสารบัญออกจากเอกสาร Word Aspose.Words for C++ มีคุณสมบัติเพิ่มเติมมากมายสำหรับการทำงานกับไฟล์ Word คุณสามารถสำรวจ API โดยละเอียดได้โดยไปที่ เอกสารอย่างเป็นทางการ ในกรณีที่มีคำถามใดๆ โปรดติดต่อเราได้ที่ ฟอรัมสนับสนุนฟรี