I'd like to share a little information related to Christian's answer. We built a component following the concepts laid out in the developer blog: Transforming Report Data for Lightning Component by D. Peter. I love this approach because it allows us to modify reports for our clients without going into the code of the component to update the report. We have delegated the content of these reports to the business side, so they can update them on the fly.
However, we've recently run into issues with it on large datasets due to CPU timeouts. This approach creates objects for each individual cell in each row of the report, so as the report gets bigger it takes longer to generate.
For reference, we currently have 3 reports that we're using this for:
- Reports 1 & 2 have about 10 groups and 2000 records, these take about 30 seconds to load
- Report 3 has about 800 groups and 2000 records, these time out.
Update: We were able to improve the component by making the rendering asynchronous. I wrote a blog post outlining the strategy: Salesforce Lightning Reports Component Optimization There isn't a lot of code besides a few references to methods, but the strategy should be useful to solving similar problems.