ClosedXML / ClosedXML.Report

ClosedXML.Report is a tool for report generation with which you can easily export any data from your .NET classes to Excel using a XLSX-template.
https://closedxml.github.io/ClosedXML.Report/
MIT License
533 stars 111 forks source link

Conditional formatting breaks in template with multiple tables one below other #355

Open pledominykas opened 3 months ago

pledominykas commented 3 months ago

Conditional formatting breaks when used inside template with multiple tables one after the other.

Template broken: repro-template-broken.xlsx

Template working: repro-template-working.xlsx

Code:

using ClosedXML.Report;

var data = new
{
    Directors = new[]
    {
        new { Director = "Steven Spielberg", Movie = "Jaws" },
        new { Director = "Quentin Tarantino", Movie = "Pulp Fiction" },
        new { Director = "Steven Spielberg", Movie = "E.T." },
        new { Director = "Quentin Tarantino", Movie = "" },
        new { Director = "Steven Spielberg", Movie = "Jurassic Park" },
        new { Director = "Quentin Tarantino", Movie = "" },
        new { Director = "Steven Spielberg", Movie = "Indiana Jones" },
    },
    Genres = new[]
    {
        new { Movie = "Jaws", Genre = "Thriller" },
        new { Movie = "Pulp Fiction", Genre = "" },
        new { Movie = "E.T.", Genre = "Sci-Fi" },
        new { Movie = "Kill Bill", Genre = "" },
        new { Movie = "Jurassic Park", Genre = "Sci-Fi" },
        new { Movie = "Reservoir Dogs", Genre = "Thriller" },
        new { Movie = "Indiana Jones", Genre = "" },
        new { Movie = "E.T.", Genre = "Family" },
        new { Movie = "Jaws", Genre = "Horror" },
    },
    Actors = new[]
    {
        new { Movie = "Jaws", Actor = "Roy Scheider" },
        new { Movie = "Pulp Fiction", Actor = "John Travolta" },
        new { Movie = "E.T.", Actor = "" },
        new { Movie = "E.T.", Actor = "Henry Thomas" },
        new { Movie = "Kill Bill", Actor = "" }
    },
};

void GenerateWithClosedXML()
{
    const string outputFile = "./output.xlsx";
    var template = new XLTemplate(@"./repro-template-broken.xlsx");
    // var template = new XLTemplate(@"./repro-template-working.xlsx");

    template.AddVariable(data);
    template.Generate();

    template.SaveAs(outputFile);
}

GenerateWithClosedXML();

Repro steps:

  1. Run attached code
  2. Observe conditional formatting is applied in wrong place

Results: Template should color the cell in red if value is empty: image

However after generating the output conditional formatting breaks for the second table: image

Note: if the gap between tables is more than 4 lines conditional formatting is applied correctly (as seen in repro-template-working.xlsx)

pikami commented 2 months ago

This might be related to an issue in the ClosedXML package: https://github.com/ClosedXML/ClosedXML/issues/686