python處理excel文件(xls和xlsx)

一、xlrd和xlwt

使用之前需要需要先安裝,windows上如果直接在cmd中運行python則需要先執行pip3 install xlrd和pip3 install xlwt,如果使用pycharm則需要在項目的解釋器中安裝這兩個模塊,File-Settings-Project:layout-Project Interpreter,點擊右側界面的+號,然后搜索xlrd和xlwt,然后點擊Install Package進行安裝。

?

對于excel來說,整個excel文件稱為工作簿,工作簿中的每個頁稱為工作表,工作表又由單元格組成。

對于xlrd和xlwt,行數和列數從0開始,單元格的行和列也從0開始,例如sheet.row_values(2)表示第三行的內容,sheet.cell(1,2).value表示第二行第三列單元格的內容

1.xlrd模塊讀取excel文件

使用xlrd模塊之前需要先導入import xlrd,xlrd模塊既可讀取xls文件也可讀取xlsx文件

獲取工作簿對象:book = xlrd.open_workbook('excel文件名稱')

獲取所有工作表名稱:names = book.sheet_names(),結果為列表

根據索引獲取工作表對象:sheet = book.sheet_by_index(i)

根據名稱獲取工作表對象:sheet = book.sheet_by_name('工作表名稱')

獲取工作表行數:rows = sheet.nrows

獲取工作表列數:cols = sheet.ncols

獲取工作表某一行的內容:row =?sheet.row_values(i) ,結果為列表? ?【sheet.row(i),列表】

獲取工作表某一列的內容:col =?sheet.col_values(i)? 結果為列表? ?【sheet.col(i),列表】

獲取工作表某一單元格的內容:cell = sheet.cell_value(m,n)、 sheet.cell(m,n).value、sheet.row(m)[n].value,sheet.col(n)[m].value,結果為字符串或數值? ? 【sheet.cell(0,0),xlrd.sheet.Cell對象

示例:假設在py執行文件同層目錄下有一fruit.xls文件,有三個sheet頁Sheet1、Sheet2、Sheet3,其中Sheet1內容如下:

?

import xlrd
book = xlrd.open_workbook('fruit.xls')
print('sheet頁名稱:',book.sheet_names())
sheet = book.sheet_by_index(0)
rows = sheet.nrows
cols = sheet.ncols
print('該工作表有%d行,%d列.'%(rows,cols))
print('第三行內容為:',sheet.row_values(2))
print('第二列內容為%s,數據類型為%s.'%(sheet.col_values(1),type(sheet.col_values(1))))
print('第二列內容為%s,數據類型為%s.'%(sheet.col(1),type(sheet.col(1))))
print('第二行第二列的單元格內容為:',sheet.cell_value(1,1))
print('第三行第二列的單元格內容為:',sheet.cell(2,1).value)
print('第五行第三列的單元格內容為:',sheet.row(4)[2].value)
print('第五行第三列的單元格內容為%s,數據類型為%s'%(sheet.col(2)[4].value,type(sheet.col(2)[4].value)))
print('第五行第三列的單元格內容為%s,數據類型為%s'%(sheet.col(2)[4],type(sheet.col(2)[4])))# 執行結果
# sheet頁名稱: ['Sheet1', 'Sheet2', 'Sheet3']
# 該工作表有5行,3列.
# 第三行內容為: ['梨', 3.5, 130.0]
# 第二列內容為['單價/元', 8.0, 3.5, 4.5, 3.8],數據類型為<class 'list'>.
# 第二列內容為[text:'單價/元', number:8.0, number:3.5, number:4.5, number:3.8],數據類型為<class 'list'>.
# 第二行第二列的單元格內容為: 8.0
# 第三行第二列的單元格內容為: 3.5
# 第五行第三列的單元格內容為: 300.0
# 第五行第三列的單元格內容為300.0,數據類型為<class 'float'>
# 第五行第三列的單元格內容為number:300.0,數據類型為<class 'xlrd.sheet.Cell'>
xlrd讀取excel示例

?

可以看出,通過sheet.row(i)、sheet.col(i)也可以獲取行或列的內容,并且結果也是一個列表,但是列表中的每一項類似字典的鍵值對,形式為數據類型:值

