แทรกฟิลด์

มีหลายวิธีในการแทรกฟิลด์ลงในเอกสาร:

ในบทความนี้เราจะดูที่แต่ละวิธีในรายละเอียดมากขึ้นและวิเคราะห์วิธีการแทรกเขตข้อมูลบางอย่างโดยใช้ตัวเลือกเหล่านี้.

การใส่ฟิลด์ลงในเอกสารโดยใช้DocumentBuilder

ในAspose.WordsวิธีInsertFieldจะใช้ในการแทรกฟิลด์ใหม่ลงในเอกสาร พารามิเตอร์แรกยอมรับรหัสฟิลด์เต็มของฟิลด์ที่จะแทรก พารามิเตอร์ที่สองเป็นตัวเลือกและอนุญาตให้ฟิลด์ผลลัพธ์ของฟิลด์ที่จะตั้งค่าด้วยตนเอง อัพเดตโดยอัตโนมัติ คุณสามารถส่งผ่านโมฆะหรือว่างไปยังพารามิเตอร์นี้เพื่อแทรกฟิลด์ที่มีค่าฟิลด์ว่าง หากคุณไม่แน่ใจเกี่ยวกับไวยากรณ์รหัสฟิลด์เฉพาะ,สร้างฟิลด์ในMicrosoft Wordก่อนและสลับเพื่อดูรหัสฟิลด์.

ตัวอย่างรหัสต่อไปนี้แสดงวิธีการแทรกฟิลด์ผสานลงในเอกสารโดยใช้DocumentBuilder:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto doc = MakeObject<Document>();
auto builder = MakeObject<DocumentBuilder>(doc);
builder->InsertField(u"MERGEFIELD MyFieldName \\* MERGEFORMAT");
doc->Save(ArtifactsDir + u"WorkingWithFields.InsertField.docx");

เทคนิคเดียวกันจะใช้เพื่อแทรกฟิลด์ที่ซ้อนกันภายในฟิลด์อื่น.

ตัวอย่างรหัสต่อไปนี้แสดงวิธีการแทรกฟิลด์ที่ซ้อนกันภายในฟิลด์อื่นโดยใช้DocumentBuilder:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto doc = MakeObject<Document>();
auto builder = MakeObject<DocumentBuilder>(doc);
// Insert a few page breaks (just for testing)
for (int i = 0; i < 5; i++)
{
builder->InsertBreak(BreakType::PageBreak);
}
// Move the DocumentBuilder cursor into the primary footer.
builder->MoveToHeaderFooter(HeaderFooterType::FooterPrimary);
// We want to insert a field like this:
// { IF {PAGE} <> {NUMPAGES} "See Next Page" "Last Page" }
System::SharedPtr<Field> field = builder->InsertField(u"IF ");
builder->MoveTo(field->get_Separator());
builder->InsertField(u"PAGE");
builder->Write(u" <> ");
builder->InsertField(u"NUMPAGES");
builder->Write(u" \"See Next Page\" \"Last Page\" ");
field->Update();
doc->Save(ArtifactsDir + u"WorkingWithFields.InsertNestedFields.docx");

ระบุโลแคลที่ระดับฟิลด์

ตัวระบุภาษาเป็นตัวย่อตัวเลขสากลมาตรฐานสำหรับภาษาในประเทศหรือภูมิภาคทางภูมิศ ด้วยAspose.Wordsคุณสามารถระบุโลแคลที่ระดับฟิลด์โดยใช้คุณสมบัติLocaleIdซึ่งได้รับหรือตั้งค่าโลแคลของฟิลด์ID.

ตัวอย่างรหัสต่อไปนี้แสดงวิธีใช้ตัวเลือกนี้:

//For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto builder = MakeObject<DocumentBuilder>();
SharedPtr<Field> field = builder->InsertField(FieldType::FieldDate, true);
field->set_LocaleId(1049);
builder->get_Document()->Save(ArtifactsDir + u"WorkingWithFields.SpecifylocaleAtFieldlevel.docx");

แทรกเขตข้อมูลที่ไม่ได้พิมพ์/ว่างเปล่า

หากคุณต้องการแทรกฟิลด์ที่ไม่ได้พิมพ์/ว่างเปล่า({})เช่นเดียวกับMicrosoft Wordอนุญาต,คุณสามารถใช้วิธีการInsertFieldกับFieldType.FieldNoneพารามิเตอร์. เมื่อต้องการแทรกฟิลด์ลงในเอกสารคำคุณสามารถกดปุ่ม"ควบคุมการ+F9".

