PowerPoint (PPTX) manipulation library for .NET / C# developers
ShapeCrawler provides a clean, intuitive API on top of the Open XML SDK, making it easy to read, create, and modify .pptx files programmatically.
dotnet add package ShapeCrawler// Load an existing presentation
var pres = new Presentation("presentation.pptx");
// Access shapes on a slide
var shapes = pres.Slide(1).Shapes;
var textBox = shapes.Shape("TextBox 1");
// Read text content
var text = textBox.TextBox.Text;
// Modify and save
textBox.TextBox.SetText("Updated content");
pres.Save();- No Office Required – Process presentations on any platform without Microsoft Office installation
- Clean API – Intuitive object model that hides the complexity of Open XML
- Open Source — Actively maintained
// Create a new presentation with a slide
var pres = new Presentation(p => p.Slide());
// Add a shape with text
var shapes = pres.Slide(1).Shapes;
shapes.AddShape(x: 50, y: 60, width: 100, height: 70);
var addedShape = shapes.Last();
addedShape.TextBox.SetText("Hello World!");
pres.Save("output.pptx");var pres = new Presentation("presentation.pptx");
var picture = pres.Slide(1).Shape("Picture 1").Picture;
// Replace the image
using var newImage = File.OpenRead("new-image.png");
picture.Image.Update(newImage);
pres.Save();var pres = new Presentation("presentation.pptx");
var shapes = pres.Slide(1).Shapes;
// Add a 3x2 table at position (50, 120)
shapes.AddTable(x: 50, y: 120, columnsCount: 3, rowsCount: 2);
var table = shapes.Last().Table;
table[0, 0].TextBox.SetText("Hello table");
pres.Save();var pres = new Presentation("presentation.pptx");
var table = pres.Slide(1).Shapes.Shape("Table 1").Table;
// Insert a row at index 1, using row 0 as a template
table.Rows.Add(1, 0);
// Merge two header cells
table.MergeCells(table[0, 0], table[0, 1]);
pres.Save();var pres = new Presentation("presentation.pptx");
var shapes = pres.Slide(1).Shapes;
// Add a line from (50, 60) to (100, 60)
shapes.AddLine(startPointX: 50, startPointY: 60, endPointX: 100, endPointY: 60);var pres = new Presentation("presentation.pptx");
var line = pres.Slide(1).Shapes.First(shape => shape.GeometryType == Geometry.Line).Line;
var start = line.StartPoint; // Point(x, y)
var end = line.EndPoint; // Point(x, y)
Console.WriteLine($"Line from {start.X},{start.Y} to {end.X},{end.Y}");var pres = new Presentation(p => p.Slide());
var shapes = pres.Slide(1).Shapes;
var points = new Dictionary<string, double>
{
{ "Q1", 50 },
{ "Q2", 60 },
{ "Q3", 40 }
};
// Add a bar chart
shapes.AddBarChart(x: 100, y: 100, width: 500, height: 350, points, "Sales");
pres.Save("output.pptx");var pres = new Presentation("presentation.pptx");
var chart = pres.Slide(1).Shapes.Shape("Bar Chart 1").Chart;
// Update category name
chart.Categories[0].Name = "Renamed Category";
pres.Save();Have questions? We're here to help!
- Issues – Report bugs or request features
- Discussions Forum – Ask questions and share ideas
- Email – Reach out to theadamo86@gmail.com
We love contributions! Here's how you can help:
- Give us a star ⭐ – If you find ShapeCrawler useful, show your support with a star!
- Reporting Bugs – Found a bug? Open an issue with a clear description of the problem
- Contribute Code – Pull requests are welcome!
- Need to share a confidential file? – Email it to theadamo86@gmail.com – only the maintainer will access it
Want to try the latest features? Access pre-release builds from the master branch using the following NuGet: https://www.myget.org/F/shape/api/v3/index.json
🍀Added support for updating the category name of the multi-category chart #151