Skip to content

Instantly share code, notes, and snippets.

@stormwild
Last active April 29, 2025 16:16
Show Gist options
  • Save stormwild/5378ce8377ae14c229ab548020e09eb5 to your computer and use it in GitHub Desktop.
Save stormwild/5378ce8377ae14c229ab548020e09eb5 to your computer and use it in GitHub Desktop.

Excel Newline or Hard Return

Yes, you can include newlines (hard returns) in Excel cell values—including column headers—when generating Excel files with OpenXML or ClosedXML.


✅ With ClosedXML

You can insert a newline in a string using Environment.NewLine (or "\n"), and enable text wrapping:

var worksheet = workbook.Worksheets.Add("Sheet1");
worksheet.Cell("A1").Value = "PROGRAM" + Environment.NewLine + "_NUM";
worksheet.Cell("A1").Style.Alignment.WrapText = true;

📌 Tip: Environment.NewLine is platform-safe, but Excel also handles just "\n" fine.


✅ With OpenXML SDK

You must set the cell's value with a Text element that has xml:space="preserve" and use "\n" for the line break. You also need to enable text wrapping via cell style.

Example:

var cell = new Cell
{
    DataType = CellValues.InlineString,
    InlineString = new InlineString
    {
        Text = new Text { Text = "PROGRAM\n_NUM", Space = SpaceProcessingModeValues.Preserve }
    }
};

Then apply a CellFormat that sets ApplyAlignment = true and Alignment.WrapText = true.


📝 Excel Output

This will visually show as:

PROGRAM
_NUM

in the same cell.

Would you like a working sample for either OpenXML or ClosedXML?

Here are working samples for both ClosedXML and OpenXML SDK to generate an Excel file with a column header containing a newline (PROGRAM\n_NUM):


✅ ClosedXML Sample

using ClosedXML.Excel;

// Create a new workbook and worksheet
using var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Sample");

// Add a header with a newline
worksheet.Cell("A1").Value = "PROGRAM\n_NUM";

// Enable wrap text
worksheet.Cell("A1").Style.Alignment.WrapText = true;

// Optionally, auto-adjust row height and column width
worksheet.Columns().AdjustToContents();
worksheet.Rows().AdjustToContents();

// Save to file
workbook.SaveAs("closedxml_newline_header.xlsx");

📝 The \n works fine, but you can also use Environment.NewLine.


✅ OpenXML SDK Sample

This example uses OpenXML SDK DocumentFormat.OpenXml to do the same. You'll need to add the DocumentFormat.OpenXml NuGet package.

using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;

using var spreadsheet = SpreadsheetDocument.Create("openxml_newline_header.xlsx", SpreadsheetDocumentType.Workbook);

// Add workbook and worksheet parts
var workbookPart = spreadsheet.AddWorkbookPart();
workbookPart.Workbook = new Workbook();
var worksheetPart = workbookPart.AddNewPart<WorksheetPart>();

// Add sheet data
var sheetData = new SheetData();
worksheetPart.Worksheet = new Worksheet(sheetData);

// Create row and cell
var row = new Row();
var cell = new Cell
{
    DataType = CellValues.InlineString,
    InlineString = new InlineString
    {
        Text = new Text
        {
            Text = "PROGRAM\n_NUM",
            Space = SpaceProcessingModeValues.Preserve
        }
    }
};
row.Append(cell);
sheetData.Append(row);

// Create stylesheet with wrap text
var stylesheetPart = workbookPart.AddNewPart<WorkbookStylesPart>();
stylesheetPart.Stylesheet = new Stylesheet(
    new Fonts(new Font()), // Default font
    new Fills(new Fill()), // Default fill
    new Borders(new Border()), // Default border
    new CellFormats(
        new CellFormat(), // Index 0 - default
        new CellFormat { ApplyAlignment = true, Alignment = new Alignment { WrapText = true } } // Index 1
    )
);
stylesheetPart.Stylesheet.Save();