ตัวอย่างรหัสต่อไปนี้แสดงวิธีการแทรกฟิลด์ว่างลงในเอกสาร:

//For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto doc = MakeObject<Document>();
auto builder = MakeObject<DocumentBuilder>(doc);
auto field = System::DynamicCast<FieldUnknown>(builder->InsertField(FieldType::FieldNone, false));
doc->Save(ArtifactsDir + u"WorkingWithFields.InsertFieldNone.docx");

การใส่ฟิลด์ลงในเอกสารโดยใช้FieldBuilder

ทางเลือกในการแทรกฟิลด์ในAspose.WordsคือFieldBuilderคลาส จะมีอินเตอร์เฟซที่คล่องแคล่วในการระบุสวิทช์ฟิลด์และค่าอาร์กิวเมนต์เป็นข้อความโหนดห.

ตัวอย่างรหัสต่อไปนี้แสดงวิธีการแทรกฟิลด์ลงในเอกสารโดยใช้FieldBuilder:

//For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto doc = MakeObject<Document>();
auto firstName = MakeObject<FieldBuilder>(FieldType::FieldMergeField);
firstName->AddArgument("firstname");
auto lastName = MakeObject<FieldBuilder>(FieldType::FieldMergeField);
lastName->AddArgument("lastname");
auto firstnameArgumentBuilder = MakeObject<FieldArgumentBuilder>();
firstnameArgumentBuilder->AddText(u"Firstname: ");
firstnameArgumentBuilder->AddField(firstName);
auto lastnameArgumentBuilder = MakeObject<FieldArgumentBuilder>();
lastnameArgumentBuilder->AddText(u"Lastname: ");
lastnameArgumentBuilder->AddField(lastName);
// Prepare IF field with two nested MERGEFIELD fields: { IF "left expression" = "right expression" "Firstname: { MERGEFIELD firstname }" "Lastname: { MERGEFIELD lastname }"}
auto fieldBuilder = MakeObject<FieldBuilder>(FieldType::FieldIf);
fieldBuilder->AddArgument(u"left expression");
fieldBuilder->AddArgument(u"=");
fieldBuilder->AddArgument(u"right expression");
fieldBuilder->AddArgument(firstnameArgumentBuilder);
fieldBuilder->AddArgument(lastnameArgumentBuilder);
auto field = fieldBuilder->BuildAndInsert(doc->get_FirstSection()->get_Body()->AppendParagraph(String::Empty));
field->Update();
doc->Save(ArtifactsDir + u"Field.InsertFieldUsingFieldBuilder.docx");

การใส่ฟิลด์โดยใช้DOM

นอกจากนี้คุณยังสามารถแทรกประเภทต่างๆของเขตข้อมูลโดยใช้ Aspose.Wordsรูปแบบวัตถุเอกสาร(DOM). ในส่วนนี้เราจะดูตัวอย่างบางส่วน.

การแทรกฟิลด์ผสานลงในเอกสารโดยใช้DOM

ฟิลด์MERGEFIELDในเอกสารคำสามารถแสดงโดยคลาสของFieldMergeField คุณสามารถใช้FieldMergeFieldคลาสในการดำเนินการต่อไปนี้:

  • ระบุชื่อของฟิลด์ผสาน
  • ระบุการจัดรูปแบบของฟิลด์ผสาน
  • ระบุข้อความที่อยู่ระหว่างตัวคั่นฟิลด์และฟิลด์สิ้นสุดของฟิลด์ผสาน
  • ระบุข้อความที่จะแทรกหลังจากฟิลด์ผสานถ้าฟิลด์ไม่ว่างเปล่า
  • ระบุข้อความที่จะแทรกก่อนฟิลด์ผสานถ้าฟิลด์ไม่ว่าง

ตัวอย่างรหัสต่อไปนี้แสดงวิธีการเพิ่มฟิลด์MERGEโดยใช้DOMไปยังย่อหน้าในเอกสาร:

