假设我有 3 个字节数组,每个代表一个 .xls 文件。我如何将它们组合成一个带有 3 张纸的 xls 文件。SSRS 报告非常丰富,并且包含图表 spoledb 不是一种选择。
性能并不重要,因此如果需要,我可以将它们保存到磁盘,作为最后的手段,我什至可以使用 excel 宏(如果我知道该怎么做的话)。我尝试使用 microsodt.office.interop.excel 但我只能设法将新工作表添加到文件中,我无法添加现有工作表。
任何帮助,将不胜感激。
假设我有 3 个字节数组,每个代表一个 .xls 文件。我如何将它们组合成一个带有 3 张纸的 xls 文件。SSRS 报告非常丰富,并且包含图表 spoledb 不是一种选择。
性能并不重要,因此如果需要,我可以将它们保存到磁盘,作为最后的手段,我什至可以使用 excel 宏(如果我知道该怎么做的话)。我尝试使用 microsodt.office.interop.excel 但我只能设法将新工作表添加到文件中,我无法添加现有工作表。
任何帮助,将不胜感激。
在我看来,您只需要一种以编程方式将字节数组写入工作簿的方法。
这是一种将 byte[] 作为工作表写入特定 WorkBook 的方法:
public static void WriteToSheet(string targetBookPath, byte[] fileBytes)
{
try {
object x = Type.Missing;
//Create a temp file to encapsulate Byte array
string tmpPath = IO.Path.ChangeExtension(IO.Path.GetTempFileName(), ".xls");
My.Computer.FileSystem.WriteAllBytes(tmpPath, fileBytes, false);
//Start Excel Application (COM)
Excel.Application xlApp = new Excel.Application();
//Open target book
Excel.Workbook targetBook = xlApp.Workbooks.Open(targetBookPath, x, x, x, x, x, x, x, x, x,
x, x, x, x, x);
//Open temp file with Excel Interop
Excel.Workbook sourceBook = xlApp.Workbooks.Open(tmpPath, x, x, x, x, x, x, x, x, x,
x, x, x, x, x);
//Get a reference to the desired sheet
Excel.Worksheet sourceSheet = (Excel.Worksheet)sourceBook.Worksheets(1);
//Copy the temp sheet into WorkBook specified as "Before" parameter
Excel.Worksheet targetBefore = (Excel.Worksheet)targetBook.Worksheets(1);
try {
sourceSheet.Copy(targetBefore, x);
//Save and Close
sourceBook.Close(false, x, x);
targetBook.Close(true, x, x);
xlApp.Workbooks.Close();
xlApp.Quit();
}
catch (Exception ex) {
Debug.Fail(ex.ToString);
}
finally {
//Release COM objects
// Source
DESTROY(sourceSheet);
DESTROY(sourceBook);
// Target
DESTROY(targetBefore);
DESTROY(targetBook);
// App
DESTROY(xlApp);
}
//Kill the temp file
My.Computer.FileSystem.DeleteFile(tmpPath);
}
catch (Exception ex) {
Debug.Fail(ex.ToString);
}
}
DESTROY 方法释放 COM 的东西,这很重要:
public static void DESTROY(object o)
{
try {
System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
}
catch (Exception ex) {
Debug.Fail(ex.ToString);
ErrorLog.Write(ex.ToString);
}
finally {
o = null;
}
}
如果我理解正确,您需要做的就是:
表格是否必须作为单独的报告生成然后合并?SoftArtisans OfficeWriter 可以通过编程方式组合来自字节数组的多个电子表格,但我们也有SSRS 集成,可让您直接创建多表报告。使用 OfficeWriter Designer Excel 插件,您可以直接在 Excel 中设计一个包含 3 个工作表的报告并将其发布到 SSRS。
免责声明:我为 SoftArtisans 工作
您可以在此处查看大量实时 ASP.NET 示例并在此处下载免费试用版。
有一个“带图表的工作表到带图表的多个工作表”示例,在此处的 Excel 报告示例页面上可能会有些用处。
免责声明:我拥有 SpreadsheetGear LLC