GemBox.Presentation is a .NET component that enables you to read, write, edit, convert, and print presentation files from your .NET applications using one simple API.

Export PowerPoint in ASP.NET

GemBox.Presentation does not use Office Automation, nor any other library - only .NET Framework, which, combined with it superior performance, makes it ideal for web applications, like ASP.NET. GemBox.Presentation supports reading and writing a presentation from / to a stream, so the presentation can easily be uploaded or streamed to a browser.

The following example demonstrates how to import web form data into a template presentation and export the resulting presentation to a browser in ASP.NET application.

To see the application in action, use the following link: GemBox.Presentation Web Demo

Screenshot
Export PowerPoint in ASP.NET Screenshot

See the full code below.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MediumTrustSampleCs.Index" %><!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"><title>GemBox.Presentation Web Demo</title><style type="text/css"> * { font-family: Arial; font-size: 12pt; color: rgb(45,46,45); } .summaries { font-size: 18.67pt; } .heading { font-weight: bold; font-size: 29.33pt; color: rgb(209,90,62); } .title { font-weight: bold; font-size: 36pt; } hr { display: block; height: 1px; border: 0; border-top: 1px solid rgb(209,90,62); margin: 1em 0; padding: 0; } </style></head><body><form id="form1" runat="server"><fieldset><legend>Presentation form:</legend><asp:TextBox ID="titleTextBox" runat="server" CssClass="title" Columns="50">ACME Corp - 4th Quarter Financial Results</asp:TextBox><hr /><asp:TextBox ID="summaryHeadingTextBox" runat="server" CssClass="heading" Columns="30">4th Quarter Summary</asp:TextBox><br /><br /><br /><asp:TextBox ID="summaryBulletsTextBox" runat="server" CssClass="summaries" TextMode="MultiLine" Wrap="False" Columns="70" Rows="5">3 new products/services in Research and Development. Rollout planned for new division. Campaigns targeting new markets.</asp:TextBox><hr /><asp:TextBox ID="highlightsHeadingTextBox" runat="server" CssClass="heading" Columns="30">4th Quarter Financial Highlights</asp:TextBox><br /><br /><br /><asp:GridView ID="highlightsGridView" runat="server" AutoGenerateColumns="False" BackColor="White" BorderColor="#CC9966" BorderStyle="None" BorderWidth="1px" CellPadding="4" AutoGenerateDeleteButton="True" AutoGenerateEditButton="True" Width="75%" OnRowCancelingEdit="highlightsGridView_RowCancelingEdit" OnRowDeleting="highlightsGridView_RowDeleting" OnRowEditing="highlightsGridView_RowEditing" OnRowUpdating="highlightsGridView_RowUpdating"><Columns><asp:BoundField DataField="Name"><ItemStyle Width="25%" /></asp:BoundField><asp:BoundField DataField="Estimated" HeaderText="Estimated"><ItemStyle Width="25%" /></asp:BoundField><asp:BoundField DataField="Change" HeaderText="% Change"><ItemStyle Width="25%" /></asp:BoundField></Columns><FooterStyle BackColor="#FFFFCC" ForeColor="#330099" /><HeaderStyle BackColor="#D15A3E" ForeColor="#2D2E2D" Font-Bold="False" /><PagerStyle BackColor="#FFFFCC" ForeColor="#330099" HorizontalAlign="Center" /><RowStyle BackColor="White" ForeColor="#2D2E2D" /><SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="#663399" /><SortedAscendingCellStyle BackColor="#FEFCEB" /><SortedAscendingHeaderStyle BackColor="#AF0101" /><SortedDescendingCellStyle BackColor="#F6F0C0" /><SortedDescendingHeaderStyle BackColor="#7E0000" /></asp:GridView><asp:LinkButton ID="addRowLinkButton" runat="server" OnClick="addRowLinkButton_Click">Add Row</asp:LinkButton></fieldset><br /><br /><fieldset><legend>Output format:</legend><asp:RadioButtonList ID="outputFormatRadioButton" runat="server"><asp:ListItem Value="pptx" Selected="True">PPTX</asp:ListItem></asp:RadioButtonList><br /><asp:Button ID="generateButton" runat="server" Text="Generate" OnClick="generateButton_Click" /></fieldset></form></body></html>
using System;
using System.Data;
using System.IO;
using System.Web.UI;
using System.Web.UI.WebControls;
using GemBox.Presentation;

namespace MediumTrustSampleCs
{
    public partial class Index : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            ComponentInfo.SetLicense("FREE-LIMITED-KEY");
            ComponentInfo.FreeLimitReached += (s1, e1) => e1.FreeLimitReachedAction = FreeLimitReachedAction.ContinueAsTrial;