//For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto doc = MakeObject<Document>();
auto builder = MakeObject<DocumentBuilder>(doc);
auto para = System::DynamicCast<Paragraph>(doc->GetChildNodes(NodeType::Paragraph, true)->idx_get(0));
builder->MoveTo(para);
// We want to insert a merge field like this:
// { " MERGEFIELD Test1 \\b Test2 \\f Test3 \\m \\v" }
auto field = System::DynamicCast<FieldMergeField>(builder->InsertField(FieldType::FieldMergeField, false));
// { " MERGEFIELD Test1" }
field->set_FieldName(u"Test1");
// { " MERGEFIELD Test1 \\b Test2" }
field->set_TextBefore(u"Test2");
// { " MERGEFIELD Test1 \\b Test2 \\f Test3 }
field->set_TextAfter(u"Test3");
// { " MERGEFIELD Test1 \\b Test2 \\f Test3 \\m" }
field->set_IsMapped(true);
// { " MERGEFIELD Test1 \\b Test2 \\f Test3 \\m \\v" }
field->set_IsVerticalFormatting(true);
field->Update();
doc->Save(ArtifactsDir + u"WorkingWithFields.InsertMergeFieldUsingDOM.docx");

การแทรกฟิลด์บล็อกที่อยู่Mail Mergeลงในเอกสารโดยใช้DOM

ฟิลด์ADDRESSBLOCKถูกใช้เพื่อแทรกบล็อกที่อยู่mail mergeในเอกสารคำ ฟิลด์ADDRESSBLOCKในเอกสารคำสามารถแสดงโดยFieldAddressBlockชั้น คุณสามารถใช้FieldAddressBlockคลาสในการดำเนินการต่อไปนี้:

  • ระบุว่าจะใส่ชื่อของประเทศ/ภูมิภาคในฟิลด์หรือไม่
  • ระบุว่าจะจัดรูปแบบที่อยู่ตามประเทศ/ภูมิภาคของผู้รับตามที่กำหนดโดยPOST*CODE(สหภาพไปรษณีย์สากล 2006)
  • ระบุชื่อประเทศ/ภูมิภาคที่ยกเว้น
  • ระบุชื่อและรูปแบบที่อยู่
  • ระบุภาษาIDที่ใช้ในการจัดรูปแบบที่อยู่

ตัวอย่างรหัสต่อไปนี้แสดงวิธีการเพิ่มฟิลด์Mail MergeADDRESSBLOCKโดยใช้DOMไปยังย่อหน้าในเอกสาร:

//For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto doc = MakeObject<Document>();
auto builder = MakeObject<DocumentBuilder>(doc);
auto para = System::DynamicCast<Paragraph>(doc->GetChildNodes(NodeType::Paragraph, true)->idx_get(0));
builder->MoveTo(para);
// We want to insert a mail merge address block like this:
// { ADDRESSBLOCK \\c 1 \\d \\e Test2 \\f Test3 \\l \"Test 4\" }
auto field = System::DynamicCast<FieldAddressBlock>(builder->InsertField(FieldType::FieldAddressBlock, false));
// { ADDRESSBLOCK \\c 1" }
field->set_IncludeCountryOrRegionName(u"1");
// { ADDRESSBLOCK \\c 1 \\d" }
field->set_FormatAddressOnCountryOrRegion(true);
// { ADDRESSBLOCK \\c 1 \\d \\e Test2 }
field->set_ExcludedCountryOrRegionName(u"Test2");
// { ADDRESSBLOCK \\c 1 \\d \\e Test2 \\f Test3 }
field->set_NameAndAddressFormat(u"Test3");
// { ADDRESSBLOCK \\c 1 \\d \\e Test2 \\f Test3 \\l \"Test 4\" }
field->set_LanguageId(u"Test 4");
field->Update();
doc->Save(ArtifactsDir + u"WorkingWithFields.InsertMailMergeAddressBlockFieldUsingDOM.docx");

การใส่ฟิลด์ล่วงหน้าลงในเอกสารโดยไม่ใช้DocumentBuilder

ฟิลด์ADVANCEใช้เพื่อชดเชยข้อความที่ตามมาภายในบรรทัดไปทางซ้ายขวาขึ้นหรือลง ฟิลด์ADVANCEในเอกสารคำสามารถแสดงโดยคลาสของFieldAdvance คุณสามารถใช้FieldAdvanceคลาสในการดำเนินการดังต่อไปนี้:

  • ระบุจำนวนจุดที่ควรย้ายข้อความตามฟิลด์ในแนวตั้งจากขอบด้านบนของหน้า
  • ระบุจำนวนจุดที่ควรย้ายข้อความตามฟิลด์ในแนวนอนจากขอบด้านซ้ายของคอลัมน์เฟรมหรื
  • ระบุจำนวนจุดที่ข้อความตามฟิลด์ควรย้ายไปทางซ้ายขวาขึ้นหรือลง