而sheet.cell(0,0)獲取單元格內容,結果是一個鍵值對,并且是一個xlrd.sheet.Cell對象。

?

2.xlwt寫入excel文件

使用xlwt模塊之前需要先導入import xlwt,xlwt模塊只能寫xls文件,不能寫xlsx文件(寫xlsx程序不會報錯,但最后文件無法直接打開,會報錯)。

創建工作簿:book = xlwt.Workbook(),如果寫入中文為亂碼,可添加參數encoding = 'utf-8'

創建工作表:sheet = book.add_sheet('Sheet1')

向單元格寫入內容:sheet.write(m,n,'內容1')、sheet.write(x,y,'內容2')

保存工作簿:book.save('excel文件名稱'),默認保存在py文件相同路徑下,如果該路徑下有相同文件,會被新創建的文件覆蓋,即xlwt不能修改文件

import xlwt
book = xlwt.Workbook()
sheet = book.add_sheet('Sheet1')
sheet.write(0,0,'hello')
sheet.write(1,0,'你好')
book.save('hello.xls')
xlwt創建并寫入excel示例

?

逐個單元格寫入excel比較麻煩,可以按行或者列寫入。

import xlwt
proj = ['名稱','單價/元','庫存/kg']
fruit = ['蘋果','','香蕉','橘子']
price = [8,3.5,4.5,3.8]
storage = [150,130,100,300]
book = xlwt.Workbook()
sheet = book.add_sheet('Sheet1')
for i in range(0,len(proj)):sheet.write(0,i,proj[i]) #按行插入行標題
for i in range(0,len(fruit)):sheet.write(i+1,0,fruit[i])  #插入第一列水果名稱
for i in range(0,len(price)):sheet.write(i+1,1,price[i])  #插入第二列單價
for i in range(0,len(storage)):sheet.write(i+1,2,storage[i])   #插入第三列庫存
book.save('fruit2.xls')
xlwt逐行或列寫入excel

?

二、openpyxl模塊

openpyxl模塊可實現對excel文件的讀、寫和修改,只能處理xlsx文件,不能處理xls文件。使用openpyxl模塊之前同樣需要先安裝該模塊,再導入 import openpyxl。

對于openpyxl,行數和列數都從1開始,單元格的行和列也從0開始。例如sheet.cell(1,2).value表示第一行第二列單元格的內容

1.openpyxl讀取excel文件

獲取工作簿對象:book = openpyxl.load_workbook('excel文件名稱')

獲取所有工作表名稱:names = book.sheetnames

獲取工作表對象:sheet1 = book.worksheets[n]、sheet2 = book['工作表名稱']、sheet3 = book[book.sheetnames[n]]

獲取工作表名稱:title = sheet1.title

獲取工作表行數:rows = sheet1.max_row

獲取工作表列數:cols = sheet1.max_column

獲取某一單元格內容:cell =?sheet.cell(1,2).value、sheet['單元格'].value例如sheet['B1'].value

假設有一fruit2.xlsx,除后綴名其他與上述fruit.xls完全一樣

import openpyxl
book = openpyxl.load_workbook('fruit2.xlsx')
print('所有sheet頁名稱:',book.sheetnames)  
sheet = book.worksheets[0]
sheet2 = book['Sheet1']
sheet3 = book[book.sheetnames[0]]
print('工作表名稱:',sheet3.title)
rows = sheet.max_row
cols = sheet.max_column
print('該工作表有%d行,%d列.'%(rows,cols))# 執行結果
# 所有sheet頁名稱: ['Sheet1', 'Sheet2', 'Sheet3']
# 工作表名稱: Sheet1
# 該工作表有5行,3列.
openpyxl讀取excel示例

?

2.行和列生成器

對于xlrd模塊來說,可直接通過sheet.row[i]和sheet.col[i]獲取行和列的內容,但是對于openpyxl模塊來說,無法直接獲取某一行或列的內容,openpyxl模塊的sheet.rows和sheet.columns表示行和列的生成器,即generator object,需要通過循環或轉換成列表、元組的形式得到行或列的值。

