怎么在Python中利用xlwings讀取Excel文件?針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。
創(chuàng)新互聯(lián)建站是專業(yè)的甘谷網(wǎng)站建設(shè)公司,甘谷接單;提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì),網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行甘谷網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!1. 處理要求:
一個(gè)Excel表格中包含了3萬條記錄,其中B,C兩個(gè)列記錄了某些計(jì)算值,讀取前一萬行記錄,將這兩個(gè)列的差值進(jìn)行計(jì)算,然后匯總得出差的和。
文件是這個(gè)樣子:Book300s.xlsx 。
處理方式 | 代碼名稱 |
1. 使用Python的xlwings類庫,讀取Excel文件,然后采用Excel的Sheet和Range的引用方式讀取并計(jì)算 | XLS_READ_SHEET.py |
2. 直接使用Excel自帶的VBA語言進(jìn)行計(jì)算 | VBA |
3. 使用Python的xlwings類庫,讀取Excel文件,然后采用Python的自帶數(shù)據(jù)類型List列表進(jìn)行數(shù)據(jù)存儲(chǔ)和計(jì)算 | XLS_READ_LIST.py |
使用Python的xlwings類庫,讀取Excel文件,然后引用Excel的Sheet和Range的方式來讀取并計(jì)算
#coding=utf-8 import xlwings as xw import pandas as pd import time start_row = 2 # 處理Excel文件開始行 end_row = 10002 # 處理Excel結(jié)束行 #記錄打開表單開始時(shí)間 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個(gè)表單 #記錄打開Excel表單結(jié)束時(shí)間 end_open_time = time.time() #記錄開始循環(huán)計(jì)算時(shí)間 start_run = time.time() row_content = [] #讀取Excel表單前10000行的數(shù)據(jù),Python的in range是左閉右開的,到10002結(jié)束,但區(qū)間只包含2到10001這一萬條 for row in range(start_row, end_row): row_str = str(row) #循環(huán)中引用Excel的sheet和range的對(duì)象,讀取B列和C列的每一行的值,對(duì)比計(jì)算 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 #同時(shí)測試List數(shù)組添加記錄 row_content.append(values) #計(jì)算和 total_values = sum(row_content) #記錄結(jié)束循環(huán)計(jì)算時(shí)間 end_run = time.time() sheet.range('E2').value = str(total_values) sheet.range('E3').value = '使用Sheet計(jì)算時(shí)間(秒):' + str(end_run - start_run) #保存并關(guān)閉Excel文件 wb.save() wb.close() print ('結(jié)果總和:', total_values) print ('打開并讀取Excel表單時(shí)間(秒):', end_open_time - start_open_time) print ('計(jì)算時(shí)間(秒):', end_run - start_run) print ('處理數(shù)據(jù)條數(shù):' , len(row_content))
用Python直接訪問Sheet和Range取值的計(jì)算結(jié)果如下:
讀取Excel文件用時(shí) 4.47秒
處理Excel 10000 行數(shù)據(jù)花費(fèi)了117秒的時(shí)間。
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處理計(jì)算結(jié)果如下:
保存了3萬條數(shù)據(jù)的Excel文件是通過手工打開的,在電腦上大概花費(fèi)了8.2秒的時(shí)間
處理Excel 前10000行數(shù)據(jù)花費(fèi)了1.16秒的時(shí)間。
#coding=utf-8 import xlwings as xw import pandas as pd import time #記錄打開表單開始時(shí)間 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個(gè)表單 #記錄打開Excel表單結(jié)束時(shí)間 end_open_time = time.time() #記錄開始循環(huán)計(jì)算時(shí)間 start_run = time.time() row_content = [] #讀取Excel表單前10000行的數(shù)據(jù),并計(jì)算B列和C列的差值之和 list_value = sheet.range('A2:D10001').value for i in range(len(list_value)): #使用Python的類庫直接訪問Excel的表單是很緩慢的,不要在Python的循環(huán)中引用sheet等Excel表單的單元格, #而是要用List一次性讀取Excel里的數(shù)據(jù),在List內(nèi)存中計(jì)算好了,然后返回結(jié)果 start_value = list_value[i][1] end_value = list_value[i][2] if start_value <= end_value: values = end_value- start_value #同時(shí)測試List數(shù)組添加記錄 row_content.append(values) #計(jì)算和 total_values = sum(row_content) #記錄結(jié)束循環(huán)計(jì)算時(shí)間 end_run = time.time() sheet.range('E2').value = str(total_values) sheet.range('E3').value = '使用List 計(jì)算時(shí)間(秒):' + str(end_run - start_run) #保存并關(guān)閉Excel文件 wb.save() wb.close() print ('結(jié)果總和:', total_values) print ('打開并讀取Excel表單時(shí)間(秒):', end_open_time - start_open_time) print ('計(jì)算時(shí)間(秒):', end_run - start_run) print ('處理數(shù)據(jù)條數(shù):' , len(row_content))
用Python的LIST在內(nèi)存中計(jì)算結(jié)果如下:
讀取Excel文件用時(shí) 4.02秒
處理Excel 10000 行數(shù)據(jù)花費(fèi)了 0.10 秒的時(shí)間。
Python操作Excel的類庫有以往有 xlrd、xlwt、openpyxl、pyxll等,這些類庫有的只支持讀取,有的只支持寫入,并且有的不支持Excel的xlsx格式等。
所以我們采用了新的開源免費(fèi)的xlwings類庫,xlwings能夠很方便的讀寫Excel文件中的數(shù)據(jù),并支持Excel的單元格格式修改,也可以與pandas等類庫集成使用。
VBA是微軟Excel的原生二次開發(fā)語言,是辦公和數(shù)據(jù)統(tǒng)計(jì)的利器,在金融,統(tǒng)計(jì),管理,計(jì)算中應(yīng)用非常廣泛,但是VBA計(jì)算能力較差,支持的數(shù)據(jù)結(jié)構(gòu)少,編輯器粗糙。
雖然VBA有很多不足,但是VBA的宿主Office Excel卻是天才程序員基于C++開發(fā)的作品,穩(wěn)定,高效,易用 。
有微軟加持,VBA雖然數(shù)據(jù)結(jié)構(gòu)少,運(yùn)行速度慢,但訪問自己Excel的Sheet,Range,Cell等對(duì)象卻速度飛快,這就是一體化產(chǎn)品的優(yōu)勢。
VBA讀取Excel的Range,Cell等操作是通過底層的API直接讀取數(shù)據(jù)的,而不是通過微軟統(tǒng)一的外部開發(fā)接口。所以Python的各種開源和商用的Excel處理類庫如果和VBA來比較讀寫Excel格子里面的數(shù)據(jù),都是處于劣勢的(至少是不占優(yōu)勢的),例子2的VBA 花費(fèi)了1.16秒就能處理完一萬條數(shù)據(jù)。
Python基于開源,語法優(yōu)美而健壯,支持面向?qū)ο箝_發(fā),最重要的是,Python有豐富而功能強(qiáng)大的類庫,支持多種工作場景的開發(fā)。
我們應(yīng)該認(rèn)識(shí)到,Excel對(duì)于Python而言,只是數(shù)據(jù)源文件的一種,當(dāng)處理大量數(shù)據(jù)時(shí),Python處理Excel就要把Excel當(dāng)數(shù)據(jù)源來處理,一次性地讀取數(shù)據(jù)到Python的數(shù)據(jù)結(jié)構(gòu)中,而不是大量調(diào)用Excel里的對(duì)象,不要說頻繁地寫入Excel,就是頻繁地讀取Excel里面的某些單元格也是效率較低的。例子1的Python頻繁讀取Sheet,Range數(shù)據(jù),結(jié)果花費(fèi)了117秒才處理完一萬條數(shù)據(jù)。
Python的計(jì)算效率和數(shù)據(jù)結(jié)構(gòu)的操作方便性可比VBA強(qiáng)上太多,和VBA聯(lián)合起來使用,各取所長是個(gè)好主意。
當(dāng)Excel數(shù)據(jù)一次性讀入Python的內(nèi)存List數(shù)據(jù)結(jié)構(gòu)中,然后基于自身的List數(shù)據(jù)結(jié)構(gòu)在內(nèi)存中計(jì)算,例子3的Python只用了 0.1秒就完成了一萬條數(shù)據(jù)的計(jì)算并將結(jié)果寫回Excel。
處理方式-計(jì)算Excel里的一萬條記錄的差值的總和 | 效率 |
1. 使用Python的xlwings類庫,采用Excel的Sheet和Range的引用方式,按行讀取Excel文件的記錄并計(jì)算 | 差,計(jì)算用時(shí) 117秒 |
2. 直接使用Excel自帶的VBA語言進(jìn)行計(jì)算,也是采用Excel的Sheet和Range的引用方式,按行讀取Excel文件的記錄并計(jì)算 | 很高 ,計(jì)算用時(shí) 1.16秒 |
3. 使用Python的xlwings類庫,一次性讀取Excel文件中的數(shù)據(jù)到Python的List數(shù)據(jù)結(jié)構(gòu)中,然后在Python的List列表中進(jìn)行數(shù)據(jù)存儲(chǔ)和計(jì)算 | 高,計(jì)算用時(shí) 0.1秒 |
關(guān)于怎么在Python中利用xlwings讀取Excel文件問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
文章題目:怎么在Python中利用xlwings讀取Excel文件-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://m.newbst.com/article32/hpcpc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站營銷、ChatGPT、網(wǎng)站收錄、自適應(yīng)網(wǎng)站、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容