处理⽅式
代码名称
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 Pythonxlwings 读取Excel ⽂件的正确姿势
使⽤Python 加载最新的Excel 读取类库xlwings 可以说是Excel 数据处理的利器,但使⽤起来还是有⼀些注意事项,否则⾼⼤上的Python 会跑的⽐⽼旧的VBA 还要慢。
这⾥我们对⽐⼀下,⽤⼏种不同的⽅法,从⼀个Excel 表格中读取⼀万⾏数据,然后计算结果,看看他们的耗时。
1. 处理要求:
⼀个Excel 表格中包含了3万条记录,其中B ,C 两个列记录了某些计算值,读取前⼀万⾏记录,将这两个列的差值进⾏计算,然后汇总得出差的和。
⽂件是这个样⼦:Book300s.xlsx
。
2. 处理⽅式有以下3种,我们对⽐⼀下耗时的⼤⼩。
3. ⾸先测试第⼀种,XLS_READ_SHEET.py
使⽤Python 的xlwings 类库,读取Excel ⽂件,然后引⽤Excel 的Sheet 和Range 的⽅式来读取并计算 1 #coding=utf-8
2import xlwings as xw
3import pandas as pd
4import time
5
6 start_row = 2 # 处理Excel⽂件开始⾏
7 end_row = 10002 # 处理Excel结束⾏
8
9#记录打开表单开始时间
10 start_open_time = time.time()
11
12#指定不显⽰地打开Excel,读取Excel⽂件
13 app = xw.App(visible=False, add_book=False)
14 wb = app.books.open('D:/PYTHON/TEST_CODE/Book300s.xlsx') # 打开Excel⽂件
15 sheet = wb.sheets[0] # 选择第0个表单
16
17#记录打开Excel表单结束时间
18 end_open_time = time.time()
19
20#记录开始循环计算时间
21 start_run = time.time()
22
23 row_content = []
24#读取Excel表单前10000⾏的数据,Python的in range是左闭右开的,到10002结束,但区间只包含2到10001这⼀万条25for row in range(start_row, end_row):
26 row_str = str(row)
27#循环中引⽤Excel的sheet和range的对象,读取B列和C列的每⼀⾏的值,对⽐计算
28 start_value = sheet.range('B' + row_str).value
29 end_value = sheet.range('C' + row_str).value
30if start_value <= end_value:
31 values = end_value - start_value
32#同时测试List数组添加记录
33 row_content.append(values)
34
35#计算和
36 total_values = sum(row_content)
37
38#记录结束循环计算时间
39 end_run = time.time()
40 sheet.range('E2').value = str(total_values)
41 sheet.range('E3').value = '使⽤Sheet计算时间(秒):' + str(end_run - start_run)
42
43#保存并关闭Excel⽂件
44 wb.save()
45 wb.close()
46
47print ('结果总和:', total_values)
48print ('打开并读取Excel表单时间(秒):', end_open_time - start_open_time)
49print ('计算时间(秒):', end_run - start_run)
50print ('处理数据条数:' , len(row_content))
⽤Python直接访问Sheet和Range取值的计算结果如下:
读取Excel⽂件⽤时 4.47秒
处理Excel 10000 ⾏数据花费了117秒的时间。
4. 然后我们⽤Excel⾃带的VBA语⾔来处理⼀下相同的计算。也是直接引⽤Sheet,Range等Excel对象,但VBA的数组功能实在是不好⽤,就不测试添加数组了。
1Option Explicit
2
3Sub VBA_CAL_Click()
4Dim i_count As Long
5Dim offset_value, total_offset_value As Double
6Dim st, et As Date
7 st = Time()
8
9 i_count = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
10 i_count = 10001
11For i_count = 2To i_count
12If Range("C" & i_count).Value > Range("B" & i_count).Value Then
13 offset_value = Range("C" & i_count).Value - Range("B" & i_count).Value
14 total_offset_value = total_offset_value + offset_value
15End If
16Next i_count
17
18 et = Time()
19 Range("E2").Value = total_offset_value
20 Range("E3").Value = et - st
21
22MsgBox"Result: " & total_offset_value & Chr(10) & "Running time: " & et - st
23End Sub
VBA处理计算结果如下:
保存了3万条数据的Excel⽂件是通过⼿⼯打开的,在电脑上⼤概花费了8.2秒的时间
处理Excel 前10000⾏数据花费了1.16秒的时间。
5. 使⽤Python的xlwings类库,读取Excel⽂件,然后采⽤Python的⾃带数据类型List进⾏数据存储和计算,计算完成后再将结果写到Excel表格中
1#coding=utf-8
2import xlwings as xw
3import pandas as pd
4import time
5
6#记录打开表单开始时间
7 start_open_time = time.time()
8
9#指定不显⽰地打开Excel,读取Excel⽂件
10 app = xw.App(visible=False, add_book=False)
11 wb = app.books.open('D:/PYTHON/TEST_CODE/Book300s.xlsx') # 打开Excel⽂件
12 sheet = wb.sheets[0] # 选择第0个表单
13
14#记录打开Excel表单结束时间
15 end_open_time = time.time()
16
17#记录开始循环计算时间
18 start_run = time.time()
19
20 row_content = []
21#读取Excel表单前10000⾏的数据,并计算B列和C列的差值之和
22 list_value = sheet.range('A2:D10001').value
23for i in range(len(list_value)):
24#使⽤Python的类库直接访问Excel的表单是很缓慢的,不要在Python的循环中引⽤sheet等Excel表单的单元格,
25#⽽是要⽤List⼀次性读取Excel⾥的数据,在List内存中计算好了,然后返回结果
26 start_value = list_value[i][1]
27 end_value = list_value[i][2]
28if start_value <= end_value:
29 values = end_value- start_value
30#同时测试List数组添加记录
31 row_content.append(values)
32
33#计算和
34 total_values = sum(row_content)
35#记录结束循环计算时间
36 end_run = time.time()
37 sheet.range('E2').value = str(total_values)
38 sheet.range('E3').value = '使⽤List 计算时间(秒):' + str(end_run - start_run)
39
40#保存并关闭Excel⽂件
41 wb.save()
42 wb.close()
43
44print ('结果总和:', total_values)
45print ('打开并读取Excel表单时间(秒):', end_open_time - start_open_time)
46print ('计算时间(秒):', end_run - start_run)
47print ('处理数据条数:' , len(row_content))
⽤Python的LIST在内存中计算结果如下:
读取Excel⽂件⽤时 4.02秒
处理Excel 10000 ⾏数据花费了 0.10 秒的时间。
处理⽅式-计算Excel⾥的⼀万条记录的差值的总和效率
1. 使⽤Python的xlwings类库,采⽤Excel的Sheet和Range的引⽤⽅式,按⾏读取Excel⽂件的记录并计算差,计算⽤时 117秒python怎么读入excel
2. 直接使⽤Excel⾃带的VBA语⾔进⾏计算,也是采⽤Excel的Sheet和Range的引⽤⽅式,按⾏读取Excel⽂件的记录并计算很⾼,计算⽤时1.16秒
3. 使⽤Python的xlwings类库,⼀次性读取Excel⽂件中的数据到Python的List数据结构中,然后在Python的List列表中进⾏数据存储和计算最⾼,计算⽤时 0.1秒
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。
总结:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论