print(sheet.rows,sheet.columns)
for col in sheet.columns:print(col)
for row in sheet.rows:for i in row:print(i.value,end='  ')print()# 執行結果
# <generator object Worksheet._cells_by_row at 0x00000230E011A2A0> <generator object Worksheet._cells_by_col at 0x00000230E102FC00>
# (<Cell 'Sheet1'.A1>, <Cell 'Sheet1'.A2>, <Cell 'Sheet1'.A3>, <Cell 'Sheet1'.A4>, <Cell 'Sheet1'.A5>)
# (<Cell 'Sheet1'.B1>, <Cell 'Sheet1'.B2>, <Cell 'Sheet1'.B3>, <Cell 'Sheet1'.B4>, <Cell 'Sheet1'.B5>)
# (<Cell 'Sheet1'.C1>, <Cell 'Sheet1'.C2>, <Cell 'Sheet1'.C3>, <Cell 'Sheet1'.C4>, <Cell 'Sheet1'.C5>)
# 名稱  單價/元  庫存/kg
# 蘋果  8  150
# 梨  3.5  130
# 香蕉  4.5  100
# 橘子  3.8  300
openpyxl的行和列生成器

?

如果要獲取某一行或者列的內容,可將行、列生成器對象轉換成列表或者元組,再循環列表或者元組得到內容。

前面說過openpyxl模塊的行和列都從1開始,但是由于將生成器轉化成了列表list(sheet.rows),而列表的索引從0開始,因此list(sheet.rows)[1]還是表示第二行的內容,不是第一行的內容。

for i in list(sheet.rows)[1]:print(i.value,end='  ')
print()
for i in list(sheet.columns)[0]:print(i.value,end='  ')# 執行結果
# 蘋果  8  150
# 名稱  蘋果  梨  香蕉  橘子
獲取某一行或者列的內容

?

獲取單元格的內容

print(sheet.cell(1,2).value)  #第一行第二列單元格的內容
print(sheet['a2'].value)  #使用excel單元格的表示法,字母不區分大小寫

?

3.openpyxl寫excel文件?

創建工作簿:book = openpyxl.Workbook(),如果寫入中文為亂碼,可添加參數encoding = 'utf-8'

創建工作表:sheet = book.create_sheet('工作表名稱',0),0表示創建的工作表在工作薄最前面

向單元格寫入內容:sheet.write(m,n,'內容1')、sheet.write(x,y,'內容2')

保存工作簿:book.save('excel文件名稱'),默認保存在py文件相同路徑下,如果該路徑下有相同文件,會被新創建的文件覆蓋。

book = openpyxl.Workbook()
sheet = book.create_sheet('Sheet1',0)
proj = ['名稱','單價/元','庫存/kg']
fruit = ['蘋果','香蕉','','橘子']
price = [8,3.5,4.5,3.8]
storage = [150,130,300,100]
for i in range(len(proj)):sheet.cell(1,i+1,proj[i])
for i in range(len(fruit)):sheet.cell(i+2,1,fruit[i])
for i in range(len(price)):sheet.cell(i+2,2,price[i])
for i in range(len(storage)):sheet.cell(i+2,3,storage[i])
book.save('fruit2.xlsx')
openpyxl創建和寫excel示例

?

4.openpyxl修改excel文件

sheet.insert_rows(m)和sheet.insert_cols(n)分別表示在第m行、第n列前面插入行、列

sheet.delete_rows(m)和sheet.delete_cols(n)分別表示刪除第m行、第n列

rows = sheet.max_row
sheet.insert_rows(rows+2)
cherry = ['櫻桃',17,80]  
for j in cherry:sheet.cell(rows+1,cherry.index(j)+1,j)
book.save('fruit2.xlsx')
openpyxl在指定位置增加行

?

修改單元格內容:sheet.cell(m,n) = '內容1'或者sheet['B3'] = '內容2'?

sheet.cell(3,2,4)
sheet['B3'] = 5
book.save('fruit2.xlsx')
openpyxl修改單元格的內容

?

在最后追加行:sheet.append(可迭代對象)

straberry = ['草莓',20,50]
sheet.append(straberry)
book.save('fruit2.xlsx')
append在最后追加行

?