// Apply style index 1 (wrap text)
cell.StyleIndex = 1;

// Add the sheet
var sheets = spreadsheet.WorkbookPart.Workbook.AppendChild(new Sheets());
sheets.Append(new Sheet
{
    Id = spreadsheet.WorkbookPart.GetIdOfPart(worksheetPart),
    SheetId = 1,
    Name = "Sheet1"
});

spreadsheet.WorkbookPart.Workbook.Save();

Let me know if you want this wrapped in a console app template or if you want to add more styling (like borders or background color).

Here’s a complete .NET 8 Console App for both ClosedXML and OpenXML examples. The app generates two Excel files with a newline in the header cell (PROGRAM\n_NUM):


🧾 Project Setup

  1. Create a new .NET 8 console app:

    dotnet new console -n ExcelHeaderNewlineDemo
    cd ExcelHeaderNewlineDemo
  2. Add required NuGet packages:

    dotnet add package ClosedXML
    dotnet add package DocumentFormat.OpenXml

Program.cs

Replace the contents of Program.cs with:

using ClosedXML.Excel;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;

CreateWithClosedXml();
CreateWithOpenXml();

Console.WriteLine("Excel files created successfully.");

// ---------- CLOSEDXML ----------
static void CreateWithClosedXml()
{
    using var workbook = new XLWorkbook();
    var worksheet = workbook.Worksheets.Add("ClosedXML");

    worksheet.Cell("A1").Value = "PROGRAM\n_NUM";
    worksheet.Cell("A1").Style.Alignment.WrapText = true;

    worksheet.Columns().AdjustToContents();
    worksheet.Rows().AdjustToContents();

    workbook.SaveAs("ClosedXml_HeaderNewline.xlsx");
}

// ---------- OPENXML SDK ----------
static void CreateWithOpenXml()
{
    using var spreadsheet = SpreadsheetDocument.Create("OpenXml_HeaderNewline.xlsx", SpreadsheetDocumentType.Workbook);

    var workbookPart = spreadsheet.AddWorkbookPart();
    workbookPart.Workbook = new Workbook();

    var worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
    var sheetData = new SheetData();
    worksheetPart.Worksheet = new Worksheet(sheetData);

    // Define the row and cell
    var row = new Row();
    var cell = new Cell
    {
        DataType = CellValues.InlineString,
        InlineString = new InlineString
        {
            Text = new Text
            {
                Text = "PROGRAM\n_NUM",
                Space = SpaceProcessingModeValues.Preserve
            }
        },
        StyleIndex = 1
    };
    row.Append(cell);
    sheetData.Append(row);

    // Add styles with wrap text
    var stylesPart = workbookPart.AddNewPart<WorkbookStylesPart>();
    stylesPart.Stylesheet = new Stylesheet(
        new Fonts(new Font()), // Default font
        new Fills(new Fill()), // Default fill
        new Borders(new Border()), // Default border
        new CellFormats(
            new CellFormat(), // Index 0 - default
            new CellFormat
            {
                ApplyAlignment = true,
                Alignment = new Alignment { WrapText = true }
            }
        )
    );
    stylesPart.Stylesheet.Save();

    // Create Sheets collection
    var sheets = spreadsheet.WorkbookPart.Workbook.AppendChild(new Sheets());
    sheets.Append(new Sheet
    {
        Id = spreadsheet.WorkbookPart.GetIdOfPart(worksheetPart),
        SheetId = 1,
        Name = "OpenXML"
    });

    spreadsheet.WorkbookPart.Workbook.Save();
}

✅ To Run

dotnet run

It will create:

  • ClosedXml_HeaderNewline.xlsx
  • OpenXml_HeaderNewline.xlsx

with wrapped headers like:

PROGRAM
_NUM

Let me know if you'd like to package this or export it to other formats like .csv or .pdf.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment