2014-06-26 36 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