Create Excel Files in .NET: No Office Required (Practical Guide)

If you need to generate Excel files from a .NET app, the good news is you don’t need Microsoft Office installed on the server (and you generally shouldn’t automate Excel via COM anyway). The modern approach is to generate .xlsx files directly using a library that writes the Open XML format.

Why you should avoid “Excel automation” on a server

Using Microsoft.Office.Interop.Excel (COM automation) is a common first attempt—and a common regret.

  • It requires Office installed and properly licensed on the machine
  • It’s not designed for server-side, multi-user, or service scenarios
  • It can hang, leak processes, and be hard to troubleshoot
  • It’s fragile in containers and CI/CD environments

If your goal is “create an Excel file,” you want a library that writes the file format directly.

Option A (recommended): Generate .xlsx with a dedicated library

Most .NET teams choose one of these approaches:

  • Open XML SDK (Microsoft): low-level, very flexible, more verbose
  • ClosedXML: developer-friendly API on top of Open XML
  • EPPlus: popular and capable (be mindful of licensing)
  • Xceed Workbooks for .NET: a .NET library focused on spreadsheet generation and manipulation

The right choice depends on your constraints:

  • Need a quick “export a DataTable to Excel”? → ClosedXML-style APIs tend to be fastest to implement
  • Need fine-grained control and maximum compatibility? → Open XML SDK
  • Need commercial support and predictable licensing for business use? → consider a commercial library

What “no Office installed” really means

When you generate .xlsx directly:

  • Your app creates a ZIP package containing XML parts (worksheets, styles, shared strings, etc.)
  • Excel (or any compatible viewer) opens it later on the user’s machine
  • Your server never launches Excel

This is ideal for web apps, APIs, background jobs, Azure Functions, Windows services, and containers.

Example: Create a simple .xlsx in .NET (ClosedXML)

Below is a minimal example that creates a workbook, adds headers, writes rows, and saves to disk.

  1. Install the package
  • dotnet add package ClosedXML
  1. Generate the file
using ClosedXML.Excel;

var path = Path.Combine(AppContext.BaseDirectory, "report.xlsx");

using var wb = new XLWorkbook();
var ws = wb.Worksheets.Add("Report");

// Headers
ws.Cell(1, 1).Value = "Date";
ws.Cell(1, 2).Value = "Customer";
ws.Cell(1, 3).Value = "Amount";

// Rows
var rows = new[]
{
  new { Date = DateTime.Today, Customer = "Acme", Amount = 1250.50m },
  new { Date = DateTime.Today.AddDays(-1), Customer = "Globex", Amount = 980.00m }
};

int r = 2;
foreach (var row in rows)
{
  ws.Cell(r, 1).Value = row.Date;
  ws.Cell(r, 2).Value = row.Customer;
  ws.Cell(r, 3).Value = row.Amount;
  r++;
}

ws.Columns().AdjustToContents();
wb.SaveAs(path);

Common upgrades you’ll want next

  • Format numbers and dates (currency, ISO dates, etc.)
  • Freeze header row
  • Apply a table style
  • Add multiple worksheets
  • Stream the file to the browser instead of saving to disk

Example: Return the Excel file from an ASP.NET Core endpoint

If you’re generating Excel in a web app, you’ll usually return it as a download.

using ClosedXML.Excel;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/reports")]
public class ReportsController : ControllerBase
{
  [HttpGet("sales.xlsx")]
  public IActionResult SalesReport()
  {
    using var wb = new XLWorkbook();
    var ws = wb.Worksheets.Add("Sales");
    ws.Cell(1, 1).Value = "Hello Excel";

    using var ms = new MemoryStream();
    wb.SaveAs(ms);
    ms.Position = 0;

    return File(
      fileContents: ms.ToArray(),
      contentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
      fileDownloadName: "sales-report.xlsx"
    );
  }
}

Option B: CSV (when you don’t need “real Excel” features)

If your “Excel file” is basically a grid of data and you don’t need formatting, multiple sheets, formulas, charts, or styling, CSV can be the simplest export.

Pros:

  • Extremely fast to generate
  • No dependencies
  • Opens in Excel

Cons:

  • No multiple sheets
  • No formatting
  • Locale issues (comma vs semicolon, decimal separators)

Troubleshooting checklist (the stuff that usually bites)

  • File extension: use .xlsx for Open XML spreadsheets
  • Encoding: for CSV, prefer UTF-8 with BOM if Excel users report weird characters
  • Large exports: stream results; avoid building huge in-memory structures
  • Dates & numbers: explicitly format to avoid Excel “helpfully” converting values
  • Security: never trust user input for formulas (CSV/Excel injection)

CTA: Want a faster spreadsheet export workflow?

If you’re building exports into Excel as part of your product (reports, audits, invoices, dashboards), consider using a spreadsheet library that’s designed for server-side generation—no Office dependencies, predictable behavior in production, and APIs that keep your code maintainable.

If you want, tell me your scenario (ASP.NET Core API, desktop app, background job), expected row count, and whether you need formatting/formulas/multiple sheets—and I’ll recommend the best approach.

FAQ

Do I need Microsoft Office installed to create Excel files in .NET?

No. You can generate .xlsx files directly using libraries that write the Open XML format. This is the standard approach for servers and cloud environments.

Is Microsoft.Office.Interop.Excel supported on a server?

It can work in limited cases, but it’s not recommended for server-side automation. It requires Office installed and is not designed for unattended, multi-user service scenarios.

What’s the best library to create Excel files in .NET?

It depends. Open XML SDK offers maximum control but is verbose. ClosedXML is easier for common exports. EPPlus is powerful but licensing matters. Commercial libraries can be a good fit if you need support and predictable licensing.

Can I generate Excel files in Linux containers?

Yes—if you’re generating .xlsx directly (Open XML). Avoid COM automation, which is Windows/Office-dependent.

How do I export large datasets to Excel without running out of memory?

Prefer streaming patterns, write rows incrementally when possible, and avoid building massive in-memory objects. If your dataset is extremely large, consider splitting into multiple sheets or using CSV.

Xceed Workbooks for .NET

Xceed Documentation Hub

Open XML SDK Docs

PDF Library for .Net is now out! Bundle it with Words for .Net for only 100$ for a limited time at checkout

add_action('wp_footer', function() { ?> document.addEventListener('DOMContentLoaded', function() { var cb = document.querySelector('#form-field-Email_Consent'); if (cb) cb.value = 'Yes'; } });