OfficeIMO.PowerPoint
1.0.41
Prefix Reserved
dotnet add package OfficeIMO.PowerPoint --version 1.0.41
NuGet\Install-Package OfficeIMO.PowerPoint -Version 1.0.41
<PackageReference Include="OfficeIMO.PowerPoint" Version="1.0.41" />
<PackageVersion Include="OfficeIMO.PowerPoint" Version="1.0.41" />
<PackageReference Include="OfficeIMO.PowerPoint" />
paket add OfficeIMO.PowerPoint --version 1.0.41
#r "nuget: OfficeIMO.PowerPoint, 1.0.41"
#:package OfficeIMO.PowerPoint@1.0.41
#addin nuget:?package=OfficeIMO.PowerPoint&version=1.0.41
#tool nuget:?package=OfficeIMO.PowerPoint&version=1.0.41
OfficeIMO.PowerPoint - PowerPoint presentations for .NET
OfficeIMO.PowerPoint creates and edits .pptx presentations with Open XML. It is for generating editable decks without COM automation and without Microsoft PowerPoint installed.
If OfficeIMO saves you time, please consider supporting the work through GitHub Sponsors or PayPal. PowerShell users should use PSWriteOffice for the PowerShell-facing experience.
Install
dotnet add package OfficeIMO.PowerPoint
Quick start
using OfficeIMO.PowerPoint;
using var presentation = PowerPointPresentation.Create("deck.pptx");
presentation.SlideSize.SetPreset(PowerPointSlideSizePreset.Screen16x9);
var slide = presentation.AddSlide();
slide.AddTitle("OfficeIMO.PowerPoint");
var body = slide.AddTextBox("Generated without PowerPoint automation.");
body.SetPositionCm(2, 2);
body.SetSizeCm(18, 2);
slide.Transition = SlideTransition.Fade;
presentation.Save();
What it does
- Creates and edits PowerPoint presentations, slides, slide size, text boxes, pictures, tables, charts, backgrounds, transitions, notes, and metadata.
- Keeps generated output as editable PowerPoint content instead of screenshots.
- Provides designer composition helpers for theme-aware business decks and repeatable layout alternatives.
- Supports encrypted presentation save/open workflows.
- Uses Open XML directly, making it suitable for services, build agents, desktop apps, and automation hosts.
Runnable samples
dotnet run --project OfficeIMO.Examples/OfficeIMO.Examples.csproj -f net10.0 -- --powerpoint
dotnet run --project OfficeIMO.Examples/OfficeIMO.Examples.csproj -f net10.0 -- --modern-powerpoint
dotnet run --project OfficeIMO.Examples/OfficeIMO.Examples.csproj -f net10.0 -- --powerpoint-design-brief
dotnet run --project OfficeIMO.Examples/OfficeIMO.Examples.csproj -f net10.0 -- --powerpoint-deck-plan
Examples
The quick start creates one simple slide. These examples show the editable deck features that belong in OfficeIMO.PowerPoint.
Title, content, and bullets
var slide = presentation.AddSlide();
slide.AddTitle("Quarterly Review");
slide.AddTextBox("Agenda",
PowerPointUnits.Cm(1.5), PowerPointUnits.Cm(2.0),
PowerPointUnits.Cm(8.0), PowerPointUnits.Cm(1.0));
var agenda = slide.AddTextBox("Topics",
PowerPointUnits.Cm(1.5), PowerPointUnits.Cm(3.0),
PowerPointUnits.Cm(10.0), PowerPointUnits.Cm(3.0));
agenda.AddBullets(new[] { "Intro", "KPIs", "Next steps" });
Images and SVGs
using OfficeIMO.PowerPoint;
using PowerPointImagePartType = OfficeIMO.PowerPoint.ImagePartType;
slide.AddPicture("logo.png",
PowerPointUnits.Cm(23), PowerPointUnits.Cm(1.2),
PowerPointUnits.Cm(5), PowerPointUnits.Cm(2));
using var logo = File.OpenRead("logo.png");
slide.AddPicture(logo, PowerPointImagePartType.Png,
PowerPointUnits.Cm(2), PowerPointUnits.Cm(2),
PowerPointUnits.Cm(5), PowerPointUnits.Cm(2));
slide.AddPicture("diagram.svg",
PowerPointUnits.Cm(2), PowerPointUnits.Cm(5),
PowerPointUnits.Cm(8), PowerPointUnits.Cm(4));
Shapes and layout
slide.AddRectangle(
PowerPointUnits.Cm(1), PowerPointUnits.Cm(1),
PowerPointUnits.Cm(3), PowerPointUnits.Cm(1))
.Fill("#E7F7FF")
.Stroke("#007ACC");
slide.AddLine(
PowerPointUnits.Cm(1), PowerPointUnits.Cm(3),
PowerPointUnits.Cm(8), PowerPointUnits.Cm(3))
.Stroke("#404040");
Tables from data
using OfficeIMO.PowerPoint;
var rows = new[] {
new SalesRow("Alpha", 12, 15),
new SalesRow("Beta", 9, 11)
};
var columns = new[] {
PowerPointTableColumn<SalesRow>.Create("Product", row => row.Product).WithWidthCm(4.0),
PowerPointTableColumn<SalesRow>.Create("Q1", row => row.Q1),
PowerPointTableColumn<SalesRow>.Create("Q2", row => row.Q2)
};
slide.AddTable(rows, columns,
left: PowerPointUnits.Cm(1.5),
top: PowerPointUnits.Cm(4),
width: PowerPointUnits.Cm(20),
height: PowerPointUnits.Cm(6));
record SalesRow(string Product, int Q1, int Q2);
Charts from data
using DocumentFormat.OpenXml.Drawing.Charts;
var metrics = new[] {
new MetricRow("Q1", 120, 32),
new MetricRow("Q2", 145, 36),
new MetricRow("Q3", 172, 41),
new MetricRow("Q4", 190, 44)
};
var slide = presentation.AddSlide();
slide.AddTitle("Revenue and margin");
slide.AddChartCm(metrics, row => row.Quarter,
leftCm: 1.4, topCm: 3.0, widthCm: 13.2, heightCm: 8.0,
new PowerPointChartSeriesDefinition<MetricRow>("Revenue", row => row.Revenue),
new PowerPointChartSeriesDefinition<MetricRow>("Margin", row => row.Margin))
.SetTitle("Quarterly performance")
.SetCategoryAxisTitle("Quarter")
.SetValueAxisTitle("Value")
.SetLegend(LegendPositionValues.Bottom)
.SetChartAreaStyle(fillColor: "FFFFFF", lineColor: "D9E2F3")
.SetPlotAreaStyle(fillColor: "F8FAFC", lineColor: "D9E2F3");
record MetricRow(string Quarter, double Revenue, double Margin);
var mix = new PowerPointChartData(
new[] { "Services", "Licenses", "Support" },
new[] { new PowerPointChartSeries("Share", new[] { 55d, 30d, 15d }) });
slide.AddDoughnutChartCm(mix, leftCm: 15.2, topCm: 3.0, widthCm: 8.0, heightCm: 8.0)
.SetTitle("Revenue mix")
.SetLegend(LegendPositionValues.Right);
Table and chart together
var segments = new[] {
new SegmentRow("Enterprise", 18, 22, 29, 35),
new SegmentRow("SMB", 12, 14, 18, 21),
new SegmentRow("Public", 9, 11, 12, 16)
};
var dashboard = presentation.AddSlide();
dashboard.AddTitle("Segment dashboard");
dashboard.AddTableCm(segments, new[] {
PowerPointTableColumn<SegmentRow>.Create("Segment", row => row.Segment).WithWidthCm(4.0),
PowerPointTableColumn<SegmentRow>.Create("Q1", row => row.Q1),
PowerPointTableColumn<SegmentRow>.Create("Q2", row => row.Q2),
PowerPointTableColumn<SegmentRow>.Create("Q3", row => row.Q3),
PowerPointTableColumn<SegmentRow>.Create("Q4", row => row.Q4)
},
leftCm: 1.4, topCm: 3.0, widthCm: 10.0, heightCm: 5.0);
dashboard.AddLineChartCm(segments, row => row.Segment,
leftCm: 12.2, topCm: 3.0, widthCm: 12.0, heightCm: 6.5,
new PowerPointChartSeriesDefinition<SegmentRow>("Q1", row => row.Q1),
new PowerPointChartSeriesDefinition<SegmentRow>("Q2", row => row.Q2),
new PowerPointChartSeriesDefinition<SegmentRow>("Q3", row => row.Q3),
new PowerPointChartSeriesDefinition<SegmentRow>("Q4", row => row.Q4))
.SetTitle("Segment trend")
.SetLegend(LegendPositionValues.Bottom);
record SegmentRow(string Segment, int Q1, int Q2, int Q3, int Q4);
Slides, notes, and duplication
var duplicate = presentation.DuplicateSlide(0);
duplicate.Hidden = true;
duplicate.Notes.Text = "Backup slide for Q&A.";
Designer composition
Use the designer APIs when a deck needs readable business composition without hand-positioning every object:
using var presentation = PowerPointPresentation.Create("proposal.pptx");
var brief = PowerPointDesignBrief
.FromBrand("#008C95", "client-demo", "technical rollout proposal")
.WithIdentity("Client Theme", footerLeft: "CLIENT", footerRight: "Service deck");
var deck = presentation.UseDesigner(brief, alternativeIndex: 0);
deck.AddSectionSlide("Delivery plan", "Implementation overview");
presentation.Save();
Fluent authoring
using OfficeIMO.PowerPoint.Fluent;
presentation.AsFluent()
.Slide(masterIndex: 0, layoutIndex: 0, slide => {
slide.Title("Fluent Slide");
slide.Bullets("One", "Two", "Three");
slide.Notes("Talking points for the presenter");
});
Adjacent packages
| Package | Use it for |
|---|---|
| OfficeIMO.PowerPoint.Pdf | Export editable PowerPoint slides to PDF and import PDF tables to PowerPoint. |
| OfficeIMO.Markup.PowerPoint | Render semantic markup documents to PowerPoint. |
Boundaries
OfficeIMO.PowerPointowns editable PowerPoint creation and manipulation.- PDF export belongs in
OfficeIMO.PowerPoint.Pdfand shared PDF primitives belong inOfficeIMO.Pdf. - Showcase decks and long design examples belong in
OfficeIMO.Examplesor focused docs, not in the package README.
Targets and license
- Targets:
netstandard2.0,net8.0,net10.0;net472is included when building on Windows. - License: MIT.
- Repository: EvotecIT/OfficeIMO
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 is compatible. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.7.2
- DocumentFormat.OpenXml (>= 3.5.1 && < 4.0.0)
-
.NETStandard 2.0
- DocumentFormat.OpenXml (>= 3.5.1 && < 4.0.0)
-
net10.0
- DocumentFormat.OpenXml (>= 3.5.1 && < 4.0.0)
-
net8.0
- DocumentFormat.OpenXml (>= 3.5.1 && < 4.0.0)
NuGet packages (2)
Showing the top 2 NuGet packages that depend on OfficeIMO.PowerPoint:
| Package | Downloads |
|---|---|
|
OfficeIMO.Reader
Unified, read-only document extraction facade for OfficeIMO (Word/Excel/PowerPoint/Markdown/PDF) intended for AI ingestion. |
|
|
OfficeIMO.PowerPoint.Pdf
PDF converter for OfficeIMO.PowerPoint - Export PowerPoint presentations to PDF using the first-party OfficeIMO.Pdf engine. |
GitHub repositories (1)
Showing the top 1 popular GitHub repositories that depend on OfficeIMO.PowerPoint:
| Repository | Stars |
|---|---|
|
EvotecIT/PSWriteOffice
PowerShell Module to create and edit Microsoft Word, Microsoft Excel, and Microsoft PowerPoint documents without having Microsoft Office installed.
|
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.41 | 157 | 6/16/2026 |
| 1.0.40 | 288 | 6/16/2026 |
| 1.0.39 | 365 | 6/15/2026 |
| 1.0.38 | 533 | 6/13/2026 |
| 1.0.37 | 534 | 6/12/2026 |
| 1.0.36 | 470 | 6/9/2026 |
| 1.0.35 | 645 | 6/5/2026 |
| 1.0.34 | 1,576 | 5/27/2026 |
| 1.0.33 | 519 | 5/26/2026 |
| 1.0.32 | 443 | 5/26/2026 |
| 1.0.31 | 500 | 5/23/2026 |
| 1.0.30 | 464 | 5/22/2026 |
| 1.0.29 | 446 | 5/21/2026 |
| 1.0.28 | 455 | 5/21/2026 |
| 1.0.27 | 452 | 5/20/2026 |
| 1.0.26 | 444 | 5/19/2026 |
| 1.0.25 | 431 | 5/18/2026 |
| 1.0.24 | 694 | 5/16/2026 |
| 1.0.23 | 437 | 5/14/2026 |
| 1.0.22 | 641 | 5/14/2026 |