• 售前

  • 售后

热门帖子
入门百科

浅谈Python xlwings 读取Excel文件的精确姿势

[复制链接]
涨吧涨吧章 显示全部楼层 发表于 2021-10-25 20:16:21 |阅读模式 打印 上一主题 下一主题
利用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的方式来读取并盘算
  1. #coding=utf-8
  2. import xlwings as xw
  3. import pandas as pd
  4. import time
  5. start_row = 2 # 处理Excel文件开始行
  6. end_row = 10002 # 处理Excel结束行
  7. #记录打开表单开始时间
  8. start_open_time = time.time()
  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. #记录打开Excel表单结束时间
  14. end_open_time = time.time()
  15. #记录开始循环计算时间
  16. start_run = time.time()
  17. row_content = []
  18. #读取Excel表单前10000行的数据,Python的in range是左闭右开的,到10002结束,但区间只包含2到10001这一万条
  19. for row in range(start_row, end_row):
  20.   row_str = str(row)
  21.   #循环中引用Excel的sheet和range的对象,读取B列和C列的每一行的值,对比计算
  22.   start_value = sheet.range('B' + row_str).value
  23.   end_value = sheet.range('C' + row_str).value
  24.   if start_value <= end_value:
  25.     values = end_value - start_value
  26.     #同时测试List数组添加记录
  27.     row_content.append(values)
  28. #计算和
  29. total_values = sum(row_content)
  30. #记录结束循环计算时间
  31. end_run = time.time()
  32. sheet.range('E2').value = str(total_values)
  33. sheet.range('E3').value = '使用Sheet计算时间(秒):' + str(end_run - start_run)
  34. #保存并关闭Excel文件
  35. wb.save()
  36. wb.close()
  37. print ('结果总和:', total_values)
  38. print ('打开并读取Excel表单时间(秒):',  end_open_time - start_open_time)
  39. print ('计算时间(秒):',  end_run - start_run)
  40. print ('处理数据条数:' , len(row_content))
复制代码
用Python直接访问Sheet和Range取值的盘算效果如下:
读取Excel文件用时 4.47秒
处置处罚Excel 10000 行数据花费了117秒的时间。

4. 然后我们用Excel自带的VBA语言来处置处罚一下类似的盘算。也是直接引用Sheet,Range等Excel对象,但VBA的数组功能着实是欠好用,就不测试添加数组了。
  1. Option Explicit
  2. Sub VBA_CAL_Click()
  3.   Dim i_count As Long
  4.   Dim offset_value, total_offset_value As Double
  5.   Dim st, et As Date
  6.   st = Time()
  7.   i_count = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
  8.   i_count = 10001
  9.   For i_count = 2 To i_count
  10.      If Range("C" & i_count).Value > Range("B" & i_count).Value Then
  11.        offset_value = Range("C" & i_count).Value - Range("B" & i_count).Value
  12.        total_offset_value = total_offset_value + offset_value
  13.      End If
  14.   Next i_count
  15.   et = Time()
  16.   Range("E2").Value = total_offset_value
  17.   Range("E3").Value = et - st
  18.   MsgBox "Result: " & total_offset_value & Chr(10) & "Running time: " & et - st
  19. End Sub
复制代码
VBA处置处罚盘算效果如下:
保存了3万条数据的Excel文件是通过手工打开的,在电脑上大概花费了8.2秒的时间
处置处罚Excel 前10000行数据花费了1.16秒的时间。

5.利用Python的xlwings类库,读取Excel文件,然后接纳Python的自带数据类型List举行数据存储和盘算,盘算完成后再将效果写到Excel表格中
  1. #coding=utf-8
  2. import xlwings as xw
  3. import pandas as pd
  4. import time
  5. #记录打开表单开始时间
  6. start_open_time = time.time()
  7. #指定不显示地打开Excel,读取Excel文件
  8. app = xw.App(visible=False, add_book=False)
  9. wb = app.books.open('D:/PYTHON/TEST_CODE/Book300s.xlsx') # 打开Excel文件
  10. sheet = wb.sheets[0] # 选择第0个表单
  11. #记录打开Excel表单结束时间
  12. end_open_time = time.time()
  13. #记录开始循环计算时间
  14. start_run = time.time()
  15. row_content = []
  16. #读取Excel表单前10000行的数据,并计算B列和C列的差值之和
  17. list_value = sheet.range('A2:D10001').value
  18. for i in range(len(list_value)):
  19.    #使用Python的类库直接访问Excel的表单是很缓慢的,不要在Python的循环中引用sheet等Excel表单的单元格,
  20.    #而是要用List一次性读取Excel里的数据,在List内存中计算好了,然后返回结果
  21.    start_value = list_value[i][1]
  22.    end_value = list_value[i][2]
  23.    if start_value <= end_value:
  24.      values = end_value- start_value
  25.      #同时测试List数组添加记录
  26.      row_content.append(values)
  27. #计算和
  28. total_values = sum(row_content)
  29. #记录结束循环计算时间
  30. end_run = time.time()
  31. sheet.range('E2').value = str(total_values)
  32. sheet.range('E3').value = '使用List 计算时间(秒):' + str(end_run - start_run)
  33. #保存并关闭Excel文件
  34. wb.save()
  35. wb.close()
  36. print ('结果总和:', total_values)
  37. print ('打开并读取Excel表单时间(秒):',  end_open_time - start_open_time)
  38. print ('计算时间(秒):',  end_run - start_run)
  39. 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秒     

到此这篇关于浅谈Python xlwings 读取Excel文件的正确姿势的文章就先容到这了,更多相关Python xlwings 读取Excel内容请搜刮脚本之家以前的文章或继续浏览下面的相关文章渴望各人以后多多支持脚本之家!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作