            if (!this.Page.IsPostBack)
            {
                // Fill grid view with some default data.
                var dataTable = new DataTable();
                dataTable.Columns.Add("Name", typeof(string));
                dataTable.Columns.Add("Estimated", typeof(string));
                dataTable.Columns.Add("Change", typeof(string));

                dataTable.Rows.Add("Revenues", "$14.2M", "(0.5%)");
                dataTable.Rows.Add("Cash Expense", "$1.6M", "0.7%");
                dataTable.Rows.Add("Operating Expense", "$12.5M", "0.3%");
                dataTable.Rows.Add("Operating Income", "$2.3M", "(0.2%)");

                this.Session["highlightsDataTable"] = dataTable;

                this.SetDataBinding();
            }
        }

        private static void UpdatePresentation(PresentationDocument presentation, string title, string summaryHeading, string summaryBullets, string highlightsHeading, DataTable highlightsDataTable)
        {
            // Populate the first slide with data.
            var slide = presentation.Slides[0];
            var shape = (Shape)slide.Content.Drawings[0];
            if (!string.IsNullOrEmpty(title))
                shape.Text.Paragraphs[0].AddRun(title.Replace('\v', ' ').Replace('\r', ' ').Replace('\n', ' '));

            // Populate the second slide with data.
            slide = presentation.Slides[1];
            shape = (Shape)slide.Content.Drawings[0];
            if (!string.IsNullOrEmpty(summaryHeading))
                shape.Text.Paragraphs[0].AddRun(summaryHeading.Replace('\v', ' ').Replace('\r', ' ').Replace('\n', ' '));
            shape = (Shape)slide.Content.Drawings[1];
            shape.Text.Paragraphs.Clear();
            var summaryBulletLines = summaryBullets.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
            foreach (var summaryBulletLine in summaryBulletLines)
                shape.Text.AddParagraph().AddRun(summaryBulletLine.Replace('\v', ' ').Replace('\r', ' ').Replace('\n', ' '));

            // Populate the third slide with data.
            slide = presentation.Slides[2];
            shape = (Shape)slide.Content.Drawings[0];
            if (!string.IsNullOrEmpty(highlightsHeading))
                shape.Text.Paragraphs[0].AddRun(highlightsHeading.Replace('\v', ' ').Replace('\r', ' ').Replace('\n', ' '));
            var frame = (GraphicFrame)slide.Content.Drawings[1];
            var table = frame.Table;
            for (int i = table.Rows.Count - 1; i > 0; --i)
                table.Rows.RemoveAt(i);
            foreach (DataRow highlightDataRow in highlightsDataTable.Rows)
            {
                var row = table.Rows.AddNew(table.Rows[0].Height);

                var cell = row.Cells.AddNew();
                var value = (string)highlightDataRow["Name"];
                if (!string.IsNullOrEmpty(value))
                    cell.Text.AddParagraph().AddRun(value.Replace('\v', ' ').Replace('\r', ' ').Replace('\n', ' '));

                cell = row.Cells.AddNew();
                value = (string)highlightDataRow["Estimated"];
                if (!string.IsNullOrEmpty(value))
                    cell.Text.AddParagraph().AddRun(value.Replace('\v', ' ').Replace('\r', ' ').Replace('\n', ' '));

                cell = row.Cells.AddNew();
                value = (string)highlightDataRow["Change"];
                if (!string.IsNullOrEmpty(value))
                    cell.Text.AddParagraph().AddRun(value.Replace('\v', ' ').Replace('\r', ' ').Replace('\n', ' '));
            }
        }

        protected void generateButton_Click(object sender, EventArgs e)
        {
            string path = Path.Combine(Request.PhysicalApplicationPath, "Template.pptx");

            // Load template presentation.
            PresentationDocument presentation = PresentationDocument.Load(path);

            // Populate the template presentation with data.
            UpdatePresentation(presentation, this.titleTextBox.Text, this.summaryHeadingTextBox.Text, this.summaryBulletsTextBox.Text, this.highlightsHeadingTextBox.Text, (DataTable)Session["highlightsDataTable"]);

            // Stream the presentation to the browser.
            string fileName = "Presentation." + this.outputFormatRadioButton.SelectedValue;
            presentation.Save(this.Response, fileName);
        }

        protected void addRowLinkButton_Click(object sender, EventArgs e)
        {
            var dataTable = (DataTable)Session["highlightsDataTable"];
            dataTable.Rows.Add("", "", "");
            this.SetDataBinding();
        }

        protected void highlightsGridView_RowEditing(object sender, GridViewEditEventArgs e)
        {
            this.highlightsGridView.EditIndex = e.NewEditIndex;
            this.SetDataBinding();
        }

        protected void highlightsGridView_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            int i;
            int rowIndex = e.RowIndex;
            var dataTable = (DataTable)Session["highlightsDataTable"];

            for (i = 0; i < dataTable.Columns.Count; i++)
            {
                var editTextBox = this.highlightsGridView.Rows[rowIndex].Cells[i + 1].Controls[0] as System.Web.UI.WebControls.TextBox;

                if (editTextBox != null)
                    dataTable.Rows[rowIndex][i] = editTextBox.Text;
            }

            this.highlightsGridView.EditIndex = -1;
            this.SetDataBinding();
        }

        protected void highlightsGridView_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {
            this.highlightsGridView.EditIndex = -1;
            this.SetDataBinding();
        }

        protected void highlightsGridView_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            var dataTable = (DataTable)Session["highlightsDataTable"];

            dataTable.Rows[e.RowIndex].Delete();
            this.SetDataBinding();
        }

        private void SetDataBinding()
        {
            var dataTable = (DataTable)Session["highlightsDataTable"];

            DataView dataView = dataTable.DefaultView;
            this.highlightsGridView.DataSource = dataView;
            dataView.AllowDelete = true;

            this.highlightsGridView.DataBind();
        }
    }
}
Imports System.Data
Imports System.IO
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports GemBox.Presentation

