Powered by SpreadsheetGear
<%@ Page Language="C#" EnableViewState="false" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Gantt Chart using ASP.NET and C# - Returns Open XML (XLSX) Workbook Using SpreadsheetGear</title>
<meta content="Gantt Chart with ASP.NET, C# and SpreadsheetGear, a royalty free Microsoft Excel compatible spreadsheet component for the Microsoft .NET Framework featuring the fastest and most complete calculation engine available. Create, read, modify, calculate and write Microsoft Excel workbooks from your Microsoft .NET, ASP.NET, C#, VB.NET and Microsoft Office solutions. Integrates with Microsoft Visual Studio .NET, including IntelliSense and Dynamic Help." name="description" />
<script language="C#" runat="server">
     
    void Page_Load(Object sender, EventArgs e)
    {
        // Create a new workbook.
        SpreadsheetGear.IWorkbook workbook = SpreadsheetGear.Factory.GetWorkbook();
        SpreadsheetGear.IWorksheet worksheet = workbook.Worksheets["Sheet1"];
        SpreadsheetGear.IWorksheetWindowInfo windowInfo = worksheet.WindowInfo;
        SpreadsheetGear.IRange cells = worksheet.Cells;

        // Load category labels using multiple cell text reference and iteration.
        int task = 1;
        foreach (SpreadsheetGear.IRange cell in cells["A1:A8"])
            cell.Formula = "Task " + task++;
        
        // Start with zero and use formulas to calculate each additional start value.
        cells["B1"].Formula = "0";
        cells["B2:B8"].Formula = "=B1+C1";
        
        // Load random duration values
        cells["C1:C8"].Formula = "=INT(RAND() * 10) + 2";
        
        // Add a chart to the worksheet's shape collection.
        // NOTE: Calculate the coordinates of the chart by converting row
        //       and column coordinates to points.  Use fractional row 
        //       and colum values to get coordinates anywhere in between 
        //       row and column boundaries.
        double left = windowInfo.ColumnToPoints(3.0);
        double top = windowInfo.RowToPoints(1.0);
        double right = windowInfo.ColumnToPoints(10.0);
        double bottom = windowInfo.RowToPoints(18.0);
        SpreadsheetGear.Charts.IChart chart =
            worksheet.Shapes.AddChart(left, top, right - left, bottom - top).Chart;

        // Set the chart's source data range, plotting series in columns.
        SpreadsheetGear.IRange source = cells["A1:C8"];
        chart.SetSourceData(source, SpreadsheetGear.Charts.RowCol.Columns);

        // Set the chart type to stacked bar to simulate a gantt chart.
        chart.ChartType = SpreadsheetGear.Charts.ChartType.BarStacked;
        
        // Set the distance between bars as a percentage of the bar width.
        chart.ChartGroups[0].GapWidth = 100;
                
        // Hide the first (Start) series values by setting the fill to none.
        SpreadsheetGear.Charts.ISeries seriesStart = chart.SeriesCollection[0];
        seriesStart.Format.Fill.Visible = false;
        
        // Change the theme color of the second (Duration) series.
        SpreadsheetGear.Charts.ISeries seriesDuration = chart.SeriesCollection[1];
        seriesDuration.Format.Fill.ForeColor.ThemeColor = 
            SpreadsheetGear.Themes.ColorSchemeIndex.Accent3;
                
        // Reverse the category axis so that values are shown top to bottom.
        chart.Axes[SpreadsheetGear.Charts.AxisType.Category].ReversePlotOrder = true;
        
        // Add a chart title and change the font size.
        chart.HasTitle = true;
        chart.ChartTitle.Text = "Estimated Days To Completion";
        chart.ChartTitle.Font.Size = 12;

        // Delete the legend.
        chart.HasLegend = false;

        // Stream the Excel workbook to the client in the Open XML file
        // format compatible with Excel 2007-2019 and Excel for Office 365.
        Response.Clear();
        Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        Response.AddHeader("Content-Disposition", "attachment; filename=report.xlsx");
        workbook.SaveToStream(Response.OutputStream, SpreadsheetGear.FileFormat.OpenXMLWorkbook);
        Response.End();
    }
    
</script>
</head>
<body>
</body>
</html>