We’re happy to announce the release of GroupDocs.Merger for .NET v26.9, available as of September 2026. This release introduces row-wise joining of spreadsheets, improves TIFF page selection via PageBuilder, enhances preview dimension handling, resolves concurrency issues with Visio and DOC output, and replaces several silent failure modes with clear exceptions—making the API more robust and predictable.
What’s new in this release
- [Feature] Merge Excel rows from multiple files into a single sheet (MERGERNET-2198)
- [Feature] Apply the PageBuilder page selection to the first TIFF document (MERGERNET-1372)
- [Improvement] Throw an exception when SetLicense cannot find the license file (MERGERNET-2183)
- [Improvement] Reject an empty license stream in SetLicense (MERGERNET-2184)
- [Improvement] Throw a clear exception when joining an image or audio file into an unsupported format (MERGERNET-2190)
- [Improvement] Drop System.Drawing.Common from the cross-platform packages and report missing dependencies clearly (MERGERNET-2202)
- [Bug] Close the source file after Merger opens or joins a document by path (MERGERNET-2187)
- [Bug] Call the stream factory only once when constructing Merger (MERGERNET-2189)
- [Bug] Fix corrupt DOC output when joining PDF or XPS documents into DOC from multiple threads (MERGERNET-2192)
- [Bug] Apply a page orientation change to every page when no page numbers are specified (MERGERNET-2194)
- [Bug] Honour the requested preview Width and Height in every document format family (MERGERNET-2196)
- [Bug] Reject ExtractPages and RemovePages called with no page numbers instead of silently producing an empty or unchanged document (MERGERNET-2197)
- [Bug] Fix Visio documents intermittently failing with ArgumentNullException trueTypeFont when processed concurrently (MERGERNET-2199)
- [Bug] Fix PDF portfolios failing with NullReferenceException when an embedded file has no modification date (MERGERNET-2200)
Public API changes
1. Spreadsheet joining — row-wise mode (new API)
New public types in the GroupDocs.Merger.Domain.Options namespace:
| Type | Description |
|---|---|
| SpreadsheetJoinOptions | Join options for spreadsheets, derived from PageJoinOptions. Properties: Mode, SkipRows, SheetMatching. |
| SpreadsheetJoinMode | Worksheets (default) adds the sheets of the joined file as separate worksheets, as before. Rows appends the rows of each joined file below the last row containing data of the matching sheet of the result. |
| SpreadsheetSheetMatching | ByIndex (default) appends sheet 2 to sheet 2, sheet 3 to sheet 3, etc.; FirstSheetOnly appends only the first sheet of each joined file. |
SkipRowsskips the first N rows of every joined file, e.g., a header row. The first document is always taken in full.SkipRowsandSheetMatchinghave no effect inWorksheetsmode.- Supported formats: XLSX, XLS, XLSM, XLSB, XLTX, XLTM, XLT, XLAM and ODS.
- Carried over: cell values, formulas (relative references adjusted), styles, merged cells and row heights. Not carried over: charts, pictures, pivot tables, tables, conditional formatting and data validation.
- A negative
SkipRowsthrowsGroupDocsMergerException(“The count of rows to skip can not be negative.”). - Exceeding row limits (65,536 for XLS/XLT, 1,048,576 for others) throws
GroupDocsMergerException. ApplyPageBuilderthrowsGroupDocsMergerExceptionwhile a spreadsheet joined inRowsmode is pending.
2. TIFF — PageBuilder applies the first document’s page selection
No API change. CreatePageBuilder and ApplyPageBuilder now apply the pages selected from the first TIFF document; previously all pages of the first document were always included. Joins that do not use PageBuilder produce the same result as before.
After a join with ImageJoinOptions, CreatePageBuilder and ApplyPageBuilder now throw GroupDocsMergerException, because joined images are composed into one layout rather than a page sequence.
3. Licensing — SetLicense no longer fails silently
License.SetLicense(string licensePath)throwsInvalidOperationException(“License not found: …”) when the license file cannot be found.License.SetLicense(Stream licenseStream)throwsArgumentNullExceptionfor an empty stream.
4. Page operations with an empty page list
ExtractPagesandRemovePagescalled with no page numbers now throwGroupDocsMergerException(“There are no page numbers to extract.” / “There are no page numbers to remove.”).ChangeOrientationcalled with no page numbers now changes the orientation of every page for PDF, XPS, Word processing, spreadsheet and Visio documents.
5. Preview size
GeneratePreview now resizes every page image to the requested Width and Height — stretched to exactly that size when both are given. A negative Width or Height now throws GroupDocsMergerException.
6. System.Drawing.Common and missing dependencies
- Cross-platform packages (
GroupDocs.Merger.Net60,GroupDocs.Merger.Net80,GroupDocs.Merger.Net100) no longer depend onSystem.Drawing.Common. - Missing runtime dependencies now throw
MissingDependencyException, naming the missing component and installation instructions.
7. Joining images and audio into unsupported formats
Joining an image or audio file into an unsupported document format now throws FileTypeNotSupportedException (“Joining ‘…’ into ‘…’ is not supported”).
New features
- Row-wise spreadsheet joining: Rows of several spreadsheets can now be appended into a single sheet instead of being added as separate worksheets, with options to skip header rows and match sheets by position.
- PageBuilder for TIFF documents: A page selection made with
PageBuilderis now applied to the first TIFF document as well — previously all of its pages were always included. - Accurate preview dimensions:
GeneratePreviewnow returns images at the requestedWidthandHeightfor every document format family. - Concurrency fixes: Visio and DOC output no longer fail intermittently when processed from multiple threads.
- Resource handling: Documents opened or joined by file path no longer keep the source file open; stream factories are called exactly once.
- Clearer errors: Several operations that previously failed silently now throw descriptive exceptions.
Code example
using GroupDocs.Merger;
using GroupDocs.Merger.Domain.Options;
using (var merger = new Merger("january.xlsx"))
{
var options = new SpreadsheetJoinOptions
{
Mode = SpreadsheetJoinMode.Rows, // append rows into the existing sheets
SkipRows = 1 // skip the header row of each joined file
};
merger.Join("february.xlsx", options);
merger.Join("march.xlsx", options);
merger.Save("q1.xlsx");
}
How to get the update
NuGet
- Package: GroupDocs.Merger 26.9.0
- Install command:
dotnet add package GroupDocs.Merger --version 26.9.0