I can't speak for whether it would be any faster, but a couple of years ago, I generated some nightly reports using
Spreadsheet::WriteExcel. As I recall, we exported data to csv, then used this module to prepare it for distribution. In fact, here is one that could have saved us a few steps. Perhaps it could nudge your performance. See:
Spreadsheet::WriteExcel::FromDB. Hope that might help.
-- Hugh