One possibility which I successfully tested recently is to use the Office Web
Components. I created a dataform web part in SharePoint Designer that got the
data I wanted. I added a spreadsheet control to the page. I then hacked the xslt
of the dataform so that instead of outputting html, it output JavaScript that
pushed the data into the spreadsheet. This creates a spreadsheet embedded in the
page, and it has an "export to Excel" button in the toolbar. (Note that it is
possible to make the dataform do a cross list query by hacking the datasource
parameters.)
The office web components are no longer being updated, but the Office 2003 ones
are still supported with Office 2007. The main drawbacks are that they need to
be installed on the client desktop for this to work, and they will only work in
IE. However, you don't need the client to be licensed for Office if you set the
properties of the component to read-only.
An alternative I thought of would be to hack the dataform to output XML
spreadsheet data into an iFrame on the page to load Excel, but my attempts to
get this to work failed, often crashing SharePoint Designer. I couldn't even get
it to work with simple hard coded data.