2014-06-26 89 views
2

在我的应用程序中,我尝试创建一个接受表格json数据并将该json数据转换为Excel文件流并发送回客户端的WCF服务。因此,创建Excel文件,我使用的是使用互操作服务使用Interop Services for WCF服务创建Excel文件流

 object misValue = System.Reflection.Missing.Value; 

     var xlApp = new Excel.Application(); 
     var xlWorkBook = xlApp.Workbooks.Add(misValue); 

     var xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.Item[1]; 
     xlWorkSheet.Cells[1, 1] = "FirstName"; 
     xlWorkSheet.Cells[1, 2] = "Last Name"; 
     xlWorkSheet.Cells[1, 3] = "Age"; 


     xlWorkSheet.Cells[2, 1] = "Stezma"; 
     xlWorkSheet.Cells[2, 2] = "Seb"; 
     xlWorkSheet.Cells[2, 3] = "25"; 

     xlWorkBook.SaveAs("csharp-Excel.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); 
     xlWorkBook.Close(true, misValue, misValue); 
     xlApp.Quit(); 

**这里我的疑惑是**

  1. 是不是最好使用互操作服务这个要求,如果没有下面的代码什么是我可以去创建Excel文件流的其他选择。

  2. 如果建议如何创建该excel文件创建的流,目前这些文件保存在机器的文档文件夹中。我不想将文件保存到本地文件夹,我如何通过互操作方法获取该文件的流。

+0

重复http://stackoverflow.com/questions/24436298/how-to-create-a-excel-file-using-wcf-service? –

+0

哪个问题?该链接被破坏。 – StezPet

+0

对不起,我回答了其他问题,但它已被作者删除。 –

回答

0

该Excel Interop将工作。但是,你必须小心。您必须使用System.Runtime.InteropServices.Marshal.ReleaseComObject手动处理互操作对象。此外,在使用Interop时,您必须避免使用属性/“Double Dots”。

Cleaning up Excel Interop

不这样做,将导致Excel应用程序进程拒绝关闭。这会导致严重的内存泄漏,最终会导致服务器崩溃!

如果您希望避免互操作的所有问题,我会建议使用Visual Studio Tools for Office (VSTO)。它处理所有的清理工作,同时提供比互操作更多的控制。

但是,VSTO需要本地Office安装。

如果您只是在添加数据,您可以使用Access的数据库驱动器ACE和OLEDB访问Excel文件。 Writing to Excel with OLEDB

对于数据事务,OLEDB是快速和轻量级的,并将Excel视为另一个数据库。但是,它无法调整文件的任何其他方面,如格式。它也运行在直接的SQL上,因此创建自定义SQL字符串可能会很痛苦。

不幸的是,这些方法都不支持“仅流式传输”。 Interop和VSTO将在打开新的WorkBook时在临时文件夹中创建一个WorkBook。另外,如果OLEDB没有找到文件,它只会创建一个新文件。

即使某人在办公桌上手动打开Excel文件来执行电子表格工作,Office也会在临时文件夹中创建一个副本。 “保存”按钮仅用临时副本覆盖原稿。

因此,如果“永远不会将文件保存到磁盘,即使是临时文件夹”,您也必须探索第三方工具。

“发送文件到客户端”方法将与任何其他文件的方法相同。 Excel在这方面并不特别。下载方法的一个例子:example