จัดการเซลล์ตารางในงานนำเสนอด้วย Python
ภาพรวม
Aspose.Slides ช่วยให้คุณเข้าถึงและแก้ไขเซลล์ตารางในงานนำเสนอ PowerPoint ได้ บทความนี้อธิบายวิธีระบุเซลล์ตารางที่ถูกผสาน การลบเส้นขอบของเซลล์ การทำงานกับการนับหมายเลขเซลล์หลังจากการผสานหรือการแยกเซลล์ การเปลี่ยนสีพื้นหลังของเซลล์ และการเพิ่มรูปภาพลงในเซลล์ตาราง ตัวอย่างจะแสดงวิธีสร้างหรือเปิดงานนำเสนอ การดึงตารางจากสไลด์ การอัปเดตการจัดรูปแบบเซลล์ผ่านคุณสมบัติของเซลล์ และการบันทึกงานนำเสนอที่แก้ไขเป็นไฟล์ PPTX
Aspose.Slides ใช้ดัชนีเริ่มจากศูนย์ พิกัดในบทความนี้เขียนเป็น (คอลัมน์, แถว)
ระบุตารางที่ถูกผสาน
ตัวอย่างเปิดงานนำเสนอที่มีอยู่และเข้าถึงรูปร่างแรกบนสไลด์แรกเป็นตาราง โดยสมมติว่ามีสไลด์และรูปร่างอยู่และรูปร่างเป็นตาราง จากนั้นวนลูปผ่านทุกแถวและคอลัมน์และใช้ is_merged_cell เพื่อระบุเซลล์ในพื้นที่ที่ผสาน สำหรับแต่ละผลลัพธ์จะพิมพ์พิกัดเซลล์ในรูปแบบ row;column พร้อมกับ row_span, col_span, และพิกัดเริ่มต้นของพื้นที่นั้น ได้แก่ first_row_index และ first_column_index
import aspose.slides as slides
with slides.Presentation("presentation_with_table.pptx") as presentation:
slide = presentation.slides[0]
table = slide.shapes[0]
for row_index in range(len(table.rows)):
for column_index in range(len(table.columns)):
cell = table.rows[row_index][column_index]
if cell.is_merged_cell:
print(f"Cell {row_index};{column_index} belongs to a merged region with row_span={cell.row_span} and col_span={cell.col_span} starting at {cell.first_row_index};{cell.first_column_index}.")
ลบเส้นขอบของเซลล์ตาราง
สร้าง Presentation แล้วเพิ่มตารางลงในสไลด์แรกด้วย add_table. ความกว้างของคอลัมน์, ความสูงของแถว, และตำแหน่งของตารางระบุเป็นจุด ตัวอย่างกำหนดให้เส้นขอบสี่ด้านของเซลล์เป็น FillType.NO_FILL ทำให้เส้นขอบไม่แสดง
import aspose.slides as slides
with slides.Presentation() as presentation:
slide = presentation.slides[0]
column_widths = [50, 50, 50, 50]
row_heights = [50, 30, 30, 30, 30]
table = slide.shapes.add_table(100, 50, column_widths, row_heights)
for row in table.rows:
for cell in row:
cell.cell_format.border_top.fill_format.fill_type = slides.FillType.NO_FILL
cell.cell_format.border_bottom.fill_format.fill_type = slides.FillType.NO_FILL
cell.cell_format.border_left.fill_format.fill_type = slides.FillType.NO_FILL
cell.cell_format.border_right.fill_format.fill_type = slides.FillType.NO_FILL
presentation.save("table.pptx", slides.export.SaveFormat.PPTX)
ผสานเซลล์ตาราง
ใช้ merge_cells เพื่อรวมช่วงสี่เหลี่ยมของเซลล์ตารางเป็นเซลล์เดียว ระบุตำแหน่งเซลล์บนซ้ายและล่างขวาของช่วง ส่วนอาร์กิวเมนต์สุดท้ายควบคุมว่าการผสานอาจรวมเซลล์ที่อยู่นอกช่วงที่กำหนดหรือไม่; False จะทำให้การผสานอยู่ภายในช่วงเท่านั้น
ตัวอย่างสร้างตารางขนาด 4x4 โดยแต่ละคอลัมน์และแถวมีความกว้าง 70 จุด แล้วผสานเซลล์ศูนย์กลางสี่เซลล์จาก (1, 1) ถึง (2, 2) เซลล์ที่ได้จะครอบคลุมสองคอลัมน์และสองแถว ในขณะที่กริดของตารางยังคงมีสี่คอลัมน์และสี่แถว การเข้าถึงเนื้อหาหรือการจัดรูปแบบของเซลล์ที่ผสานให้ใช้ตำแหน่งบนซ้าย: table.rows[1][1] ในตัวอย่างนี้ ตำแหน่งอื่น ๆ ในช่วงที่ผสานยังคงเป็นส่วนของกริดตาราง ดังนั้นดัชนีของเซลล์นอกช่วงจะไม่เปลี่ยน
import aspose.slides as slides
with slides.Presentation() as presentation:
slide = presentation.slides[0]
column_widths = [70, 70, 70, 70]
row_heights = [70, 70, 70, 70]
table = slide.shapes.add_table(100, 50, column_widths, row_heights)
table.merge_cells(table.rows[1][1], table.rows[2][2], False)
presentation.save("merged_cells.pptx", slides.export.SaveFormat.PPTX)
แยกเซลล์ตาราง
การผสานเซลล์ในตัวอย่างก่อนหน้านี้ทำให้กริดของตารางคงเดิม การแยกเซลล์อาจเพิ่มคอลัมน์กริดใหม่และเปลี่ยนดัชนีของเซลล์ที่อยู่ทางขวา Aspose.Slides ปฏิบัติตามโมเดลกริดของตาราง PowerPoint
ตัวอย่างนี้สร้างตารางขนาด 4x4 โดยแต่ละคอลัมน์และแถวมีความกว้าง 70 จุด แล้วเรียกใช้ split_by_width บนเซลล์ (1, 1) ครึ่งหนึ่งของความกว้าง 70 จุดจะถูกส่งเข้าไปเพื่อสร้างเซลล์สองเซลล์ที่มีความกว้างเท่า ๆ กัน
หลังจากแยกเซลล์แล้ว ครึ่งสองส่วนจะถูกเข้าถึงเป็น table.rows[1][1] และ table.rows[1][2] กริดของตารางตอนนี้มีห้าคอลัมน์: เซลล์ที่เคยอยู่ที่คอลัมน์ 2 และ 3 จะย้ายไปที่คอลัมน์ 3 และ 4 ตามลำดับ ดัชนีแถวยังคงเหมือนเดิม ใช้ดัชนีคอลัมน์ที่อัปเดตเมื่อเข้าถึงเซลล์หลังการแยก
import aspose.slides as slides
with slides.Presentation() as presentation:
slide = presentation.slides[0]
column_widths = [70, 70, 70, 70]
row_heights = [70, 70, 70, 70]
table = slide.shapes.add_table(100, 50, column_widths, row_heights)
table.rows[1][1].split_by_width(table.rows[1][1].width / 2)
presentation.save("split_cells.pptx", slides.export.SaveFormat.PPTX)
แยกเซลล์ที่ผสานตามแถวหรือคอลัมน์
เพื่อเตรียมเซลล์เทมเพลตที่ผสานสำหรับการเติมข้อมูล ให้ใช้ split_by_row_span เพื่อแยกตามขอบแถวที่มีอยู่ หรือใช้ split_by_col_span เพื่อแยกตามขอบคอลัมน์
อาร์กิวเมนต์ index นับแถวในส่วนบนหรือคอลัมน์ในส่วนซ้ายของการแยก; ค่าจะอิงตามพื้นที่ที่ผสาน:
ตัวอย่างสมมติว่ามีงานนำเสนอที่มีตารางเป็นรูปร่างแรกบนสไลด์แรก โดยเซลล์ (1, 2) และ (1, 3) ผสานกันแนวตั้ง เริ่มจากตำแหน่งล่าง จะใช้ first_column_index และ first_row_index หาแหล่งกำเนิดและตรวจสอบทั้งสองช่วง split_by_row_span ด้วยค่า index 1 จะทำให้แยกแถวที่ 2 และ 3 สำหรับชื่อสินค้า หากต้องการผสานสองคอลัมน์แนวนอน ให้ใช้ split_by_col_span ด้วยค่า index 1 แทน
import aspose.slides as slides
with slides.Presentation("table_template.pptx") as presentation:
slide = presentation.slides[0]
table = slide.shapes[0]
selected_cell = table.rows[3][1]
first_column_index = selected_cell.first_column_index
first_row_index = selected_cell.first_row_index
merged_cell = table.rows[first_row_index][first_column_index]
if merged_cell.is_merged_cell and merged_cell.row_span == 2 and merged_cell.col_span == 1:
merged_cell.split_by_row_span(1)
# ดึงเซลล์ที่ได้จากตารางหลังจากการแยก.
upper_cell = table.rows[first_row_index][first_column_index]
lower_cell = table.rows[first_row_index + 1][first_column_index]
print(f"Upper cell merged: {upper_cell.is_merged_cell}")
print(f"Lower cell merged: {lower_cell.is_merged_cell}")
upper_cell.text_frame.text = "Product A"
lower_cell.text_frame.text = "Product B"
presentation.save("split_template.pptx", slides.export.SaveFormat.PPTX)
else:
print("Select a merged region spanning exactly two rows and one column.")
กริดของตารางและดัชนีเซลล์รอบข้างคงเดิม ดึงเซลล์ที่ได้โดยใช้พิกัด; ทั้งสองเซลล์จะมี span เท่ากับ 1 และ is_merged_cell จะคืนค่า False พื้นที่ที่ใหญ่กว่าสามารถคงอยู่เป็นบางส่วนที่ผสานหลังจากการแยกหนึ่งครั้ง
ข้อความและการจัดรูปแบบเดิมจะอยู่ในเซลล์บน (หรือซ้าย) เซลล์ใหม่จะว่างเปล่าแต่สืบทอดการจัดรูปแบบเซลล์ เช่น การเติม, เส้นขอบ, และขอบเขต ให้เติมข้อมูลในเซลล์หลังการแยกและตั้งค่าการจัดรูปแบบข้อความที่ต้องการอย่างชัดเจน
งานนำเสนอที่บันทึกจะมีเซลล์ “Product A” และ “Product B” แยกกันโดยคงรูปแบบเซลล์ของเทมเพลตไว้ ดูรายละเอียดได้ที่ Cell API Reference
เปลี่ยนสีพื้นหลังของเซลล์ตาราง
ตัวอย่างนี้สร้างตารางโดยคอลัมน์กว้าง 150 จุดและแถวสูง 50 จุด ตั้งค่า fill_type ให้เป็น solid และ solid_fill_color เป็นสีแดงสำหรับเซลล์ (2, 3) ซึ่งอยู่ในคอลัมน์ที่สามและแถวที่สี่
import aspose.pydrawing as draw
import aspose.slides as slides
with slides.Presentation() as presentation:
slide = presentation.slides[0]
column_widths = [150, 150, 150, 150]
row_heights = [50, 50, 50, 50, 50]
table = slide.shapes.add_table(50, 50, column_widths, row_heights)
cell = table.rows[3][2]
cell.cell_format.fill_format.fill_type = slides.FillType.SOLID
cell.cell_format.fill_format.solid_fill_color.color = draw.Color.red
presentation.save("cell_background_color.pptx", slides.export.SaveFormat.PPTX)
เพิ่มรูปภาพลงในเซลล์ตาราง
ใส่รูปภาพอินพุตไว้ในไดเรกทอรีทำงานก่อนรันตัวอย่างนี้ ตัวอย่างโหลดรูปด้วย Images.from_file แล้วเพิ่มลงในคอลเลกชันรูปของงานนำเสนอด้วย add_image จากนั้นกำหนดรูปให้กับ picture fill ของเซลล์ (0, 0) ซึ่งเป็นเซลล์แรกของตาราง
PictureFillMode.STRETCH จะขยายรูปเพื่อเติมเซลล์ ซึ่งอาจทำให้สัดส่วนเปลี่ยนแปลง ความกว้างของคอลัมน์และความสูงของแถวระบุเป็นจุด รูปที่โหลดจะถูกทำลายอัตโนมัติเมื่อบล็อก with สิ้นสุด
import aspose.slides as slides
with slides.Presentation() as presentation:
slide = presentation.slides[0]
column_widths = [150, 150, 150, 150]
row_heights = [100, 100, 100, 100, 90]
table = slide.shapes.add_table(50, 50, column_widths, row_heights)
with slides.Images.from_file("aspose_logo.jpg") as image:
presentation_image = presentation.images.add_image(image)
cell = table.rows[0][0]
cell.cell_format.fill_format.fill_type = slides.FillType.PICTURE
cell.cell_format.fill_format.picture_fill_format.picture_fill_mode = slides.PictureFillMode.STRETCH
cell.cell_format.fill_format.picture_fill_format.picture.image = presentation_image
presentation.save("table_cell_with_image.pptx", slides.export.SaveFormat.PPTX)
FAQ
ฉันสามารถตั้งค่าความหนาและสไตล์ของเส้นขอบต่าง ๆ สำหรับด้านต่าง ๆ ของเซลล์เดียวได้หรือไม่?
ได้. เส้นขอบ top/bottom/left/right มีคุณสมบัติแยกกัน ทำให้ความหนาและสไตล์ของแต่ละด้านสามารถแตกต่างกันได้
ถ้าฉันเปลี่ยนขนาดคอลัมน์/แถวหลังจากตั้งรูปภาพเป็นพื้นหลังของเซลล์ ผลลัพธ์ของรูปจะเป็นอย่างไร?
พฤติกรรมขึ้นอยู่กับ fill mode (stretch/tile) หากใช้การยืดรูป รูปจะปรับให้เข้ากับเซลล์ใหม่; หากใช้การทำแผ่นรูป รูปแบบแผ่นจะถูกคำนวณใหม่
ฉันสามารถกำหนด hyperlink ให้กับเนื้อหาทั้งหมดของเซลล์ได้หรือไม่?
Hyperlinks ถูกตั้งที่ระดับข้อความ (portion) ภายใน text frame ของเซลล์ หรือที่ระดับตาราง/รูปร่างทั้งหมด ในการปฏิบัติจริง คุณจะกำหนดลิงก์ให้กับ portion หรือให้กับข้อความทั้งหมดในเซลล์
ฉันสามารถตั้งค่าฟอนต์ต่าง ๆ ภายในเซลล์เดียวได้หรือไม่?
ได้. text frame ของเซลล์สนับสนุน portions (runs) ที่มีการจัดรูปแบบอิสระ – ฟอนต์, สไตล์, ขนาด, และสี