Yes, you can include newlines (hard returns) in Excel cell values—including column headers—when generating Excel files with OpenXML or 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.
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
.
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
):
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 useEnvironment.NewLine
.
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
):
-
Create a new .NET 8 console app:
dotnet new console -n ExcelHeaderNewlineDemo cd ExcelHeaderNewlineDemo
-
Add required NuGet packages:
dotnet add package ClosedXML dotnet add package DocumentFormat.OpenXml
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();
}
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
.