Skip to main content Skills Marketplace Descubre y explora habilidades de IA creadas por la comunidad.
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Copiar promptMostrar detalles del prompt Un comando directo omite el prompt de revisión. Revisa el origen antes de ejecutarlo.
npx skills add https://github.com/datadrivenconstruction/DDC_Skills_for_AI_Agents_in_Construction --skill pptx-constructionEl comando permanece en una sola línea. Desplázate horizontalmente para revisarlo antes de copiarlo.
¿Prefieres una copia local? Descarga los archivos que SkillsMP tiene disponibles ahora.
Descargar Zip Descargando... Ocupaciones relacionadas SOC
Basado en la clasificación ocupacional SOC
Explorador de archivos
3 archivos name pptx-construction description PowerPoint generation for construction: project updates, stakeholder presentations, progress reports, bid presentations. Automated slide creation with charts and data. homepage https://datadrivenconstruction.io metadata {"openclaw":{"emoji":"📄","os":["darwin","linux","win32"],"homepage":"https://datadrivenconstruction.io","requires":{"bins":"[Truncated]"}}}
PowerPoint Generation for Construction
Overview
Create professional PowerPoint presentations for construction projects using python-pptx. Generate stakeholder updates, progress reports, and bid presentations with automated data visualization.
Construction Use Cases
1. Project Progress Presentation
Generate monthly progress update slides.
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.chart import XL_CHART_TYPE
from pptx.chart.data import CategoryChartData
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
def ( ) -> :
prs = Presentation()
prs.slide_width = Inches( )
prs.slide_height = Inches( )
title_slide = prs.slides.add_slide(prs.slide_layouts[ ])
title_slide.shapes.title.text = project_data[ ]
title_slide.placeholders[ ].text =
summary_slide = prs.slides.add_slide(prs.slide_layouts[ ])
summary_slide.shapes.title.text =
summary_text = summary_slide.placeholders[ ]
tf = summary_text.text_frame
tf.paragraphs[ ].text =
p = tf.add_paragraph()
p.text =
p = tf.add_paragraph()
p.text =
p = tf.add_paragraph()
p.text =
add_schedule_chart(prs, project_data[ ])
add_budget_chart(prs, project_data[ ])
add_milestones_slide(prs, project_data[ ])
add_issues_slide(prs, project_data.get( , []))
project_data.get( ):
add_photos_slide(prs, project_data[ ])
prs.save(output_path)
output_path
( ):
slide = prs.slides.add_slide(prs.slide_layouts[ ])
slide.shapes.title.text =
chart_data = CategoryChartData()
chart_data.categories = schedule_data[ ]
chart_data.add_series( , schedule_data[ ])
chart_data.add_series( , schedule_data[ ])
chart = slide.shapes.add_chart(
XL_CHART_TYPE.COLUMN_CLUSTERED,
Inches( ), Inches( ),
Inches( ), Inches( ),
chart_data
).chart
chart.has_legend =
chart.legend.include_in_layout =
( ):
slide = prs.slides.add_slide(prs.slide_layouts[ ])
slide.shapes.title.text =
chart_data = CategoryChartData()
chart_data.categories = [ , , , ]
chart_data.add_series( , [
budget_data[ ] / ,
budget_data[ ] / ,
budget_data[ ] / ,
budget_data[ ] /
])
chart = slide.shapes.add_chart(
XL_CHART_TYPE.BAR_CLUSTERED,
Inches( ), Inches( ),
Inches( ), Inches( ),
chart_data
).chart
( ):
slide = prs.slides.add_slide(prs.slide_layouts[ ])
slide.shapes.title.text =
rows = (milestones) +
cols =
table = slide.shapes.add_table(rows, cols, Inches( ), Inches( ), Inches( ), Inches( * rows)).table
headers = [ , , , ]
i, header (headers):
table.cell( , i).text = header
i, ms (milestones, ):
table.cell(i, ).text = ms[ ]
table.cell(i, ).text = ms[ ]
table.cell(i, ).text = ms.get( , ms.get( , ))
table.cell(i, ).text = ms[ ]
( ):
slide = prs.slides.add_slide(prs.slide_layouts[ ])
slide.shapes.title.text =
issues:
slide.placeholders[ ].text =
tf = slide.placeholders[ ].text_frame
i, issue (issues):
i == :
tf.paragraphs[ ].text =
:
p = tf.add_paragraph()
p.text =
( ):
slide = prs.slides.add_slide(prs.slide_layouts[ ])
slide.shapes.title.text =
positions = [
(Inches( ), Inches( )),
(Inches( ), Inches( )),
(Inches( ), Inches( )),
(Inches( ), Inches( ))
]
i, photo (photos[: ]):
left, top = positions[i]
slide.shapes.add_picture(photo[ ], left, top, width=Inches( ))
create_progress_presentation
project_data: dict , output_path: str
str
"""Create project progress presentation."""
13.333
7.5
0
'project_name'
1
f"Progress Report - {project_data['report_date' ]} "
1
"Executive Summary"
1
0
f"Overall Progress: {project_data['overall_progress' ]} %"
f"Schedule Status: {project_data['schedule_status' ]} "
f"Budget Status: {project_data['budget_status' ]} "
f"Safety: {project_data['safety_status' ]} "
'schedule_data'
'budget_data'
'milestones'
'issues'
if
'photos'
'photos'
return
def
add_schedule_chart
prs: Presentation, schedule_data: dict
"""Add schedule progress chart."""
5
"Schedule Progress"
'phases'
'Planned'
'planned'
'Actual'
'actual'
1
1.5
11
5
True
False
def
add_budget_chart
prs: Presentation, budget_data: dict
"""Add budget status chart."""
5
"Budget Status"
'Budget'
'Committed'
'Spent'
'Forecast'
'Amount ($M)'
'budget'
1_000_000
'committed'
1_000_000
'spent'
1_000_000
'forecast'
1_000_000
1
1.5
11
5
def
add_milestones_slide
prs: Presentation, milestones: list
"""Add key milestones slide."""
5
"Key Milestones"
len
1
4
0.5
1.5
12
0.5
'Milestone'
'Planned'
'Actual/Forecast'
'Status'
for
in
enumerate
0
for
in
enumerate
1
0
'name'
1
'planned_date'
2
'actual_date'
'forecast_date'
'TBD'
3
'status'
def
add_issues_slide
prs: Presentation, issues: list
"""Add issues and risks slide."""
1
"Issues & Risks"
if
not
1
"No critical issues at this time."
return
1
for
in
enumerate
if
0
0
f"• {issue['description' ]} ({issue['status' ]} )"
else
f"• {issue['description' ]} ({issue['status' ]} )"
def
add_photos_slide
prs: Presentation, photos: list
"""Add site photos slide."""
5
"Site Progress Photos"
0.5
1.5
6.5
1.5
0.5
4
6.5
4
for
in
enumerate
4
'path'
5.5
2. Bid Presentation Create bid/proposal presentations.
def create_bid_presentation (bid_data: dict , output_path: str ) -> str :
"""Create bid presentation for client."""
prs = Presentation()
title_slide = prs.slides.add_slide(prs.slide_layouts[0 ])
title_slide.shapes.title.text = bid_data['project_name' ]
title_slide.placeholders[1 ].text = f"Proposal by {bid_data['company_name' ]} "
overview_slide = prs.slides.add_slide(prs.slide_layouts[1 ])
overview_slide.shapes.title.text = "About Us"
tf = overview_slide.placeholders[1 ].text_frame
tf.paragraphs[0 ].text = f"Years in Business: {bid_data['company' ]['years' ]} "
for qual in bid_data['company' ]['qualifications' ]:
p = tf.add_paragraph()
p.text = f"• {qual} "
understanding_slide = prs.slides.add_slide(prs.slide_layouts[1 ])
understanding_slide.shapes.title.text = "Project Understanding"
tf = understanding_slide.placeholders[1 ].text_frame
for i, point in enumerate (bid_data['understanding' ]):
if i == 0 :
tf.paragraphs[0 ].text = f"• {point} "
else :
p = tf.add_paragraph()
p.text = f"• {point} "
approach_slide = prs.slides.add_slide(prs.slide_layouts[1 ])
approach_slide.shapes.title.text = "Our Approach"
tf = approach_slide.placeholders[1 ].text_frame
for i, step in enumerate (bid_data['approach' ]):
if i == 0 :
tf.paragraphs[0 ].text = f"{i+1 } . {step} "
else :
p = tf.add_paragraph()
p.text = f"{i+1 } . {step} "
team_slide = prs.slides.add_slide(prs.slide_layouts[1 ])
team_slide.shapes.title.text = "Project Team"
tf = team_slide.placeholders[1 ].text_frame
for i, member in enumerate (bid_data['team' ]):
if i == 0 :
tf.paragraphs[0 ].text = f"{member['role' ]} : {member['name' ]} "
else :
p = tf.add_paragraph()
p.text = f"{member['role' ]} : {member['name' ]} "
pricing_slide = prs.slides.add_slide(prs.slide_layouts[5 ])
pricing_slide.shapes.title.text = "Investment Summary"
rows = len (bid_data['pricing' ]['items' ]) + 2
table = pricing_slide.shapes.add_table(rows, 2 , Inches(2 ), Inches(2 ), Inches(8 ), Inches(0.5 * rows)).table
table.cell(0 , 0 ).text = "Description"
table.cell(0 , 1 ).text = "Amount"
for i, item in enumerate (bid_data['pricing' ]['items' ], 1 ):
table.cell(i, 0 ).text = item['description' ]
table.cell(i, 1 ).text = f"${item['amount' ]:,.2 f} "
table.cell(rows-1 , 0 ).text = "TOTAL"
table.cell(rows-1 , 1 ).text = f"${bid_data['pricing' ]['total' ]:,.2 f} "
schedule_slide = prs.slides.add_slide(prs.slide_layouts[1 ])
schedule_slide.shapes.title.text = "Proposed Schedule"
tf = schedule_slide.placeholders[1 ].text_frame
tf.paragraphs[0 ].text = f"Duration: {bid_data['schedule' ]['duration' ]} "
p = tf.add_paragraph()
p.text = f"Start: {bid_data['schedule' ]['start' ]} "
p = tf.add_paragraph()
p.text = f"Completion: {bid_data['schedule' ]['end' ]} "
prs.save(output_path)
return output_path
3. Safety Report Presentation Generate safety meeting presentations.
def create_safety_presentation (safety_data: dict , output_path: str ) -> str :
"""Create safety meeting presentation."""
prs = Presentation()
title_slide = prs.slides.add_slide(prs.slide_layouts[0 ])
title_slide.shapes.title.text = "Safety Report"
title_slide.placeholders[1 ].text = f"{safety_data['project_name' ]} - {safety_data['period' ]} "
kpi_slide = prs.slides.add_slide(prs.slide_layouts[5 ])
kpi_slide.shapes.title.text = "Safety KPIs"
kpis = [
('Days Without Incident' , str (safety_data['days_without_incident' ])),
('Total Recordable Rate' , f"{safety_data['trir' ]:.2 f} " ),
('Near Misses Reported' , str (safety_data['near_misses' ])),
('Toolbox Talks' , str (safety_data['toolbox_talks' ]))
]
for i, (label, value) in enumerate (kpis):
left = Inches(0.5 + (i % 2 ) * 6 )
top = Inches(1.5 + (i // 2 ) * 2.5 )
shape = kpi_slide.shapes.add_shape(1 , left, top, Inches(5 ), Inches(2 ))
shape.text = f"{value} \n{label} "
if safety_data.get('incidents' ):
incident_slide = prs.slides.add_slide(prs.slide_layouts[1 ])
incident_slide.shapes.title.text = "Incidents This Period"
tf = incident_slide.placeholders[1 ].text_frame
for i, incident in enumerate (safety_data['incidents' ]):
if i == 0 :
tf.paragraphs[0 ].text = f"• {incident['date' ]} : {incident['description' ]} "
else :
p = tf.add_paragraph()
p.text = f"• {incident['date' ]} : {incident['description' ]} "
focus_slide = prs.slides.add_slide(prs.slide_layouts[1 ])
focus_slide.shapes.title.text = "Focus Areas This Week"
tf = focus_slide.placeholders[1 ].text_frame
for i, focus in enumerate (safety_data['focus_areas' ]):
if i == 0 :
tf.paragraphs[0 ].text = f"• {focus} "
else :
p = tf.add_paragraph()
p.text = f"• {focus} "
prs.save(output_path)
return output_path
4. Lookahead Schedule Presentation Generate 3-week lookahead slides.
def create_lookahead_presentation (lookahead_data: dict , output_path: str ) -> str :
"""Create 3-week lookahead presentation."""
prs = Presentation()
title_slide = prs.slides.add_slide(prs.slide_layouts[0 ])
title_slide.shapes.title.text = "3-Week Lookahead"
title_slide.placeholders[1 ].text = f"{lookahead_data['project_name' ]} "
for week_num, week_data in enumerate (lookahead_data['weeks' ], 1 ):
slide = prs.slides.add_slide(prs.slide_layouts[5 ])
slide.shapes.title.text = f"Week {week_num} : {week_data['date_range' ]} "
rows = len (week_data['activities' ]) + 1
table = slide.shapes.add_table(rows, 4 , Inches(0.3 ), Inches(1.5 ), Inches(12.5 ), Inches(0.4 * rows)).table
for i, header in enumerate (['Activity' , 'Area' , 'Crew' , 'Status' ]):
table.cell(0 , i).text = header
for i, activity in enumerate (week_data['activities' ], 1 ):
table.cell(i, 0 ).text = activity['name' ]
table.cell(i, 1 ).text = activity['area' ]
table.cell(i, 2 ).text = activity['crew' ]
table.cell(i, 3 ).text = activity['status' ]
resource_slide = prs.slides.add_slide(prs.slide_layouts[1 ])
resource_slide.shapes.title.text = "Resource Needs"
tf = resource_slide.placeholders[1 ].text_frame
for i, need in enumerate (lookahead_data.get('resource_needs' , [])):
if i == 0 :
tf.paragraphs[0 ].text = f"• {need} "
else :
p = tf.add_paragraph()
p.text = f"• {need} "
prs.save(output_path)
return output_path
Integration with DDC Pipeline
import pandas as pd
schedule_df = pd.read_excel("schedule_data.xlsx" )
budget_df = pd.read_excel("budget_data.xlsx" )
project_data = {
'project_name' : 'Downtown Office Tower' ,
'report_date' : 'January 2026' ,
'overall_progress' : 67 ,
'schedule_status' : 'On Track' ,
'budget_status' : '2.3% Under Budget' ,
'safety_status' : '45 Days Without Incident' ,
'schedule_data' : {
'phases' : schedule_df['phase' ].tolist(),
'planned' : schedule_df['planned_pct' ].tolist(),
'actual' : schedule_df['actual_pct' ].tolist()
},
'budget_data' : {
'budget' : budget_df['budget' ].sum (),
'committed' : budget_df['committed' ].sum (),
'spent' : budget_df['spent' ].sum (),
'forecast' : budget_df['forecast' ].sum ()
},
'milestones' : [
{'name' : 'Foundation Complete' , 'planned_date' : '2025-06-01' , 'actual_date' : '2025-05-28' , 'status' : 'Complete' },
{'name' : 'Structure Complete' , 'planned_date' : '2025-12-15' , 'actual_date' : '2025-12-10' , 'status' : 'Complete' },
{'name' : 'Envelope Complete' , 'planned_date' : '2026-03-01' , 'forecast_date' : '2026-02-28' , 'status' : 'On Track' }
]
}
create_progress_presentation(project_data, 'reports/monthly_progress_jan2026.pptx' )
Dependencies
Resources