xlrd、xlwt和openpyxl處理excel文件,在寫入文件的時候不如pandas簡單,pandas處理excel文件見另外一篇博客https://www.cnblogs.com/Forever77/p/11298173.html

?

轉載于:https://www.cnblogs.com/Forever77/p/11135124.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/392905.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392905.shtml
英文地址,請注明出處:http://en.pswp.cn/news/392905.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

html塊中的內容垂直居中,css如何設置行內元素與塊級元素的內容垂直居中

首先我們先了解一下行內元素和塊級元素行內元素(內聯元素)&#xff1a;沒有自己的獨立空間&#xff0c;它是依附于其他塊級元素存在的&#xff0c;空間大小依附于內容多少。行內元素沒有度、寬度、內外邊距等屬性。塊級元素&#xff1a;占據獨立的空間&#xff0c;具有寬度&…

Mina、Netty、Twisted一起學(五):整合protobuf

protobuf是谷歌的Protocol Buffers的簡稱&#xff0c;用于結構化數據和字節碼之間互相轉換&#xff08;序列化、反序列化&#xff09;&#xff0c;一般應用于網絡傳輸&#xff0c;可支持多種編程語言。protobuf怎樣使用這里不再介紹&#xff0c;本文主要介紹在MINA、Netty、Twi…

leetcode 1. 兩數之和(map)

給定一個整數數組 nums 和一個目標值 target&#xff0c;請你在該數組中找出和為目標值的那 兩個 整數&#xff0c;并返回他們的數組下標。 你可以假設每種輸入只會對應一個答案。但是&#xff0c;數組中同一個元素不能使用兩遍。 示例: 給定 nums [2, 7, 11, 15], target …

Redis 3.0.1 安裝和配置

一、下載&#xff0c;解壓和編譯Redis 12345# cd /tmp # wget http://download.redis.io/releases/redis-3.0.1.tar.gz # tar xzf redis-3.0.1.tar.gz # cd redis-3.0.1 # make二、下載、安裝tclsh 測試編譯&#xff1a; 1# make test得到如下錯誤信息&#xff1a; …

2021年南寧二中高考成績查詢,2021廣西高考圓滿結束,6月23日可查詢成績

6月8日下午&#xff0c;2021年高考統考圓滿結束。今年廣西參加高考統考考生人數40.05萬余人&#xff0c;比2020年增加了2.2萬人。我區預計6月23日可查詢高考成績&#xff0c;6月24日起可陸續填報志愿&#xff0c;我區的網上咨詢會將于6月25日至27日舉辦。▲高考結束&#xff0c…

29 Python - 字符與編碼

字符與編碼 01 字符串本質 Python字符串相關概念 字符串 str 字節 bytes 字節數組 bytearray 電腦字符串存儲機制 字符庫&#xff1a;A、B每個字符有一個代碼點如A是65 B為66&#xff0c;這種是方便人類讀寫的形式&#xff0c;但是最終需要存入計算機的CPU和內存&…

Linux 內存管理與系統架構設計

Linux 提供各種模式&#xff08;比如&#xff0c;消息隊列&#xff09;&#xff0c;但是最著名的是 POSIX 共享內存&#xff08;shmem&#xff0c;shared memory&#xff09;。 Linux provides a variety of schemes (such as message queues), but most notable is POSIX shar…

如何正確使用Node.js中的事件

by Usama Ashraf通過Usama Ashraf 如何正確使用Node.js中的事件 (How to use events in Node.js the right way) Before event-driven programming became popular, the standard way to communicate between different parts of an application was pretty straightforward: …

你的成功有章可循

讀書筆記 作者 海軍 海天裝飾董事長 自我修煉是基礎。通過自我學習&#xff0c;在預定目標的指引下&#xff0c;將獲取的知識轉化為個人能力&#xff0c;形成自我規律&#xff0c;不斷循環&#xff0c;實現成功。 尋找和掌握規律&#xff0c;并熟練運用于實踐&#xff0c;是成功…

98k用計算機圖片,98K (HandClap)_譜友園地_中國曲譜網

《98K》文本歌詞98K之歌-HandClap-抖音 制譜&#xff1a;孫世彥這首《HandClap》是Fitz&TheTantrums樂隊演唱的一首歌曲&#xff0c;同時也是絕地求生中囂張BGM&#xff0c;是一首吃雞戰歌&#xff01;這首歌譜曲者和填詞者都是三個人&#xff1a;JeremyRuzumna&#xff0c…

