使用c#reportviewer中的filestream创build新的excel工作表

我有这个代码来呈现一个reportviewer :

Warning[] warnings; string[] streamids; string mimeType; string encoding; string extension; FileStream fs = new FileStream(@"c:\output.xls", FileMode.Create); foreach (ReportViewer report in this.reports) { byte[] bytes = report.LocalReport.Render("Excel", null, out mimeType, out encoding, out extension, out streamids, out warnings); fs.Write(bytes, 0, bytes.Length); } fs.Close(); 

我的问题是,只有第一个报告可以在excel文件中以报告的名称作为工作表名称。 它看起来好像其余的 (文件大小增加),但没有正确格式。

我如何使每个报告进入不同的工作表?

笔记:

我尝试添加一个设备信息string为startpage = 0,但是这也没有帮助。

我试图避免使用额外的库来实现这一点,它是一个非常轻量级的程序的一部分。

类似的未答复的问题: https : //stackoverflow.com/questions/20763129/how-to-export-data-to-excel-via-reportviewer-with-multiple-named-worksheets

所以我想明白了

  • 创build一个空的工作簿的Excel对象
  • 将每个报告呈现给输出文件
  • 渲染后,作为另一个工作簿加载文件到Excel对象中
  • 为每个报告重复步骤2和3(覆盖Excel文件)
  • 将每个工作簿复制到第一个
  • 将工作簿保存在所需的文件上

有点疯狂,但它的工作,只使用由savefiledialog指定的文件,所以它的一切安全和良好的去:

 FileStream fs = null; Microsoft.Office.Interop.Excel.Application app = null; try { app = new Microsoft.Office.Interop.Excel.Application(); app.Workbooks.Add(""); Warning[] warnings; string[] streamids; string mimeType; string encoding; string extension; // Uses a string of comma separated ints to determine which reports to print foreach (string indexChecked in Properties.Settings.Default.PrintAllReports.Split(',')) { // Create temp file fs = new FileStream(saveFileDialog1.FileName, FileMode.Create); byte[] bytes = this.reports[Convert.ToInt32(indexChecked)].LocalReport.Render("EXCELOPENXML", null, out mimeType, out encoding, out extension, out streamids, out warnings); fs.Write(bytes, 0, bytes.Length); fs.Close(); fs = null; // Add copy of workbook app.Workbooks.Add(saveFileDialog1.FileName); } // Process each workbook and combine // http://stackoverflow.com/questions/7376964/how-to-merge-two-excel-workbook-into-one-workbook-in-c for (int i = app.Workbooks.Count; i >= 2; i--) { int count = app.Workbooks[i].Worksheets.Count; app.Workbooks[i].Activate(); for (int j = 1; j <= count; j++) { Microsoft.Office.Interop.Excel._Worksheet ws = (Microsoft.Office.Interop.Excel._Worksheet)app.Workbooks[i].Worksheets[j]; ws.Select(Type.Missing); ws.Cells.Select(); Microsoft.Office.Interop.Excel.Range sel = (Microsoft.Office.Interop.Excel.Range)app.Selection; sel.Copy(Type.Missing); Microsoft.Office.Interop.Excel._Worksheet sheet = (Microsoft.Office.Interop.Excel._Worksheet)app.Workbooks[1].Worksheets.Add( Type.Missing, Type.Missing, Type.Missing, Type.Missing ); sheet.Paste(Type.Missing, Type.Missing); sheet.Name = ws.Name; Clipboard.Clear(); app.Workbooks[i].Close(); } } // Remove it if it exists, we already asked once if (System.IO.File.Exists(saveFileDialog1.FileName)) { try { System.IO.File.Delete(saveFileDialog1.FileName); } catch (System.IO.IOException) { // It will ask and then overwrite in the next step if the delete failed } } app.Workbooks[1].SaveAs(saveFileDialog1.FileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange, XlSaveConflictResolution.xlLocalSessionChanges); app.Workbooks[1].Close(); app = null; } catch (IOException) { // uses a wrapper method this.showErrorDialog("Report Generator cannot access the file '" + saveFileDialog1.FileName + "'. There are several possible reasons:\n\n\u2022 The file name or path does not exist.\n\u2022 The file is being used by another program."); } finally { if (fs != null) { fs.Close(); } if (app != null) { app.Workbooks.Close(); } } 

任何input/反馈是受欢迎的。