ตัวอย่างรหัสต่อไปนี้แสดงวิธีการเพิ่มฟิลด์ADVANCEโดยใช้DOMไปยังย่อหน้าในเอกสาร:

//For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto doc = MakeObject<Document>();
auto para = System::DynamicCast<Paragraph>(doc->GetChildNodes(NodeType::Paragraph, true)->idx_get(0));
// We want to insert an Advance field like this:
// { ADVANCE \\d 10 \\l 10 \\r -3.3 \\u 0 \\x 100 \\y 100 }
auto field = System::DynamicCast<FieldAdvance>(para->AppendField(FieldType::FieldAdvance, false));
// { ADVANCE \\d 10 " }
field->set_DownOffset(u"10");
// { ADVANCE \\d 10 \\l 10 }
field->set_LeftOffset(u"10");
// { ADVANCE \\d 10 \\l 10 \\r -3.3 }
field->set_RightOffset(u"-3.3");
// { ADVANCE \\d 10 \\l 10 \\r -3.3 \\u 0 }
field->set_UpOffset(u"0");
// { ADVANCE \\d 10 \\l 10 \\r -3.3 \\u 0 \\x 100 }
field->set_HorizontalPosition(u"100");
// { ADVANCE \\d 10 \\l 10 \\r -3.3 \\u 0 \\x 100 \\y 100 }
field->set_VerticalPosition(u"100");
field->Update();
doc->Save(ArtifactsDir + u"WorkingWithFields.InsertAdvanceFieldWithOutDocumentBuilder.docx");

การแทรกฟิลด์ASKลงในเอกสารโดยไม่ใช้DocumentBuilder

ฟิลด์ASKถูกใช้เพื่อแจ้งให้ผู้ใช้กำหนดข้อความให้กับบุ๊กมาร์กในเอกสารคำ ฟิลด์ASKในเอกสารคำสามารถแสดงโดยFieldAskชั้น คุณสามารถใช้FieldAskคลาสในการดำเนินการต่อไปนี้:

  • ระบุชื่อของบุ๊กมาร์ก
  • ระบุการตอบสนองของผู้ใช้ดีฟอลต์(ค่าเริ่มต้นที่มีอยู่ในหน้าต่างพร้อมท์)
  • ระบุว่าควรได้รับคำตอบของผู้ใช้หนึ่งครั้งต่อการดำเนินการmail merge
  • ระบุข้อความพร้อมท์(ชื่อของหน้าต่างพร้อมท์)

ตัวอย่างรหัสต่อไปนี้แสดงวิธีการเพิ่มฟิลด์ASKโดยใช้DOMไปยังย่อหน้าในเอกสาร:

//For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto doc = MakeObject<Document>();
auto para = System::DynamicCast<Paragraph>(doc->GetChildNodes(NodeType::Paragraph, true)->idx_get(0));
// We want to insert an Ask field like this:
// { ASK \"Test 1\" Test2 \\d Test3 \\o }
auto field = System::DynamicCast<FieldAsk>(para->AppendField(FieldType::FieldAsk, false));
// { ASK \"Test 1\" " }
field->set_BookmarkName(u"Test 1");
// { ASK \"Test 1\" Test2 }
field->set_PromptText(u"Test2");
// { ASK \"Test 1\" Test2 \\d Test3 }
field->set_DefaultResponse(u"Test3");
// { ASK \"Test 1\" Test2 \\d Test3 \\o }
field->set_PromptOnceOnMailMerge(true);
field->Update();
doc->Save(ArtifactsDir + u"WorkingWithFields.InsertASKFieldWithOutDocumentBuilder.docx");

การแทรกฟิลด์AUTHORลงในเอกสารโดยไม่ใช้DocumentBuilder

ฟิลด์AUTHORใช้เพื่อระบุชื่อของผู้เขียนของเอกสารจากคุณสมบัติDocument ฟิลด์AUTHORในเอกสารคำสามารถแสดงโดยFieldAuthorชั้น คุณสามารถใช้FieldAuthorคลาสในการดำเนินการต่อไปนี้:

  • ระบุชื่อผู้เขียนเอกสาร

