所以我想出了一个解决方法..
- 创建一个空工作簿的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;
foreach (string indexChecked in Properties.Settings.Default.PrintAllReports.Split(','))
{
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;
app.Workbooks.Add(saveFileDialog1.FileName);
}
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();
}
}
if (System.IO.File.Exists(saveFileDialog1.FileName))
{
try
{
System.IO.File.Delete(saveFileDialog1.FileName);
}
catch (System.IO.IOException)
{
}
}
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)
{
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();
}
}
欢迎提供任何意见或反馈。