浅谈Python xlwings 读取Excel文件的正确姿势
作者:techtalk 发布时间:2021-10-15 23:33:36
使用Python加载最新的Excel读取类库xlwings可以说是Excel数据处理的利器,但使用起来还是有一些注意事项,否则高大上的Python会跑的比老旧的VBA还要慢。
这里我们对比一下,用几种不同的方法,从一个Excel表格中读取一万行数据,然后计算结果,看看他们的耗时。
1. 处理要求:
一个Excel表格中包含了3万条记录,其中B,C两个列记录了某些计算值,读取前一万行记录,将这两个列的差值进行计算,然后汇总得出差的和。
文件是这个样子:Book300s.xlsx 。
2. 处理方式有以下3种,我们对比一下耗时的大小。
处理方式 | 代码名称 |
1. 使用Python的xlwings类库,读取Excel文件,然后采用Excel的Sheet和Range的引用方式读取并计算 | XLS_READ_SHEET.py |
2. 直接使用Excel自带的VBA语言进行计算 | VBA |
3. 使用Python的xlwings类库,读取Excel文件,然后采用Python的自带数据类型List列表进行数据存储和计算 | XLS_READ_LIST.py |
3. 首先测试第一种,XLS_READ_SHEET.py
使用Python的xlwings类库,读取Excel文件,然后引用Excel的Sheet和Range的方式来读取并计算
#coding=utf-8
import xlwings as xw
import pandas as pd
import time
start_row = 2 # 处理Excel文件开始行
end_row = 10002 # 处理Excel结束行
#记录打开表单开始时间
start_open_time = time.time()
#指定不显示地打开Excel,读取Excel文件
app = xw.App(visible=False, add_book=False)
wb = app.books.open('D:/PYTHON/TEST_CODE/Book300s.xlsx') # 打开Excel文件
sheet = wb.sheets[0] # 选择第0个表单
#记录打开Excel表单结束时间
end_open_time = time.time()
#记录开始循环计算时间
start_run = time.time()
row_content = []
#读取Excel表单前10000行的数据,Python的in range是左闭右开的,到10002结束,但区间只包含2到10001这一万条
for row in range(start_row, end_row):
row_str = str(row)
#循环中引用Excel的sheet和range的对象,读取B列和C列的每一行的值,对比计算
start_value = sheet.range('B' + row_str).value
end_value = sheet.range('C' + row_str).value
if start_value <= end_value:
values = end_value - start_value
#同时测试List数组添加记录
row_content.append(values)
#计算和
total_values = sum(row_content)
#记录结束循环计算时间
end_run = time.time()
sheet.range('E2').value = str(total_values)
sheet.range('E3').value = '使用Sheet计算时间(秒):' + str(end_run - start_run)
#保存并关闭Excel文件
wb.save()
wb.close()
print ('结果总和:', total_values)
print ('打开并读取Excel表单时间(秒):', end_open_time - start_open_time)
print ('计算时间(秒):', end_run - start_run)
print ('处理数据条数:' , len(row_content))
用Python直接访问Sheet和Range取值的计算结果如下:
读取Excel文件用时 4.47秒
处理Excel 10000 行数据花费了117秒的时间。
4. 然后我们用Excel自带的VBA语言来处理一下相同的计算。也是直接引用Sheet,Range等Excel对象,但VBA的数组功能实在是不好用,就不测试添加数组了。
Option Explicit
Sub VBA_CAL_Click()
Dim i_count As Long
Dim offset_value, total_offset_value As Double
Dim st, et As Date
st = Time()
i_count = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
i_count = 10001
For i_count = 2 To i_count
If Range("C" & i_count).Value > Range("B" & i_count).Value Then
offset_value = Range("C" & i_count).Value - Range("B" & i_count).Value
total_offset_value = total_offset_value + offset_value
End If
Next i_count
et = Time()
Range("E2").Value = total_offset_value
Range("E3").Value = et - st
MsgBox "Result: " & total_offset_value & Chr(10) & "Running time: " & et - st
End Sub
VBA处理计算结果如下:
保存了3万条数据的Excel文件是通过手工打开的,在电脑上大概花费了8.2秒的时间
处理Excel 前10000行数据花费了1.16秒的时间。
5.使用Python的xlwings类库,读取Excel文件,然后采用Python的自带数据类型List进行数据存储和计算,计算完成后再将结果写到Excel表格中
#coding=utf-8
import xlwings as xw
import pandas as pd
import time
#记录打开表单开始时间
start_open_time = time.time()
#指定不显示地打开Excel,读取Excel文件
app = xw.App(visible=False, add_book=False)
wb = app.books.open('D:/PYTHON/TEST_CODE/Book300s.xlsx') # 打开Excel文件
sheet = wb.sheets[0] # 选择第0个表单
#记录打开Excel表单结束时间
end_open_time = time.time()
#记录开始循环计算时间
start_run = time.time()
row_content = []
#读取Excel表单前10000行的数据,并计算B列和C列的差值之和
list_value = sheet.range('A2:D10001').value
for i in range(len(list_value)):
#使用Python的类库直接访问Excel的表单是很缓慢的,不要在Python的循环中引用sheet等Excel表单的单元格,
#而是要用List一次性读取Excel里的数据,在List内存中计算好了,然后返回结果
start_value = list_value[i][1]
end_value = list_value[i][2]
if start_value <= end_value:
values = end_value- start_value
#同时测试List数组添加记录
row_content.append(values)
#计算和
total_values = sum(row_content)
#记录结束循环计算时间
end_run = time.time()
sheet.range('E2').value = str(total_values)
sheet.range('E3').value = '使用List 计算时间(秒):' + str(end_run - start_run)
#保存并关闭Excel文件
wb.save()
wb.close()
print ('结果总和:', total_values)
print ('打开并读取Excel表单时间(秒):', end_open_time - start_open_time)
print ('计算时间(秒):', end_run - start_run)
print ('处理数据条数:' , len(row_content))
用Python的LIST在内存中计算结果如下:
读取Excel文件用时 4.02秒
处理Excel 10000 行数据花费了 0.10 秒的时间。
6 结论:
Python操作Excel的类库有以往有 xlrd、xlwt、openpyxl、pyxll等,这些类库有的只支持读取,有的只支持写入,并且有的不支持Excel的xlsx格式等。
所以我们采用了最新的开源免费的xlwings类库,xlwings能够很方便的读写Excel文件中的数据,并支持Excel的单元格格式修改,也可以与pandas等类库集成使用。
VBA是微软Excel的原生二次开发语言,是办公和数据统计的利器,在金融,统计,管理,计算中应用非常广泛,但是VBA计算能力较差,支持的数据结构少,编辑器粗糙。
虽然VBA有很多不足,但是VBA的宿主Office Excel却是天才程序员基于C++开发的作品,稳定,高效,易用 。
有微软加持,VBA虽然数据结构少,运行速度慢,但访问自己Excel的Sheet,Range,Cell等对象却速度飞快,这就是一体化产品的优势。
VBA读取Excel的Range,Cell等操作是通过底层的API直接读取数据的,而不是通过微软统一的外部开发接口。所以Python的各种开源和商用的Excel处理类库如果和VBA来比较读写Excel格子里面的数据,都是处于劣势的(至少是不占优势的),例子2的VBA 花费了1.16秒就能处理完一万条数据。
Python基于开源,语法优美而健壮,支持面向对象开发,最重要的是,Python有丰富而功能强大的类库,支持多种工作场景的开发。
我们应该认识到,Excel对于Python而言,只是数据源文件的一种,当处理大量数据时,Python处理Excel就要把Excel当数据源来处理,一次性地读取数据到Python的数据结构中,而不是大量调用Excel里的对象,不要说频繁地写入Excel,就是频繁地读取Excel里面的某些单元格也是效率较低的。例子1的Python频繁读取Sheet,Range数据,结果花费了117秒才处理完一万条数据。
Python的计算效率和数据结构的操作方便性可比VBA强上太多,和VBA联合起来使用,各取所长是个好主意。
当Excel数据一次性读入Python的内存List数据结构中,然后基于自身的List数据结构在内存中计算,例子3的Python只用了 0.1秒就完成了一万条数据的计算并将结果写回Excel。
总结:
处理方式-计算Excel里的一万条记录的差值的总和 | 效率 |
1. 使用Python的xlwings类库,采用Excel的Sheet和Range的引用方式,按行读取Excel文件的记录并计算 | 差,计算用时 117秒 |
2. 直接使用Excel自带的VBA语言进行计算,也是采用Excel的Sheet和Range的引用方式,按行读取Excel文件的记录并计算 | 很高 ,计算用时 1.16秒 |
3. 使用Python的xlwings类库,一次性读取Excel文件中的数据到Python的List数据结构中,然后在Python的List列表中进行数据存储和计算 | 最高,计算用时 0.1秒 |
来源:https://www.cnblogs.com/techtalk/articles/10590212.html