qt之旅-1純手寫Qt界面

通過手寫qt代碼來認識qt程序的構成&#xff0c;以及特性。設計一個查找對話框。以下是設計過程1 新建一個empty qt project2 配置pro文件HEADERS \Find.h QT widgetsSOURCES \Find.cpp \main.cpp3 編寫對話框的類代碼例如以下&#xff1a;//Find.h #ifndef FIND_H #define F…

【隨筆】寫在2014年的第一天

想想好像就在不久前還和大家異常興奮地討論著世界末日的事&#xff0c;結果一晃也是一年前的事了。大四這一年&#xff0c;或者說整個2013年都是場搖擺不定的戲劇&#xff0c;去過的地方比前三年加起來還多的多&#xff0c;有時候也會恍惚地不知道自己現在在哪。簡單記幾筆&…

設計沖刺下載_如何運行成功的設計沖刺

設計沖刺下載by George Krasadakis通過喬治克拉薩達基斯(George Krasadakis) Design Sprints can generate remarkable output for your company — such as a backlog of impactful ideas, functional prototypes, learning and key insights from customers along with real…

leetcode 18. 四數之和(雙指針)

給定一個包含 n 個整數的數組 nums 和一個目標值 target&#xff0c;判斷 nums 中是否存在四個元素 a&#xff0c;b&#xff0c;c 和 d &#xff0c;使得 a b c d 的值與 target 相等&#xff1f;找出所有滿足條件且不重復的四元組。 注意&#xff1a; 答案中不可以包含重…

WPF:從WPF Diagram Designer Part 4學習分組、對齊、排序、序列化和常用功能

在前面三篇文章中我們介紹了如何給圖形設計器增加移動、選擇、改變大小及面板、縮略圖、框線選擇和工具箱和連接等功能&#xff0c;本篇是這個圖形設計器系列的最后一篇&#xff0c;將和大家一起來學習一下如何給圖形設計器增加分組、對齊、排序、序列化等功能。 WPF Diagram D…

win7如何看計算機用戶名和密碼怎么辦,win7系統電腦查看共享文件夾時不顯示用戶名和密碼輸入窗口的解決方法...

win7系統使用久了&#xff0c;好多網友反饋說win7系統電腦查看共享文件夾時不顯示用戶名和密碼輸入窗口的問題&#xff0c;非常不方便。有什么辦法可以永久解決win7系統電腦查看共享文件夾時不顯示用戶名和密碼輸入窗口的問題&#xff0c;面對win7系統電腦查看共享文件夾時不顯…

ASP.NET Core跨域設置

項目中經常會遇到跨域問題&#xff0c;解決方法&#xff1a; 在appsettings.json 文件中添加json項 {"Logging": {"LogLevel": {"Default": "Warning"}},"AllowedHosts": "*","AppCores": "https…

微信客戶端<->騰訊微信服務器<->開發者服務器

出自 http://blog.csdn.net/hanjingjava/article/details/41653113 首先&#xff0c;通過Token驗證&#xff0c;將公眾號接入開發者服務器&#xff0c;這樣客戶端發給公眾號的信息會被轉發給開發者服務器&#xff1b; 第二&#xff0c;組裝微信特定消息格式&#xff0c;返回給用…

idea提高調試超時_如何提高您的調試技能

idea提高調試超時by Nick Karnik尼克卡尼克(Nick Karnik) 如何提高您的調試技能 (How to Improve Your Debugging Skills) All of us write code that breaks at some point. That is part of the development process. When you run into an error, you may feel that you do…

leetcode 834. 樹中距離之和(dp)

給定一個無向、連通的樹。樹中有 N 個標記為 0...N-1 的節點以及 N-1 條邊 。第 i 條邊連接節點 edges[i][0] 和 edges[i][1] 。返回一個表示節點 i 與其他所有節點距離之和的列表 ans。示例 1:輸入: N 6, edges [[0,1],[0,2],[2,3],[2,4],[2,5]] 輸出: [8,12,6,10,10,10] 解…