Tables and Ranges

Edit on GitHub

Excel tables with AutoFilter, data validation, and conditional formatting in OfficeIMO.Excel.

Tables and Ranges

OfficeIMO.Excel supports structured Excel tables with AutoFilter, built-in table styles, data validation rules, and conditional formatting. These features help create professional, interactive spreadsheets.

Creating a Table

Tables in Excel provide structured references, automatic filtering, and styling. Create a table by defining the data range and applying a style:

using OfficeIMO.Excel;

using var workbook = ExcelDocument.Create("tables.xlsx");
var sheet = workbook.AddWorkSheet("Sales");

// Populate data
sheet.Cells["A1"].Value = "Product";
sheet.Cells["B1"].Value = "Q1";
sheet.Cells["C1"].Value = "Q2";
sheet.Cells["A2"].Value = "Widget A";
sheet.Cells["B2"].Value = 15000;
sheet.Cells["C2"].Value = 18000;
sheet.Cells["A3"].Value = "Widget B";
sheet.Cells["B3"].Value = 22000;
sheet.Cells["C3"].Value = 25000;

// Create a table over the data range
sheet.AddTable("SalesTable", "A1:C3", TableStyle.Medium2);

workbook.Save();

Table Styles

OfficeIMO provides access to all of Excel's built-in table styles through the TableStyle enum:

CategoryExamples
LightTableStyle.Light1 through TableStyle.Light21
MediumTableStyle.Medium1 through TableStyle.Medium28
DarkTableStyle.Dark1 through TableStyle.Dark11
sheet.AddTable("MyTable", "A1:D10", TableStyle.Dark3);

Table Name Validation

Table names must be unique within a workbook. OfficeIMO validates this automatically:

// The workbook tracks table names for uniqueness
workbook.TableNameComparer = StringComparer.OrdinalIgnoreCase;

You can control validation behavior:

sheet.AddTable("MyTable", "A1:C5", TableStyle.Medium2,
    validationMode: TableNameValidationMode.ThrowOnInvalid);

AutoFilter

Tables automatically include AutoFilter (drop-down filters on each column header). When you create a table, filtering is enabled by default.

For standalone AutoFilter without a formal table:

sheet.SetAutoFilter("A1:C10");

Fluent Table Builder

The fluent API provides a declarative way to define tables:

using var workbook = ExcelFluentWorkbook.Create("fluent-table.xlsx")
    .Sheet("Data", s => s
        .Row(r => r.Cell("Name").Cell("Score").Cell("Grade"))
        .Row(r => r.Cell("Alice").Cell(95).Cell("A"))
        .Row(r => r.Cell("Bob").Cell(82).Cell("B"))
        .Row(r => r.Cell("Carol").Cell(91).Cell("A"))
        .Table("Grades", style: TableStyle.Medium9)
    )
    .Build();

workbook.Save();

Data Validation

Apply data validation rules to cells to restrict user input:

// Dropdown list validation
sheet.AddDataValidation("B2:B100",
    DataValidationType.List,
    formula: "\"High,Medium,Low\"");

// Numeric range validation
sheet.AddDataValidation("C2:C100",
    DataValidationType.Whole,
    minimum: "0",
    maximum: "100",
    errorMessage: "Value must be between 0 and 100");

// Date validation
sheet.AddDataValidation("D2:D100",
    DataValidationType.Date,
    minimum: "2025-01-01",
    maximum: "2025-12-31");

Conditional Formatting

Apply visual formatting rules based on cell values:

// Highlight cells greater than a threshold
sheet.AddConditionalFormatting("B2:B100",
    ConditionalFormattingRuleType.CellIs,
    operatorValue: ConditionalFormattingOperator.GreaterThan,
    formula: "10000",
    backgroundColor: "92D050");  // Green

// Highlight cells with specific text
sheet.AddConditionalFormatting("A2:A100",
    ConditionalFormattingRuleType.ContainsText,
    text: "Urgent",
    backgroundColor: "FF0000",   // Red background
    fontColor: "FFFFFF");        // White text

// Color scale (gradient from red to green)
sheet.AddColorScale("C2:C100",
    minColor: "FF0000",   // Red for low values
    maxColor: "00FF00");  // Green for high values

// Data bars
sheet.AddDataBars("D2:D100", color: "4472C4");

// Icon sets
sheet.AddIconSet("E2:E100", IconSetType.ThreeArrows);

DataTable Import

Import data from a DataTable directly into a sheet:

var dataTable = new System.Data.DataTable();
dataTable.Columns.Add("Name", typeof(string));
dataTable.Columns.Add("Value", typeof(double));
dataTable.Rows.Add("Item A", 100.5);
dataTable.Rows.Add("Item B", 200.75);

sheet.ImportDataTable(dataTable, startCell: "A1", includeHeaders: true);

Reading Tables

When loading an existing workbook, access defined tables:

using var workbook = ExcelDocument.Load("existing.xlsx");
var sheet = workbook.Sheets[0];

foreach (var table in sheet.Tables) {
    Console.WriteLine($"Table: {table.Name}, Range: {table.Reference}");
}