猜你喜欢
- 在实际生活中,经常会有文件重复的困扰,即同一个文件可能既在A目录中,又在B目录中,更可恶的是,即便是同一个文件,文件名可能还不一样。在文件较
- 由Oralce8.1开始,Oracle增加了一个新的特性就是Stored Outlines,或者称为Plan Stability(计划稳定性
- 官方实现golang 1.8 及以上版本提供了一个创建共享库(shared object)的新工具,称为 Plugins。目前 Plugin
- 一、Tornado简介Tornado 是 FriendFeed 的 Web 服务器及其常用工具的开源版本。Tornado 和现在的主流 We
- 早期写的python障碍式期权的定价脚本,供大家参考,具体内容如下#coding:utf-8'''障碍期权q=x/s
- 在python3.x中,可以使用pymysql来MySQL数据库的连接,并实现数据库的各种操作,本次博客主要介绍了pymysql的安装和使用
- 这篇文章主要介绍了python GUI自动化实现绕过验证码登录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 网站内容的入口很大一部分都是依赖于导航系统,而网站的入口很大一部分依赖于搜索系统,这也在一定意义上证明了导航与搜索之间的重叠性。搜索系统可以
- mysql-5.7.23-winx64 解压版详细安装教程,供大家参考,具体内容如下1、Click here to download Mys
- 01前言数据是数据科学中任何分析的关键,大多数分析中最常用的数据集类型是存储在逗号分隔值(csv)表中的干净数据。然而,由于可移植文档格式(
- Oracle LogMiner 是Oracle公司从产品8i以后提供的一个实际非常有用的分析工具,使用该工具可以轻松获得Oracle 重作日
- 1、就按单介绍MySQL服务器的安全基础是:用户应该对他们需要的数据具有适当的访问权,既不能多也不能少。换句话说,用户不能对过多的数据具有过
- 为什么我把自己机子上的数据库备份文件往另一台机子上还原不成功?可能是你在Restore的对话框中选项不正确。Restore 有三个选项,分别
- 如何将训练好的网络进行保存,我们可以用pickle或cPickle来保存Keras模型,同时我们可以用下面的方法:一、保存整个模型model
- 本文实例为大家分享了Mysql实现通讯录的具体代码,供大家参考,具体内容如下#-*-code:utf-8-*-import pymysqld
- 简单使用最开始,我们用最短的代码体验一下logging的基本功能。import logginglogger = logging.getLog
- 上次介绍了如何通过钉钉进行群通知,有同学反馈自己更习惯使用企业微信或公司使用了企业微信,希望也能出个基于Python的企业微信的群通知教程,
- 揭秘一个普通的输入框背后惊人的秘密。某月某日,某项目某页面,需要一个价格区间筛选功能,需求合理,所以设计做上去。这是一个无比普通的输入框。在
- 一、背景Python 是一门易于学习、功能强大的编程语言。它提供了高效的高级数据结构,还能简单有效地面向对象编程。Python 优雅的语法和
- 本文为大家分享了windows下pycharm安装、创建文件、配置默认模板的具体步骤,供大家参考,具体内容如下步骤: 下包 —->安装