ตัวอย่างรหัสต่อไปนี้แสดงวิธีการเพิ่มฟิลด์AUTHORโดยใช้DOMไปยังย่อหน้าในเอกสาร:

//For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto doc = MakeObject<Document>();
auto para = System::DynamicCast<Paragraph>(doc->GetChildNodes(NodeType::Paragraph, true)->idx_get(0));
// We want to insert an AUTHOR field like this:
// { AUTHOR Test1 }
auto field = System::DynamicCast<FieldAuthor>(para->AppendField(FieldType::FieldAuthor, false));
// { AUTHOR Test1 }
field->set_AuthorName(u"Test1");
field->Update();
doc->Save(ArtifactsDir + u"WorkingWithFields.InsertAuthorField.docx");

การแทรกฟิลด์INCLUDETEXTลงในเอกสารโดยไม่ใช้DocumentBuilder

ฟิลด์INCLUDETEXTแทรกข้อความและกราฟิกที่มีอยู่ในเอกสารที่มีชื่อในรหัสฟิลด์ คุณสามารถแทรกเอกสารทั้งหมดหรือบางส่วนของเอกสารที่อ้างถึงโดยบุ๊กมาร์ก ฟิลด์นี้ในเอกสารคำแสดงด้วยINCLUDETEXT คุณสามารถใช้คลาสFieldIncludeTextเพื่อดำเนินการดังต่อไปนี้:

  • ระบุชื่อของบุ๊กมาร์กของเอกสารที่รวมอยู่
  • ระบุตำแหน่งของเอกสาร

ตัวอย่างรหัสต่อไปนี้แสดงวิธีการเพิ่มฟิลด์INCLUDETEXTโดยใช้DOMไปยังย่อหน้าในเอกสาร:

//For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto doc = MakeObject<Document>();
auto para = MakeObject<Paragraph>(doc);
// We want to insert an INCLUDETEXT field like this:
// { INCLUDETEXT "file path" }
auto fieldIncludeText = System::DynamicCast<FieldIncludeText>(para->AppendField(FieldType::FieldIncludeText, false));
fieldIncludeText->set_BookmarkName(u"bookmark");
fieldIncludeText->set_SourceFullName(MyDir + u"IncludeText.docx");
doc->get_FirstSection()->get_Body()->AppendChild(para);
fieldIncludeText->Update();
doc->Save(ArtifactsDir + u"WorkingWithFields.InsertIncludeFieldWithoutDocumentBuilder.docx");

การแทรกฟิลด์TOAลงในเอกสารโดยไม่ใช้DocumentBuilder

ฟิลด์TOA(Table of Authorities)สร้างและแทรกตารางของเจ้าหน้าที่ ฟิลด์TOAรวบรวมรายการที่ทำเครื่องหมายด้วยฟิลด์TA(Table of Authorities Entry) Microsoftคำสำนักงานแทรกฟิลด์TOAเมื่อคุณคลิกInsert Table of Authoritiesในกลุ่มTable of Authoritiesบนแท็บReferences เมื่อคุณดูฟิลด์TOAในเอกสารของคุณไวยากรณ์มีลักษณะเช่นนี้:

{ TOA [Switches ] }

ตัวอย่างรหัสต่อไปนี้แสดงวิธีการเพิ่มฟิลด์TOAโดยใช้DOMไปยังย่อหน้าในเอกสาร:

//For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto doc = MakeObject<Document>();
auto para = MakeObject<Paragraph>(doc);
// We want to insert TA and TOA fields like this:
// { TA \c 1 \l "Value 0" }
// { TOA \c 1 }
auto fieldTA = System::DynamicCast<FieldTA>(para->AppendField(FieldType::FieldTOAEntry, false));
fieldTA->set_EntryCategory(u"1");
fieldTA->set_LongCitation(u"Value 0");
doc->get_FirstSection()->get_Body()->AppendChild(para);
para = MakeObject<Paragraph>(doc);
auto fieldToa = System::DynamicCast<FieldToa>(para->AppendField(FieldType::FieldTOA, false));
fieldToa->set_EntryCategory(u"1");
doc->get_FirstSection()->get_Body()->AppendChild(para);
fieldToa->Update();
doc->Save(ArtifactsDir + u"WorkingWithFields.InsertTOAFieldWithoutDocumentBuilder.docx");
/