Чтобы обойти эту проблему с веб-интерфейса (который сводил меня с ума с помощью веб-элемента управления ReportViewer), я понял, что SSRS возвращает данные в виде байтового массива, который затем можно обработать. Таким образом, захват потока в .NET вы можете написать метод, который делает что-то вроде:
private byte[] ExportStream(string streamType, out string mimeType, out string extension)
{
Microsoft.Reporting.WebForms.Warning[] warnings;
string[] streamids;
string encoding;
string deviceInfo = "<DeviceInfo><SimplePageHeaders>True</SimplePageHeaders></DeviceInfo>"
byte[] bytes = ReportViewerClientReport.ServerReport.Render(streamType,
deviceInfo, out mimeType, out encoding, out extension, out streamids, out warnings);
return bytes;
}
Затем постобработайте выходные данные этого метода с помощью чего-то вроде фантастической библиотеки NPOI из http://npoi.codeplex.com/ в виде байтов или создайте некоторый поток памяти, затем вы можете заставить его делать все, что захотите.
Также обратите внимание, что SSRS (Sql Server Reporting Services) R2 будет иметь эту функцию, но она появится примерно в мае 2010 года. http://www.bidn.com/blogs/bretupdegraff/bidn-blog/234/new-features-of-ssrs-2008-r2-part-1-naming-excel-sheets-when-exporting-reports