2016-02-13 56 views
0

我想弄清楚哪一個類似的任務通常更快:使用VBA或openpyxl。效率:openpyxl還是VBA?

我知道這可能取決於你想要達到的任務,但讓我們說我有一個表,它是50個單元寬和150,000個細胞高,我想將它從woorkbook一份給工作簿B.

任何關於python是否會做得更好,或者如果Excel更擅長處理自己的想法?

我的膽量告訴我,蟒蛇應該是相當快因爲某些原因:

  • 爲了讓子從一個工作簿複製到另一臺,都應該是開放和運行,而用蟒蛇我可以簡單地加載兩者;
  • VBA必須處理很多與大多數任務雜亂的,它需要的系統資源的大量

除此之外,我想知道如果我可以做一些進一步改善的openpyxl腳本,像多線程或可能使用NumPy一起。

感謝您的幫助!

+1

回答你的問題最簡單的方法是兩種方法。無需猜測。 「VBA必須處理大部分任務中的大量混亂,並且需要很多系統資源」 - 這是基於什麼? –

+0

我不是最有經驗的VBA編程人員,但是從我的經驗和我所知道的,使VBA高效是一項非常艱鉅的任務,而且經常在管理大量數據時變得非常慢。另外,我開始用這兩種資源編寫這個例程,在VBA的情況下,我需要打開兩個電子表格,每次需要處理另一個時,我必須激活它們,它立即刷新,等等,等等。 –

+2

我會說如果您沒有經驗,那麼使VBA *效率低下是絕對有可能的,但是對於任何語言來說,這都可能是相同的。從性能角度來看,VBA有一大優勢,那就是它的運行方式與Excel相同,所以不會有與從VBA中自動執行Excel相關的跨進程開銷:如果您需要進行大量的調用,這會變得非常重要來自另一個進程的Excel。儘可能地使用數組而不是逐個單元格可以幫助儘量減少這種情況,但這絕對是一個因素。 –

回答

2

TBH最快的方法很可能是遠程Excel中使用xlwings控制,因爲這可以利用Excel的優化優勢。 VBA也可能會涉及到,但我從來沒有發現VBA要快。

Python將不得不從XML到Python和轉換回XML。你有大約5,000,000個單元,所以我希望在我的機器上花費大約一分鐘的時間。我建議結合只讀和只寫模式來做到這一點,以保持內存使用率低。

如果你只有數字數據(無日期),那麼你也許能找到捷徑和「移植」從一個Excel文件的相關工作表XML文件到另一個,只是改變相關的元數據。

+0

我不知道xlwings,但我一定會看看!我沒有想到在XML和Python之間轉換的缺點。 「_combining read-only and write-only modes_」是什麼意思?而電子表格有很多文字和日期.... 無論如何,非常感謝您的幫助! –

+1

一些僞代碼:'wb1 = load_workbook(「file.xlsx」,read_only = True); WB2 =工作簿(WRITE_ONLY = TRUE); WS1 = wb1.active; ws2.wb2.active;對於ws1.iter_rows()中的行:ws.2.append([行中c的值爲c])。 由於Excel要求對它們進行格式化,有日期會降低一點。 –

+0

你有沒有試過[與Excel直接建立數據連接](http://stackoverflow.com/a/40332696/111794)? –

0

TL; DR考慮向Excel文件的直接數據連接(在VBA或Python + PyWin32,pyodbc在Python ADO,或.NET OleDbConnection類,等等)。你建立這種聯繫的語言不太重要。

龍版

如果你想要的是數據本身的工作,你可能要考慮使用ADO,pyodbc到Excel的直接連接,或.NET OleDbConnection類。

自動化Excel應用程序(使用Microsoft Excel對象模型或(可能)與xlwings)會產生大量開銷,這是可以理解的,因爲您可能不僅僅讀取Excel文件中的數據,還會操縱Excel UI —窗口中的所有對象,菜單—以及超出數據範圍的對象,例如格式化單個單元格或範圍。

的確,openpyxl沒有所有這些UI元素的開銷,因爲它直接讀取文件,但我假設仍然會有一些開銷,因爲openpyxl必須提供文件中的所有信息,例如,這不僅僅是數據格式的數據。

建立數據連接還允許您將Excel文件視爲數據庫,您可以使用SQL的所有功能發出SQL語句 - 連接,排序,分組和聚集。

有關使用ADO和VBA的示例,請參閱here

相關問題