จัดการฟิลด์ข้อความในงานนำเสนอ PowerPoint บน Android
Overview
ย่อหน้าข้อความประกอบด้วยส่วนต่าง ๆ ส่วนปกติของ IPortion มีข้อความตามตัวอักษร; ส่วนฟิลด์จะมี IField ที่ประเภทของมันระบุค่าที่อัปเดตอัตโนมัติ เช่นหมายเลขสไลด์หรือวันที่ ส่วนสองส่วนอาจแสดงอักขระเดียวกันโดยที่เพียงส่วนหนึ่งเท่านั้นที่มีฟิลด์
ใช้ IPortion.getField เพื่อแยกแยะ: ค่าจะเป็น null สำหรับข้อความปกติ. IPortion.addField จะเปลี่ยนส่วนที่มีอยู่ให้เป็นฟิลด์. เก็บป้ายกำกับและค่าที่เปลี่ยนแปลงได้ไว้ในส่วนแยกกันเพื่อให้การแปลงค่าจะไม่ทำให้ป้ายกำกับถูกแทนที่ด้วย.
คู่มือฉบับนี้ครอบคลุมฟิลด์ภายในข้อความ, การจัดรูปแบบของฟิลด์, และการบันทึกฟิลด์ในรูปแบบ PPTX และ PPT. สำหรับกรอบข้อความและย่อหน้า, ดู Manage Text.
Create a Slide Number Field
ตัวอย่างสมบูรณ์ต่อไปนี้สร้างกล่องข้อความที่มีป้ายกำกับตัวอักษร Slide ตามด้วยหมายเลขที่อัปเดตอัตโนมัติ. ตัวอย่างกำหนดขนาด, ความหนา, และสีของหมายเลขก่อนเพิ่มฟิลด์, แล้วเปิดการนำเสนอที่บันทึกไว้ใหม่และตรวจสอบประเภทฟิลด์, ข้อความ, และการจัดรูปแบบ. ไม่ต้องใช้ไฟล์อินพุต.
import android.graphics.Color;
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 40, 40, 240, 50);
shape.addTextFrame("Slide ");
IParagraph paragraph = shape.getTextFrame().getParagraphs().get_Item(0);
Portion numberPortion = new Portion();
int numberColor = Color.rgb(0, 0, 139);
numberPortion.getPortionFormat().setFontHeight(24);
numberPortion.getPortionFormat().setFontBold(NullableBool.True);
numberPortion.getPortionFormat().getFillFormat().setFillType(FillType.Solid);
numberPortion.getPortionFormat().getFillFormat().getSolidFillColor().setColor(numberColor);
paragraph.getPortions().add(numberPortion);
numberPortion.addField(FieldType.getSlideNumber());
presentation.save("slide_number.pptx", SaveFormat.Pptx);
Presentation reopened = new Presentation("slide_number.pptx");
try {
IAutoShape savedShape = (IAutoShape) reopened.getSlides().get_Item(0).getShapes().get_Item(0);
IPortion savedNumber = savedShape.getTextFrame().getParagraphs().get_Item(0).getPortions().get_Item(1);
IField savedField = savedNumber.getField();
boolean hasNumberField = savedField != null && FieldType.getSlideNumber().getInternalString().equals(savedField.getType().getInternalString());
IPortionFormat format = savedNumber.getPortionFormat();
boolean formattingPreserved = format.getFontHeight() == 24 && format.getFontBold() == NullableBool.True;
formattingPreserved &= format.getFillFormat().getSolidFillColor().getColor() == numberColor;
System.out.println("Text: " + savedShape.getTextFrame().getText());
System.out.println("Slide number field: " + hasNumberField);
System.out.println("Formatting preserved: " + formattingPreserved);
} finally {
reopened.dispose();
}
} finally {
presentation.dispose();
}
การนำเสนอใหม่เริ่มต้นด้วยหมายเลขสไลด์ที่ 1, ดังนั้นข้อความจะเป็น Slide 1, และการตรวจสอบทั้งสองกรณีจะพิมพ์ true. หมายเลขยังคงเป็นฟิลด์หลังจากเปิดใหม่; มันไม่ใช่ตัวอักษร 1. การแปลงประเภทและดัชนีในการตรวจสอบอ้างอิงถึงรูปร่างและส่วนที่สร้างโดยตัวอย่างนี้.
Choose a Field Type
FieldType ทำการ 구현 IFieldType และมีเมธอดต่อไปนี้สำหรับรับค่าที่กำหนดไว้ล่วงหน้า. ส่งค่าที่เหมาะสมไปยัง addField.
| Method | Purpose |
|---|---|
| getSlideNumber | หมายเลขสไลด์ปัจจุบัน |
| getDateTime | วันที่/เวลาในรูปแบบเริ่มต้นของแอปพลิเคชันที่ทำการเรนเดอร์ |
| getDateTime1–getDateTime9 | รูปแบบวันที่หรือวันที่/เวลาแบบผสมที่กำหนดไว้ล่วงหน้า |
| getDateTime10–getDateTime13 | รูปแบบเวลาแบบกำหนดไว้ล่วงหน้า, มีตัวเลือกสำหรับวินาทีและนาฬิกาแบบ 12‑ชั่วโมง |
| getHeader | ฟิลด์ส่วนหัว; ดูข้อจำกัดของตัวแทนและรูปแบบด้านล่าง |
| getFooter | ฟิลด์ส่วนท้าย |
ตัวอย่างเช่น, getDateTime3 แทนวัน, ชื่อเดือนเต็ม, และปีในภาษาอังกฤษ. สิ่งเหล่านี้เป็นรูปแบบฟิลด์ที่กำหนดไว้ล่วงหน้า, ไม่ใช่สตริงรูปแบบวันที่ของ Java. ภาษาที่ตั้งค่าด้วย setLanguageId และแอปพลิเคชันที่ประมวลผลการนำเสนออาจมีผลต่อผลลัพธ์ที่แสดง.
Create a Field from an Internal String
การโอเวอร์โหลดสตริงของ addField ยอมรับตัวระบุฟิลด์ภายใน. ใช้เมื่อจำเป็นต้องเก็บตัวระบุที่มาจากแอปพลิเคชันอื่นที่ไม่มีค่าที่กำหนดไว้ล่วงหน้า. คุณยังสามารถสร้าง FieldType จากตัวระบุได้. IFieldType.getInternalString จะเปิดเผยตัวระบุนั้นเพื่อการตรวจสอบ.
ตัวอย่างนี้จัดเก็บฟิลด์เฉพาะแอป custom-report-id พร้อมข้อความสำรอง Report-042. ตัวระบุจะไม่ทำการคำนวณ: Aspose.Slides ไม่ได้สร้างรหัสรายงานสำหรับประเภทที่ไม่รู้จัก. แอปที่เข้าใจตัวระบุนั้นต้องให้ความหมายและอัปเดตค่าของมัน.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
IAutoShape shape = presentation.getSlides().get_Item(0).getShapes().addAutoShape(ShapeType.Rectangle, 40, 40, 300, 50);
shape.addTextFrame("Report-042");
IPortion portion = shape.getTextFrame().getParagraphs().get_Item(0).getPortions().get_Item(0);
portion.addField("custom-report-id");
presentation.save("custom_field.pptx", SaveFormat.Pptx);
Presentation reopened = new Presentation("custom_field.pptx");
try {
IAutoShape savedShape = (IAutoShape) reopened.getSlides().get_Item(0).getShapes().get_Item(0);
IPortion savedPortion = savedShape.getTextFrame().getParagraphs().get_Item(0).getPortions().get_Item(0);
IField savedField = savedPortion.getField();
String typeName = savedField == null ? "ordinary text" : savedField.getType().getInternalString();
System.out.println("Type: " + typeName);
System.out.println("Text: " + savedPortion.getText());
} finally {
reopened.dispose();
}
} finally {
presentation.dispose();
}
หลังจากการเดินทางแบบรอบ PPTX, ประเภทจะเป็น custom-report-id และข้อความจะเป็น Report-042. การส่งสตริงเช่น yyyy-MM-dd จะตั้งชื่อประเภทฟิลด์; มันจะไม่กำหนดรูปแบบวันที่แบบกำหนดเอง. หากต้องการวันที่คงที่ในรูปแบบใดรูปแบบหนึ่ง, ให้ใช้ข้อความปกติ.
Inspect, Modify, and Remove Date/Time Fields
เปลี่ยนฟิลด์ที่มีอยู่ผ่าน IField.setType. ตรวจสอบว่าฟิลด์มีอยู่ก่อนเข้าถึงประเภทของมัน. เพื่อตัดการอัปเดตอัตโนมัติ, เรียก IPortion.removeField. วิธีนี้จะเก็บส่วนและข้อความปัจจุบันไว้ขณะที่ลบการเชื่อมโยงฟิลด์. หากต้องการค่าคงที่เฉพาะ, กำหนดข้อความนั้นหลังจากลบฟิลด์.
สำหรับการตั้งค่า API ที่เกี่ยวข้องกับการประมวลผลฟิลด์วันที่/เวลา, ดู Presentation.setCurrentDateTime. ตัวอย่างด้านล่างใช้วันที่อนุมัติอย่างชัดเจนเมื่อแปลงฟิลด์เป็นข้อความธรรมดา.
ดาวน์โหลด sample.pptx แล้ววางไว้ในไดเรกทอรีทำงาน. ไฟล์นี้มีรูปร่างข้อความที่ตั้งชื่อสองอัน, UpdatedAt และ ApprovedDate, แต่ละอันมีฟิลด์วันที่/เวลา พร้อมป้ายกำกับข้อความปกติ. ตัวอย่างต่อไปนี้วนรอบรูปร่างข้อความระดับบนในสไลด์ปกติ. มันเปลี่ยนฟิลด์วันที่/เวลาเป็นรูปแบบวันที่แบบเต็มและทำให้เป็นตัวเอียง, ในขณะที่คงรูปแบบอื่นไว้. ฟิลด์ใน ApprovedDate เท่านั้นที่กลายเป็นข้อความคงที่.
ตัวอย่างนี้รับรู้ตัวระบุภายในที่สร้างมาแล้ว datetime และ datetime1 ถึง datetime13. กลุ่ม, ตาราง, โน้ต, เลย์เอาต์, และมาสเตอร์ต้อง traversed ผ่านคอนเทนเนอร์ข้อความของตนเองและอยู่นอกขอบเขตของตัวอย่างนี้.
import java.util.Calendar;
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.Date;
import com.aspose.slides.*;
Presentation presentation = new Presentation("sample.pptx");
try {
Calendar approvalDate = Calendar.getInstance();
approvalDate.clear();
approvalDate.set(2030, Calendar.APRIL, 5);
SimpleDateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy", Locale.US);
for (ISlide slide : presentation.getSlides()) {
for (IShape shape : slide.getShapes()) {
if (!(shape instanceof IAutoShape)) {
continue;
}
IAutoShape textShape = (IAutoShape) shape;
if (textShape.getTextFrame() == null) {
continue;
}
for (IParagraph paragraph : textShape.getTextFrame().getParagraphs()) {
for (IPortion portion : paragraph.getPortions()) {
IField field = portion.getField();
if (field == null) {
continue;
}
String typeName = field.getType().getInternalString();
boolean isDateTime = typeName != null && typeName.matches("datetime([1-9]|1[0-3])?");
if (!isDateTime) {
continue;
}
field.setType(FieldType.getDateTime3());
portion.getPortionFormat().setLanguageId("en-US");
portion.getPortionFormat().setFontItalic(NullableBool.True);
if ("ApprovedDate".equals(textShape.getName())) {
portion.removeField();
Date dateValue = approvalDate.getTime();
String fixedDate = dateFormat.format(dateValue);
portion.setText(fixedDate);
}
}
}
}
}
presentation.save("updated_dates.pptx", SaveFormat.Pptx);
Presentation reopened = new Presentation("updated_dates.pptx");
try {
for (IShape shape : reopened.getSlides().get_Item(0).getShapes()) {
if (!(shape instanceof IAutoShape)) {
continue;
}
IAutoShape textShape = (IAutoShape) shape;
if (textShape.getTextFrame() == null) {
continue;
}
if (!"UpdatedAt".equals(textShape.getName()) && !"ApprovedDate".equals(textShape.getName())) {
continue;
}
IPortion portion = textShape.getTextFrame().getParagraphs().get_Item(0).getPortions().get_Item(0);
IField field = portion.getField();
String typeName = field == null ? "ordinary text" : field.getType().getInternalString();
System.out.println(textShape.getName() + ": " + typeName + "; " + portion.getText());
System.out.println("Italic: " + portion.getPortionFormat().getFontItalic());
}
} finally {
reopened.dispose();
}
} finally {
presentation.dispose();
}
หลังจากเปิดใหม่, UpdatedAt มีประเภท datetime3 และยังคงเป็นไดนามิก. ApprovedDate ไม่มีฟิลด์และมีข้อความ 05 April 2030. ส่วนของวันที่ทั้งสองเป็นตัวเอียง, และขนาดฟอนต์, การตั้งค่าหนา, และสีเดิมยังคงอยู่. ป้ายกำกับข้อความธรรมดาไม่ได้เปลี่ยนแปลง. การตรวจสอบอ่านส่วนแรกของสองรูปร่างที่รู้จักในตัวอย่างที่ให้มา.
Preserve Text Formatting
ทำงานกับส่วนที่มีอยู่เมื่อเพิ่มฟิลด์, เปลี่ยนประเภทของฟิลด์, หรือเอาฟิลด์ออก. การดำเนินการเหล่านี้จะคงรูปแบบของส่วนนั้น. ใช้ IPortion.getPortionFormat เพื่อเปลี่ยนเฉพาะคุณสมบัติที่จำเป็น, เช่นตัวอย่างที่ทำสำหรับสีหรือการทำตัวเอียง.
หลีกเลี่ยงการสร้างกรอบข้อความใหม่ทั้งหมดเพียงเพื่ออัปเดตฟิลด์เดียว: การกระทำเช่นนั้นอาจทำให้สูญเสียขอบเขตส่วนเดิมและรูปแบบแยกของแต่ละส่วน. แยกความแตกต่างระหว่างการจัดรูปแบบที่ตั้งค่าโดยตรงและการจัดรูปแบบที่สืบทอดจากย่อหน้า, เลย์เอาต์, หรือธีม. ดู Text Formatting สำหรับตัวเลือกการจัดรูปแบบที่กว้างขึ้น.
Fields and Header/Footer Placeholders
ฟิลด์เป็นส่วนของข้อความ. ตัวแทน (placeholder) คือรูปร่างที่มีบทบาทการนำเสนอ, เช่นส่วนท้ายหรือหมายเลขสไลด์. การเพิ่มฟิลด์ลงในกล่องข้อความธรรมดาจะไม่ทำให้รูปร่างนั้นกลายเป็นตัวแทน.
ตัวจัดการส่วนหัว/ส่วนท้ายควบคุมข้อความตัวแทนและการมองเห็นบนสไลด์, เลย์เอาต์, และมาสเตอร์, รวมถึงการกระจายไปยังสไลด์ที่อิง. ฟิลด์หมายเลขในกล่องข้อความที่กำหนดเองจึงอาจมีประโยชน์แม้คุณไม่ใช้ตัวแทนหมายเลขสไลด์. ในทางกลับกัน, การเปลี่ยนการมองเห็นของตัวแทนจะไม่ลบฟิลด์จากกล่องข้อความที่ไม่เกี่ยวข้อง.
ประเภทส่วนหัวและส่วนท้ายที่กำหนดไว้ล่วงหน้าไม่ได้สร้างตัวแทนที่สอดคล้องหรือให้เนื้อหาของมัน. โดยเฉพาะ, สไลด์ PowerPoint ปกติไม่มีตัวแทนส่วนหัว; ส่วนหัวเป็นของหน้าบันทึกและเอกสารแจก. อย่าสันนิษฐานว่าฟิลด์ส่วนหัวหรือส่วนท้ายในรูปร่างใด ๆ จะได้รับข้อความที่ตั้งค่าผ่านตัวจัดการตัวแทนโดยอัตโนมัติ. สำหรับกระบวนการนั้น, ดู Presentation Headers and Footers.
PPTX and PPT Limitations
ตรวจสอบทั้งประเภทฟิลด์และข้อความที่ได้หลังจากบันทึกและเปิดใหม่. การเก็บรักษาตัวระบุไม่ได้หมายความว่าแอปพลิเคชันจะคำนวณหรือแสดงค่าของมันได้.
| Format | Field behavior and limitations |
|---|---|
| PPTX | เก็บตัวระบุฟิลด์ภายในพร้อมกับข้อความฟิลด์. ในการตรวจสอบรอบการบันทึก, ประเภทที่กำหนดไว้ล่วงหน้าและตัวระบุที่กำหนดเองที่ใช้ข้างต้นยังคงอยู่หลังการบันทึกและเปิดใหม่. ประเภทที่ไม่รู้จักยังคงข้อความสำรอง; ไม่ได้รับตรรกะคำนวณอัตโนมัติ. แอปพลิเคชันอื่นอาจจัดการกับตัวระบุที่ไม่ได้สนับสนุนแตกต่างกัน. |
| PPT | ใช้การแทนฟิลด์แบบเก่าและมีความเข้ากันได้จำกัดมากขึ้น. ในการตรวจสอบรอบการบันทึก, ฟิลด์หมายเลขสไลด์และฟิลด์วันที่/เวลาที่กำหนดล่วงหน้ายังคงอยู่หลังการบันทึกและเปิดใหม่. ฟิลด์ที่กำหนดเองในกล่องข้อความสไลด์ธรรมดาจะเปิดใหม่พร้อมตัวระบุแต่ข้อความเป็น *; ฟิลด์ส่วนหัวในบริบทเดียวกันก็ให้ผลเป็น *. อย่าอาศัยฟิลด์ที่กำหนดเองหรือบริบทฟิลด์ที่ไม่รองรับให้คงข้อความที่มองเห็นได้. |
สำหรับผลลัพธ์ที่พกพาและคงที่, แปลงฟิลด์ที่ไม่รองรับเป็นข้อความธรรมดาและกำหนดค่าที่ต้องการอย่างชัดเจนก่อนบันทึก. วิธีนี้จะคงข้อความที่เลือกไว้แต่หยุดการอัปเดตอัตโนมัติ. ทดสอบแอปเป้าหมายด้วยเช่นกันเมื่อการคำนวณฟิลด์ของมันเป็นส่วนหนึ่งของกระบวนการทำงานของคุณ.
FAQ
How can I tell whether a displayed number or date is a field?
ตรวจสอบ IPortion.getField. ค่าไม่เป็น null หมายถึงเป็นฟิลด์; ข้อความที่แสดงอย่างเดียวไม่สามารถบอกได้.
Does removing a field remove its text or formatting?
ไม่. removeField จะเปลี่ยนส่วนที่มีอยู่เป็นข้อความธรรมดา. หากต้องการค่าคงที่ให้กำหนดค่าตัวอักษรหลังจากลบฟิลด์.
Can an internal string define a new date format or formula?
ไม่. มันระบุประเภทฟิลด์เท่านั้น. ตัวระบุที่ไม่รู้จักจะไม่ให้ตัวประเมินหรือรูปแบบวันที่ของ Java. ใช้ประเภทที่รองรับหรือจัดรูปแบบค่าด้วยตนเองเป็นข้อความธรรมดา.
Why check a presentation again after saving it?
ตัวระบุฟิลด์, ข้อความที่คำนวณ, และการจัดรูปแบบเป็นสิ่งที่ต้องตรวจสอบแยกกัน. การแปลงรูปแบบอาจเปลี่ยนผลลัพธ์ที่มองเห็นได้แม้ตัวระบุฟิลด์ยังคงอยู่.