2016-02-13 94 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