Namespace MediumTrustSampleVb
    Partial Public Class Index
        Inherits Page
        Protected Sub Page_Load(sender As Object, e As EventArgs)
            ComponentInfo.SetLicense("FREE-LIMITED-KEY")
            AddHandler ComponentInfo.FreeLimitReached, Sub(s1, e1) e1.FreeLimitReachedAction = FreeLimitReachedAction.ContinueAsTrial

            If Not Me.Page.IsPostBack Then
                ' Fill grid view with some default data.
                Dim dataTable = New DataTable()
                dataTable.Columns.Add("Name", GetType(String))
                dataTable.Columns.Add("Estimated", GetType(String))
                dataTable.Columns.Add("Change", GetType(String))

                dataTable.Rows.Add("Revenues", "$14.2M", "(0.5%)")
                dataTable.Rows.Add("Cash Expense", "$1.6M", "0.7%")
                dataTable.Rows.Add("Operating Expense", "$12.5M", "0.3%")
                dataTable.Rows.Add("Operating Income", "$2.3M", "(0.2%)")

                Me.Session("highlightsDataTable") = dataTable

                Me.SetDataBinding()
            End If
        End Sub

        Private Shared Sub UpdatePresentation(presentation As PresentationDocument, title As String, summaryHeading As String, summaryBullets As String, highlightsHeading As String, highlightsDataTable As DataTable)
            ' Populate the first slide with data.
            Dim slide = presentation.Slides(0)
            Dim shape = DirectCast(slide.Content.Drawings(0), Shape)
            If Not String.IsNullOrEmpty(title) Then
                shape.Text.Paragraphs(0).AddRun(title.Replace(ControlChars.VerticalTab, " "c).Replace(ControlChars.Cr, " "c).Replace(ControlChars.Lf, " "c))
            End If

            ' Populate the second slide with data.
            slide = presentation.Slides(1)
            shape = DirectCast(slide.Content.Drawings(0), Shape)
            If Not String.IsNullOrEmpty(summaryHeading) Then
                shape.Text.Paragraphs(0).AddRun(summaryHeading.Replace(ControlChars.VerticalTab, " "c).Replace(ControlChars.Cr, " "c).Replace(ControlChars.Lf, " "c))
            End If
            shape = DirectCast(slide.Content.Drawings(1), Shape)
            shape.Text.Paragraphs.Clear()
            Dim summaryBulletLines = summaryBullets.Split(New String() {vbCr & vbLf}, StringSplitOptions.RemoveEmptyEntries)
            For Each summaryBulletLine In summaryBulletLines
                shape.Text.AddParagraph().AddRun(summaryBulletLine.Replace(ControlChars.VerticalTab, " "c).Replace(ControlChars.Cr, " "c).Replace(ControlChars.Lf, " "c))
            Next

            ' Populate the third slide with data.
            slide = presentation.Slides(2)
            shape = DirectCast(slide.Content.Drawings(0), Shape)
            If Not String.IsNullOrEmpty(highlightsHeading) Then
                shape.Text.Paragraphs(0).AddRun(highlightsHeading.Replace(ControlChars.VerticalTab, " "c).Replace(ControlChars.Cr, " "c).Replace(ControlChars.Lf, " "c))
            End If
            Dim frame = DirectCast(slide.Content.Drawings(1), GraphicFrame)
            Dim table = frame.Table
            For i As Integer = table.Rows.Count - 1 To 1 Step -1
                table.Rows.RemoveAt(i)
            Next
            For Each highlightDataRow As DataRow In highlightsDataTable.Rows
                Dim row = table.Rows.AddNew(table.Rows(0).Height)

                Dim cell = row.Cells.AddNew()
                Dim value = DirectCast(highlightDataRow("Name"), String)
                If Not String.IsNullOrEmpty(value) Then
                    cell.Text.AddParagraph().AddRun(value.Replace(ControlChars.VerticalTab, " "c).Replace(ControlChars.Cr, " "c).Replace(ControlChars.Lf, " "c))
                End If

                cell = row.Cells.AddNew()
                value = DirectCast(highlightDataRow("Estimated"), String)
                If Not String.IsNullOrEmpty(value) Then
                    cell.Text.AddParagraph().AddRun(value.Replace(ControlChars.VerticalTab, " "c).Replace(ControlChars.Cr, " "c).Replace(ControlChars.Lf, " "c))
                End If

                cell = row.Cells.AddNew()
                value = DirectCast(highlightDataRow("Change"), String)
                If Not String.IsNullOrEmpty(value) Then
                    cell.Text.AddParagraph().AddRun(value.Replace(ControlChars.VerticalTab, " "c).Replace(ControlChars.Cr, " "c).Replace(ControlChars.Lf, " "c))
                End If
            Next
        End Sub

        Protected Sub generateButton_Click(sender As Object, e As EventArgs)
            Dim path_ As String = Path.Combine(Request.PhysicalApplicationPath, "Template.pptx")

            ' Load template presentation.
            Dim presentation As PresentationDocument = PresentationDocument.Load(path_)

            ' Populate the template presentation with data.
            UpdatePresentation(presentation, Me.titleTextBox.Text, Me.summaryHeadingTextBox.Text, Me.summaryBulletsTextBox.Text, Me.highlightsHeadingTextBox.Text, DirectCast(Session("highlightsDataTable"), DataTable))

            ' Stream the presentation to the browser.
            Dim fileName As String = "Presentation." + Me.outputFormatRadioButton.SelectedValue
            presentation.Save(Me.Response, fileName)
        End Sub

        Protected Sub addRowLinkButton_Click(sender As Object, e As EventArgs)
            Dim dataTable = DirectCast(Session("highlightsDataTable"), DataTable)
            dataTable.Rows.Add("", "", "")
            Me.SetDataBinding()
        End Sub

        Protected Sub highlightsGridView_RowEditing(sender As Object, e As GridViewEditEventArgs)
            Me.highlightsGridView.EditIndex = e.NewEditIndex
            Me.SetDataBinding()
        End Sub

        Protected Sub highlightsGridView_RowUpdating(sender As Object, e As GridViewUpdateEventArgs)
            Dim i As Integer
            Dim rowIndex As Integer = e.RowIndex
            Dim dataTable = DirectCast(Session("highlightsDataTable"), DataTable)

            For i = 0 To dataTable.Columns.Count - 1
                Dim editTextBox = TryCast(Me.highlightsGridView.Rows(rowIndex).Cells(i + 1).Controls(0), System.Web.UI.WebControls.TextBox)

                If editTextBox IsNot Nothing Then
                    dataTable.Rows(rowIndex)(i) = editTextBox.Text
                End If
            Next

            Me.highlightsGridView.EditIndex = -1
            Me.SetDataBinding()
        End Sub

        Protected Sub highlightsGridView_RowCancelingEdit(sender As Object, e As GridViewCancelEditEventArgs)
            Me.highlightsGridView.EditIndex = -1
            Me.SetDataBinding()
        End Sub

        Protected Sub highlightsGridView_RowDeleting(sender As Object, e As GridViewDeleteEventArgs)
            Dim dataTable = DirectCast(Session("highlightsDataTable"), DataTable)

            dataTable.Rows(e.RowIndex).Delete()
            Me.SetDataBinding()
        End Sub

        Private Sub SetDataBinding()
            Dim dataTable = DirectCast(Session("highlightsDataTable"), DataTable)

            Dim dataView As DataView = dataTable.DefaultView
            Me.highlightsGridView.DataSource = dataView
            dataView.AllowDelete = True

            Me.highlightsGridView.DataBind()
        End Sub
        Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, value As T) As T
            target = value
            Return value
        End Function
    End Class
End Namespace

Check next sample.