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.
  • SkipRows skips the first N rows of every joined file, e.g., a header row. The first document is always taken in full. SkipRows and SheetMatching have no effect in Worksheets mode.
  • 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 SkipRows throws GroupDocsMergerException (“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.
  • ApplyPageBuilder throws GroupDocsMergerException while a spreadsheet joined in Rows mode 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) throws InvalidOperationException (“License not found: …”) when the license file cannot be found.
  • License.SetLicense(Stream licenseStream) throws ArgumentNullException for an empty stream.

4. Page operations with an empty page list

  • ExtractPages and RemovePages called with no page numbers now throw GroupDocsMergerException (“There are no page numbers to extract.” / “There are no page numbers to remove.”).
  • ChangeOrientation called 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 on System.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 PageBuilder is now applied to the first TIFF document as well — previously all of its pages were always included.
  • Accurate preview dimensions: GeneratePreview now returns images at the requested Width and Height for 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

Direct download

Resources