2013-07-17 55 views
-2

我正在開發一個硒應用程序。 Selenium訪問我的SharePoint站點並從那裏下載一個Excel表。現在,忘了硒。c#處理我的excel文檔

我希望c#能夠處理打開的excel表單。處理在某種意義上,我想做一些過濾,並將所有值(過濾後)存儲到一個臨時變量中?這可能嗎?

我該如何實現這個目標?

任何意見將非常有幫助。

+0

當你Google'd「C#處理Excel值」,你發現了什麼? – sq33G

+0

@ sq33G大概這篇文章...遞歸:) –

+0

沒有人似乎建議使用Excel作爲數據源 – sq33G

回答

1

是的,這是可能的。 Office Interop容易找到但很難做到的解決方案:例如打開excel並強制它執行你的程序。這有效,但是很冒險,速度慢並且很難調試。 我會推薦EPPLUS - 這可以很容易地打開和修改xlsx文件,並且與excle interop相比,速度非常快。它是免費的http://epplus.codeplex.com/

+0

還有一個用於在沒有Interop的情況下使用Excel的SDK。 –

+0

@Christian Sauer:看起來不錯。但是它如何解決我的問題? – vysakh

+0

@PanagiotisKanavos是的 - Office Open XML SDK - 由EPPLUS使用。你可以爲自己完成所有的管道工作,但這是痛苦的,並會像沒事一樣把你的男人吃掉。 –

0

這是可行的互操作性,檢查此鏈接 http://www.dotnetperls.com/excel。 你既可以通過excel進行過濾,也可以加載自己對象中的所有列,然後使用C#進行過濾,無論你喜歡什麼。

1

Office文檔一般使用的官方方式是使用Microsoft自己的Open XML SDK來處理Office XML文件(docx,xl​​sx等)。您無需在計算機上安裝Excel即可使用SDK。你可以找到文檔和示例在「Working with Open XML and Excel

使用互操作是一個可怕的想法與Excel文件的工作,因爲你必須爲每一個文件,你必須保證,當你完成它關閉創建一個Excel的新實例。對於多個線程可能試圖同時使用Excel文件的服務器應用程序(例如網站)來說,這是一個難以解決的情況。 Excel Interop是一種快速關閉服務器的方法。

+0

但是,這個SDK如何解決我的問題?對不起..我沒有得到你... – vysakh

+0

這是用於開放,讀取和寫入Office文件的SDK,包括Excel –

+0

所以,它的東西是可下載的內容,應該從本地機器下載,從該程序獲取executed..right? – vysakh

1

已經有一些解決方案,那裏有如何處理與C#的Word/Excel/Powerpoint文件。我實際上只是重複他們所說的話,但我會提供更多的代碼。我不得不開發一個允許自動化的軟件和你需要問自己的第一個問題,時間限制是什麼。這就是我爲什麼要這樣做的原因,因爲它的實施速度非常快。你可以找到一些有關在這裏:

http://msdn.microsoft.com/fr-fr/library/microsoft.office.interop.excel.application%28v=office.11%29.aspx

由於一些限制使用對象,你可以看看NetOffice,這實際上做了相同的功能比微軟Office提供的,但它可以幫助你處理對象更輕鬆。

http://netoffice.codeplex.com/

說實話,如果你上傳Microsoft或NetOffice論壇,涉及互操作與微軟任何編程問題,將是一項付費服務​​,你不會有那麼快答覆。在這種情況下,你必須自己查看。 現在OpenXML:http://openxmldeveloper.org/ 我不能告訴你很多關於它的信息,因爲它需要更多的時間和更多的知識來使用它,但是你會發現很多視頻如何使用它,以及如何使用它處理對象/對象的替換。此外,它也是OpenXML的一個專業版,它成爲標準,並由微軟論壇的管理員推薦。 Microsoft Office Interop Con - >服務器管理和自動化將不起作用,具體取決於服務器配置。你也可能會遇到很多COM設置問題,這會導致很多小時/天的調試。 我希望我可以告訴你更多關於OpenXML的知識,但是沒有時間在這部分工作。

現在談談你在C#中的問題,如果你打算用Microsoft.Office.Interop來做,你可能首先將庫下載/集成到你的Visual Studio中。 現在,下面的代碼將幫助您打開文件,瀏覽工作表並遍歷行/列並保存它。

代碼:

using Excel = NetOffice.ExcelApi; 
Excel.Application xlsApp = new Excel.Application(); 

或:

Microsoft.Office.Interop.Excel.Application excel = null; 
Microsoft.Office.Interop.Excel.Workbook xls = null; 
excel = new Microsoft.Office.Interop.Excel.Application(); 
      object missing = Type.Missing; 
      object trueObject = true; 
      excel.Visible = false; 
      excel.DisplayAlerts = false; 
      xls = excel.Workbooks.Open(excelFile, missing, trueObject, missing, 

        missing, missing, missing, missing, missing, missing, missing, missing, 

        missing, missing, missing); 

您既可以選擇。不過,我會去微軟一個:

try 
{ 
       // Must be surrounded by try catch to work. 
       // http://naimishpandya.wordpress.com/2010/12/31/hide-power-point-application-window-in-net-office-automation/ 
       xlsApp.Visible = true; 
       xlsApp.DisplayAlerts = false; 
} 
catch (Exception e) 
{ 
       Console.WriteLine("-------Error hiding the application-------"); 
       Console.WriteLine("Occured error might be: " + e.StackTrace); 
} 
Excel.Workbook workbook; 
workbook = xlsApp.Workbooks.Open(configuration.XLSExportedFile, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
              Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
              Type.Missing, Type.Missing); 

現在,你要在工作表之間移動或也許形狀在工作表:

foreach (Excel.Worksheet sheet in workbook.Sheets) 
{ 
    workbook.Activate(); 
    sheet.Activate(); 
    foreach (Excel.Shape shape in sheet.Shapes) 
    { 
    } 
} 

現在,如果你想要一些值粘貼到一個特定的範圍,在這裏你去:

sheet.Range(cellmapp).PasteSpecial(); 

其中cellmapp,你的範圍從A1:B2例如。 對於autofiting值到他們的大小,可以下面的代碼做:

sheet.Columns.AutoFit(); 
sheet.Rows.AutoFit(); 

現在,一旦你完成所有的修改過程中,隨着COM非常重要的,總是關閉它們。

workbook.SaveAs(File); 
workbook.Close(); 
xlsApp.Quit(); 
xlsApp.Dispose(); 

如果你是怕一些Excel的過程中被卡住,去

private void ManageXLSProcesses() 
{ 
     Process[] processes = System.Diagnostics.Process.GetProcessesByName("Excel"); 
     foreach (Process p in processes) 
      p.Kill(); 
} 

但是你應該避免在惡劣的方式這樣做。如果您使用COM或OpenXML,但是將來會使用OpenXML,這取決於您自己,因爲Microsoft Office Interop易於編寫,但在運行時很難處理。 這應該給你一個即將到來的代碼,你會寫的概述。做出您自己的實施選擇。不錯的建議是,將更多的時間花在OpenXML上,因爲它是一個標準,因爲COM管理將來會使用最新版本的Microsoft Office 2013 ++來苛刻。