Skip to content
Sveinung edited this page Feb 8, 2026 · 4 revisions

Basic example

await using var outputStream = File.Create("table-basic.xlsx");
await using var spreadsheet = await Spreadsheet.CreateNewAsync(outputStream);

var worksheetOptions = new WorksheetOptions();
worksheetOptions.Column(2).Width = 18;
await spreadsheet.StartWorksheetAsync("Sheet", worksheetOptions);

var table = new Table(TableStyle.Light9);
spreadsheet.StartTable(table);

string[] headerNames = ["City", "Temperature (°C)"];
DataCell[] paris = [new DataCell("Paris"), new DataCell(14)];
DataCell[] bangkok = [new DataCell("Bangkok"), new DataCell(34)];

await spreadsheet.AddHeaderRowAsync(headerNames);
await spreadsheet.AddRowAsync(paris);
await spreadsheet.AddRowAsync(bangkok);

await spreadsheet.FinishAsync();

Result

image

Example with total row

await using var outputStream = File.Create("table-total-row.xlsx");
await using var spreadsheet = await Spreadsheet.CreateNewAsync(outputStream);

var worksheetOptions = new WorksheetOptions();
worksheetOptions.Column(2).Width = 18;
await spreadsheet.StartWorksheetAsync("Sheet", worksheetOptions);

var table = new Table(TableStyle.Medium3);
table.Column(1).TotalRowLabel = "Average";
table.Column(2).TotalRowFunction = TableTotalRowFunction.Average;
spreadsheet.StartTable(table);

string[] headerNames = ["City", "Temperature (°C)"];
DataCell[] paris = [new DataCell("Paris"), new DataCell(14)];
DataCell[] bangkok = [new DataCell("Bangkok"), new DataCell(34)];

await spreadsheet.AddHeaderRowAsync(headerNames);
await spreadsheet.AddRowAsync(paris);
await spreadsheet.AddRowAsync(bangkok);

await spreadsheet.FinishAsync();

Result

image

Example with multiple tables

A worksheet can have multiple tables, but only one table can be active at a time. Before starting a new table, the previous table must be finished by calling FinishTableAsync.

await using var outputStream = File.Create("table-multiple.xlsx");
await using var spreadsheet = await Spreadsheet.CreateNewAsync(outputStream);

var worksheetOptions = new WorksheetOptions();
worksheetOptions.Column(2).Width = 18;
await spreadsheet.StartWorksheetAsync("Sheet", worksheetOptions);

string[] headerNames = ["City", "Temperature (°C)"];

var table1 = new Table(TableStyle.Dark5);
spreadsheet.StartTable(table1);
await spreadsheet.AddHeaderRowAsync(headerNames);
await spreadsheet.AddRowAsync([new DataCell("Paris"), new DataCell(14)]);
await spreadsheet.AddRowAsync([new DataCell("Bangkok"), new DataCell(34)]);
await spreadsheet.FinishTableAsync();

await spreadsheet.AddRowAsync([]);

var table2 = new Table(TableStyle.Dark6);
spreadsheet.StartTable(table2);
await spreadsheet.AddHeaderRowAsync(headerNames);
await spreadsheet.AddRowAsync([new DataCell("Dakar"), new DataCell(21)]);
await spreadsheet.AddRowAsync([new DataCell("Lima"), new DataCell(24)]);
await spreadsheet.FinishTableAsync();

await spreadsheet.FinishAsync();

Result

image

Example with calculated column

A calculated column can be created with a formula. Note that formulas must use the Open XML syntax, which in some cases has some differences compared to the formula syntax in Excel. E.g. [#This Row], in the Open XML syntax is equivalent to @ in the Excel syntax.

await using var outputStream = File.Create("table-calculated-column.xlsx");
await using var spreadsheet = await Spreadsheet.CreateNewAsync(outputStream);

var worksheetOptions = new WorksheetOptions();
worksheetOptions.Column(1).Width = 18;
await spreadsheet.StartWorksheetAsync("Sheet", worksheetOptions);

var table = new Table(TableStyle.Medium4, "MyProductTable");
spreadsheet.StartTable(table);

string[] headerNames = ["Product", "Qtr 1", "Qtr 2", "Total"];
var grandTotalFormula = new Formula("SUM(MyProductTable[[#This Row],[Qtr 1]:[Qtr 2]])");
Cell[] chocolate = [new("Chocolate"), new(744), new(162), new Cell(grandTotalFormula)];
Cell[] tomatoes = [new("Tomatoes"), new(345), new(377), new Cell(grandTotalFormula)];

await spreadsheet.AddHeaderRowAsync(headerNames);
await spreadsheet.AddRowAsync(chocolate);
await spreadsheet.AddRowAsync(tomatoes);

await spreadsheet.FinishAsync();

Result

image

Example with cell styling

The cells in the main part of a table can be styled like regular cells. Cells in the total row can be styled by using TotalRowStyle on table column options:

await using var outputStream = File.Create("table-total-row.xlsx");
await using var spreadsheet = await Spreadsheet.CreateNewAsync(outputStream);

var worksheetOptions = new WorksheetOptions();
worksheetOptions.Column(2).Width = 18;
await spreadsheet.StartWorksheetAsync("Sheet", worksheetOptions);

var table = new Table(TableStyle.Medium3);
table.Column(1).TotalRowLabel = "Average";
table.Column(2).TotalRowFunction = TableTotalRowFunction.Average;
table.Column(2).TotalRowStyle = new Style { Fill = { Color = Color.Red } };
spreadsheet.StartTable(table);

var greenStyle = new Style { Fill = { Color = Color.Green } };
var greenStyleId = spreadsheet.AddStyle(greenStyle);

string[] headerNames = ["City", "Temperature (°C)"];
Cell[] paris = [new Cell("Paris"), new Cell(14, greenStyleId)];
Cell[] bangkok = [new Cell("Bangkok"), new Cell(34, greenStyleId)];

await spreadsheet.AddHeaderRowAsync(headerNames);
await spreadsheet.AddRowAsync(paris);
await spreadsheet.AddRowAsync(bangkok);

await spreadsheet.FinishAsync();

Result

table style

Clone this wiki locally