全网最全 Python 操作 Excel 教程,建议收藏!
【歡迎關(guān)注微信公眾號(hào):廈門微思網(wǎng)絡(luò)】
微思網(wǎng)絡(luò)(官網(wǎng)):https://www.xmws.cn/
0 Python Excel庫(kù)對(duì)比
我們先來看一下python中能操作Excel的庫(kù)對(duì)比(一共九個(gè)庫(kù)):
1 Python xlrd 讀取 操作Excel
1.1 xlrd模塊介紹
(1)什么是xlrd模塊?
python操作excel主要用到xlrd和xlwt這兩個(gè)庫(kù),即xlrd是讀excel,xlwt是寫excel的庫(kù)。
(2)為什么使用xlrd模塊?
在UI自動(dòng)化或者接口自動(dòng)化中數(shù)據(jù)維護(hù)是一個(gè)核心,所以此模塊非常實(shí)用。
xlrd模塊可以用于讀取Excel的數(shù)據(jù),速度非常快,推薦使用!
官方文檔:https://xlrd.readthedocs.io/en/latest/
1.2 安裝xlrd模塊
到python官網(wǎng)下載http://pypi.python.org/pypi/xlrd模塊安裝,前提是已經(jīng)安裝了python 環(huán)境。
或者在cmd窗口 pip install xlrd
pip?install?xlrd我這里是anaconda自帶有xlrd,所以提示已經(jīng)安裝:
1.3 使用介紹
常用單元格的數(shù)據(jù)類型
-
empty(空的)
-
string(text)
-
number
-
date
-
boolean
-
error
-
blank(空白表格)
導(dǎo)入模塊
import?xlrd打開Excel文件讀取數(shù)據(jù)
data?=?xlrd.open_workbook(filename)#文件名以及路徑,如果路徑或者文件名有中文給前面加一個(gè)?r常用的函數(shù)
excel中最重要的方法就是book和sheet的操作
(1)獲取book(excel文件)中一個(gè)工作表
table?=?data.sheets()[0]?????????????#通過索引順序獲取 table?=?data.sheet_by_index(sheet_indx)??#通過索引順序獲取 table?=?data.sheet_by_name(sheet_name)??#通過名稱獲取#?以上三個(gè)函數(shù)都會(huì)返回一個(gè)xlrd.sheet.Sheet()對(duì)象names?=?data.sheet_names()????????#返回book中所有工作表的名字 data.sheet_loaded(sheet_name?or?indx)????#?檢查某個(gè)sheet是否導(dǎo)入完畢(2) 行的操作
nrows?=?table.nrows#?獲取該sheet中的行數(shù),注,這里table.nrows后面不帶().table.row(rowx)#?返回由該行中所有的單元格對(duì)象組成的列表,這與tabel.raw()方法并沒有區(qū)別。table.row_slice(rowx)#?返回由該行中所有的單元格對(duì)象組成的列表table.row_types(rowx,?start_colx=0,?end_colx=None)#?返回由該行中所有單元格的數(shù)據(jù)類型組成的列表;????#?返回值為邏輯值列表,若類型為empy則為0,否則為1table.row_values(rowx,?start_colx=0,?end_colx=None)#?返回由該行中所有單元格的數(shù)據(jù)組成的列表table.row_len(rowx)#?返回該行的有效單元格長(zhǎng)度,即這一行有多少個(gè)數(shù)據(jù)(3)列(colnum)的操作
ncols?=?table.ncols#?獲取列表的有效列數(shù)table.col(colx,?start_rowx=0,?end_rowx=None)#?返回由該列中所有的單元格對(duì)象組成的列表table.col_slice(colx,?start_rowx=0,?end_rowx=None)#?返回由該列中所有的單元格對(duì)象組成的列表table.col_types(colx,?start_rowx=0,?end_rowx=None)#?返回由該列中所有單元格的數(shù)據(jù)類型組成的列表table.col_values(colx,?start_rowx=0,?end_rowx=None)#?返回由該列中所有單元格的數(shù)據(jù)組成的列表(4)單元格的操作
table.cell(rowx,colx)#?返回單元格對(duì)象table.cell_type(rowx,colx)#?返回對(duì)應(yīng)位置單元格中的數(shù)據(jù)類型table.cell_value(rowx,colx)#?返回對(duì)應(yīng)位置單元格中的數(shù)據(jù)1.4 實(shí)戰(zhàn)訓(xùn)練
我們先在表格放入以下數(shù)據(jù),點(diǎn)擊保存:
使用xlrd模塊進(jìn)行讀取:
import?xlrdxlsx?=?xlrd.open_workbook('./3_1?xlrd?讀取?操作練習(xí).xlsx')#?通過sheet名查找:xlsx.sheet_by_name("sheet1") #?通過索引查找:xlsx.sheet_by_index(3) table?=?xlsx.sheet_by_index(0)#?獲取單個(gè)表格值?(2,1)表示獲取第3行第2列單元格的值 value?=?table.cell_value(2,?1) print("第3行2列值為",value)#?獲取表格行數(shù) nrows?=?table.nrows print("表格一共有",nrows,"行")#?獲取第4列所有值(列表生成式) name_list?=?[str(table.cell_value(i,?3))?for?i?in?range(1,?nrows)] print("第4列所有的值:",name_list)打印結(jié)果:
列表生成式介紹:
列表生成式學(xué)習(xí)鏈接:
https://www.liaoxuefeng.com/wiki/1016959663602400/1017317609699776
2 Python xlwt 寫入 操作Excel(僅限xls格式!)
xlwt可以用于寫入新的Excel表格或者在原表格基礎(chǔ)上進(jìn)行修改,速度也很快,推薦使用!
官方文檔:https://xlwt.readthedocs.io/en/latest/
2.1 pip安裝xlwt
pip?install?xlwt我這里是anaconda自帶有xlwt,所以提示已經(jīng)安裝:
2.2 使用xlwt創(chuàng)建新表格并寫入
一開始目錄下只有這兩個(gè)文件:
編寫xlwt新表格寫入程序:
#?3.2.2?使用xlwt創(chuàng)建新表格并寫入 def?fun3_2_2():#?創(chuàng)建新的workbook(其實(shí)就是創(chuàng)建新的excel)workbook?=?xlwt.Workbook(encoding=?'ascii')#?創(chuàng)建新的sheet表worksheet?=?workbook.add_sheet("My?new?Sheet")#?往表格寫入內(nèi)容worksheet.write(0,0,?"內(nèi)容1")worksheet.write(2,1,?"內(nèi)容2")#?保存workbook.save("新創(chuàng)建的表格.xls")生成的表格內(nèi)容如下:
2.3 xlwt 設(shè)置字體格式
程序示例:
#?3.2.3?xlwt設(shè)置字體格式 def?fun3_2_3():#?創(chuàng)建新的workbook(其實(shí)就是創(chuàng)建新的excel)workbook?=?xlwt.Workbook(encoding=?'ascii')#?創(chuàng)建新的sheet表worksheet?=?workbook.add_sheet("My?new?Sheet")#?初始化樣式style?=?xlwt.XFStyle()#?為樣式創(chuàng)建字體font?=?xlwt.Font()font.name?=?'Times?New?Roman'???#字體font.bold?=?True????????????????#加粗font.underline?=?True???????????#下劃線font.italic?=?True??????????????#斜體#?設(shè)置樣式style.font?=?font#?往表格寫入內(nèi)容worksheet.write(0,0,?"內(nèi)容1")worksheet.write(2,1,?"內(nèi)容2",style)#?保存workbook.save("新創(chuàng)建的表格.xls")效果如下:
2.4 xlwt 設(shè)置列寬
xlwt中列寬的值表示方法:默認(rèn)字體0的1/256為衡量單位。
xlwt創(chuàng)建時(shí)使用的默認(rèn)寬度為2960,既11個(gè)字符0的寬度
所以我們?cè)谠O(shè)置列寬時(shí)可以用如下方法:
width = 256 * 20 256為衡量單位,20表示20個(gè)字符寬度
程序示例:
#?3.2.4?設(shè)置列寬 def?fun3_2_4():#?創(chuàng)建新的workbook(其實(shí)就是創(chuàng)建新的excel)workbook?=?xlwt.Workbook(encoding=?'ascii')#?創(chuàng)建新的sheet表worksheet?=?workbook.add_sheet("My?new?Sheet")#?往表格寫入內(nèi)容worksheet.write(0,0,?"內(nèi)容1")worksheet.write(2,1,?"內(nèi)容2")#?設(shè)置列寬worksheet.col(0).width?=?256*20#?保存workbook.save("新創(chuàng)建的表格.xls")效果如下:
2.5 xlwt 設(shè)置行高
在xlwt中沒有特定的函數(shù)來設(shè)置默認(rèn)的列寬及行高
行高是在單元格的樣式中設(shè)置的,你可以通過自動(dòng)換行通過輸入文字的多少來確定行高
程序示例:
#?3.2.5?設(shè)置行高 def?fun3_2_5():#?創(chuàng)建新的workbook(其實(shí)就是創(chuàng)建新的excel)workbook?=?xlwt.Workbook(encoding=?'ascii')#?創(chuàng)建新的sheet表worksheet?=?workbook.add_sheet("My?new?Sheet")#?往表格寫入內(nèi)容worksheet.write(0,0,?"內(nèi)容1")worksheet.write(2,1,?"內(nèi)容2")#?設(shè)置行高style?=?xlwt.easyxf('font:height?360;')??#?18pt,類型小初的字號(hào)row?=?worksheet.row(0)row.set_style(style)#?保存workbook.save("新創(chuàng)建的表格.xls")效果如下:
2.6 xlwt 合并列和行
程序示例:
#?3.2.6?合并列和行 def?fun3_2_6():#?創(chuàng)建新的workbook(其實(shí)就是創(chuàng)建新的excel)workbook?=?xlwt.Workbook(encoding=?'ascii')#?創(chuàng)建新的sheet表worksheet?=?workbook.add_sheet("My?new?Sheet")#?往表格寫入內(nèi)容worksheet.write(0,0,?"內(nèi)容1")#?合并?第1行到第2行?的?第0列到第3列worksheet.write_merge(1,?2,?0,?3,?'Merge?Test')#?保存workbook.save("新創(chuàng)建的表格.xls")效果如下:
2.7 xlwt 添加邊框
程序示例:
#?3.2.7?添加邊框 def?fun3_2_7():#?創(chuàng)建新的workbook(其實(shí)就是創(chuàng)建新的excel)workbook?=?xlwt.Workbook(encoding=?'ascii')#?創(chuàng)建新的sheet表worksheet?=?workbook.add_sheet("My?new?Sheet")#?往表格寫入內(nèi)容worksheet.write(0,0,?"內(nèi)容1")#?設(shè)置邊框樣式borders?=?xlwt.Borders()??#?Create?Borders#?May?be:???NO_LINE,?THIN,?MEDIUM,?DASHED,?DOTTED,?THICK,?DOUBLE,?HAIR,#???????????MEDIUM_DASHED,?THIN_DASH_DOTTED,?MEDIUM_DASH_DOTTED,?THIN_DASH_DOT_DOTTED,#???????????MEDIUM_DASH_DOT_DOTTED,?SLANTED_MEDIUM_DASH_DOTTED,?or?0x00?through?0x0D.#?DASHED虛線#?NO_LINE沒有#?THIN實(shí)線borders.left?=?xlwt.Borders.DASHEDborders.right?=?xlwt.Borders.DASHEDborders.top?=?xlwt.Borders.DASHEDborders.bottom?=?xlwt.Borders.DASHEDborders.left_colour?=?0x40borders.right_colour?=?0x40borders.top_colour?=?0x40borders.bottom_colour?=?0x40style?=?xlwt.XFStyle()??#?Create?Stylestyle.borders?=?borders??#?Add?Borders?to?Styleworksheet.write(0,?0,?'內(nèi)容1',?style)worksheet.write(2,1,?"內(nèi)容2")#?保存workbook.save("新創(chuàng)建的表格.xls")效果如下:
2.8 xlwt為單元格設(shè)置背景色
程序示例:
#?設(shè)置單元格背景色 def?fun3_2_8():#?創(chuàng)建新的workbook(其實(shí)就是創(chuàng)建新的excel)workbook?=?xlwt.Workbook(encoding=?'ascii')#?創(chuàng)建新的sheet表worksheet?=?workbook.add_sheet("My?new?Sheet")#?往表格寫入內(nèi)容worksheet.write(0,0,?"內(nèi)容1")#?創(chuàng)建樣式pattern?=?xlwt.Pattern()#?May?be:?NO_PATTERN,?SOLID_PATTERN,?or?0x00?through?0x12pattern.pattern?=?xlwt.Pattern.SOLID_PATTERN#?May?be:?8?through?63.?0?=?Black,?1?=?White,?2?=?Red,?3?=?Green,?4?=?Blue,?5?=?Yellow,#?6?=?Magenta,?7?=?Cyan,?16?=?Maroon,?17?=?Dark?Green,?18?=?Dark?Blue,?19?=?Dark?Yellow?,#?almost?brown),?20?=?Dark?Magenta,?21?=?Teal,?22?=?Light?Gray,?23?=?Dark?Gray,?the?list?goes?on...pattern.pattern_fore_colour?=?5style?=?xlwt.XFStyle()style.pattern?=?pattern#?使用樣式worksheet.write(2,1,?"內(nèi)容2",style)效果如下:
2.9 xlwt設(shè)置單元格對(duì)齊
使用xlwt中的Alignment來設(shè)置單元格的對(duì)齊方式,其中horz代表水平對(duì)齊方式,vert代表垂直對(duì)齊方式。
VERT_TOP = 0x00 上端對(duì)齊
VERT_CENTER = 0x01 居中對(duì)齊(垂直方向上)
VERT_BOTTOM = 0x02 低端對(duì)齊
HORZ_LEFT = 0x01 左端對(duì)齊
HORZ_CENTER = 0x02 居中對(duì)齊(水平方向上)
HORZ_RIGHT = 0x03 右端對(duì)齊
程序示例:
#?設(shè)置單元格對(duì)齊 def?fun3_2_9():#?創(chuàng)建新的workbook(其實(shí)就是創(chuàng)建新的excel)workbook?=?xlwt.Workbook(encoding=?'ascii')#?創(chuàng)建新的sheet表worksheet?=?workbook.add_sheet("My?new?Sheet")#?往表格寫入內(nèi)容worksheet.write(0,0,?"內(nèi)容1")#?設(shè)置樣式style?=?xlwt.XFStyle()al?=?xlwt.Alignment()#?VERT_TOP?=?0x00???????上端對(duì)齊#?VERT_CENTER?=?0x01????居中對(duì)齊(垂直方向上)#?VERT_BOTTOM?=?0x02????低端對(duì)齊#?HORZ_LEFT?=?0x01??????左端對(duì)齊#?HORZ_CENTER?=?0x02????居中對(duì)齊(水平方向上)#?HORZ_RIGHT?=?0x03?????右端對(duì)齊al.horz?=?0x02??#?設(shè)置水平居中al.vert?=?0x01??#?設(shè)置垂直居中style.alignment?=?al#?對(duì)齊寫入worksheet.write(2,1,?"內(nèi)容2",style)#?保存workbook.save("新創(chuàng)建的表格.xls")效果如下:
3 Python xlutils 修改 操作Excel
xlutils可用于拷貝原excel或者在原excel基礎(chǔ)上進(jìn)行修改,并保存;
官方文檔:https://xlutils.readthedocs.io/en/latest/
3.1 pip安裝xlutils
pip?install?xlutils安裝過程:
3.2 xlutils拷貝源文件(需配合xlrd使用)
表格內(nèi)容如下:
程序示例:
#?3.3.2?拷貝源文件 def?fun3_3_2():workbook?=?xlrd.open_workbook('3_3?xlutils?修改操作練習(xí).xlsx')??#?打開工作簿new_workbook?=?copy(workbook)??#?將xlrd對(duì)象拷貝轉(zhuǎn)化為xlwt對(duì)象new_workbook.save("new_test.xls")??#?保存工作簿效果如下:
內(nèi)容為:
不過表格的樣式全部消失了。
3.3 xlutils 讀取 寫入 (也就是修改)Excel 表格信息
程序示例:
#?3.3.3?xlutils讀取?寫入?Excel?表格信息 def?fun3_3_3():# file_path:文件路徑,包含文件的全名稱# formatting_info=True:保留Excel的原格式(使用與xlsx文件)workbook?=?xlrd.open_workbook('3_3?xlutils?修改操作練習(xí).xlsx')new_workbook?=?copy(workbook)??#?將xlrd對(duì)象拷貝轉(zhuǎn)化為xlwt對(duì)象#?讀取表格信息sheet?=?workbook.sheet_by_index(0)col2?=?sheet.col_values(1)??#?取出第二列cel_value?=?sheet.cell_value(1,?1)print(col2)print(cel_value)#?寫入表格信息write_save?=?new_workbook.get_sheet(0)write_save.write(0,?0,?"xlutils寫入!")new_workbook.save("new_test.xls")??#?保存工作簿效果如下:
復(fù)制了源文件信息,并進(jìn)行了追加:
4 Python xlwings 讀取 寫入 修改 操作Excel
xlwings比起xlrd、xlwt和xlutils,xlwings可豪華多了,它具備以下特點(diǎn):
-
xlwings能夠非常方便的讀寫Excel文件中的數(shù)據(jù),并且能夠進(jìn)行單元格格式的修改
-
可以和matplotlib以及pandas無(wú)縫連接,支持讀寫numpy、pandas數(shù)據(jù)類型,將matplotlib可視化圖表導(dǎo)入到excel中。
-
可以調(diào)用Excel文件中VBA寫好的程序,也可以讓VBA調(diào)用用Python寫的程序。
-
開源免費(fèi),一直在更新
官網(wǎng)地址:https://www.xlwings.org/
官方文檔:https://docs.xlwings.org/en/stable/api.html
4.1 pip安裝xlwings
pip?install?xlwings4.2 基本操作
引入庫(kù)
import?xlwings?as?xw?打開Excel程序,默認(rèn)設(shè)置:程序可見,只打開不新建工作薄
app?=?xw.App(visible=True,add_book=False) #新建工作簿?(如果不接下一條代碼的話,Excel只會(huì)一閃而過,賣個(gè)萌就走了) wb?=?app.books.add()打開已有工作簿(支持絕對(duì)路徑和相對(duì)路徑)
wb?=?app.books.open('example.xlsx') #練習(xí)的時(shí)候建議直接用下面這條 #wb?=?xw.Book('example.xlsx') #這樣的話就不會(huì)頻繁打開新的Excel保存工作簿
wb.save('example.xlsx')退出工作簿(可省略)
wb.close()退出Excel
app.quit()三個(gè)例子:
(1)打開已存在的Excel文檔
#?導(dǎo)入xlwings模塊 import?xlwings?as?xw#?打開Excel程序,默認(rèn)設(shè)置:程序可見,只打開不新建工作薄,屏幕更新關(guān)閉 app=xw.App(visible=True,add_book=False) app.display_alerts=False app.screen_updating=False#?文件位置:filepath,打開test文檔,然后保存,關(guān)閉,結(jié)束程序 filepath=r'g:\Python?Scripts\test.xlsx' wb=app.books.open(filepath) wb.save() wb.close() app.quit()(2)新建Excel文檔,命名為test.xlsx,并保存在D盤
import?xlwings?as?xwapp=xw.App(visible=True,add_book=False) wb=app.books.add() wb.save(r'd:\test.xlsx') wb.close() app.quit()(3)在單元格輸入值
新建test.xlsx,在sheet1的第一個(gè)單元格輸入 “人生” ,然后保存關(guān)閉,退出Excel程序。
import?xlwings?as?xwapp=xw.App(visible=True,add_book=False) wb=app.books.add()#?wb就是新建的工作簿(workbook),下面則對(duì)wb的sheet1的A1單元格賦值 wb.sheets['sheet1'].range('A1').value='人生' wb.save(r'd:\test.xlsx') wb.close() app.quit()打開已保存的test.xlsx,在sheet2的第二個(gè)單元格輸入“苦短”,然后保存關(guān)閉,退出Excel程序
import?xlwings?as?xwapp=xw.App(visible=True,add_book=False) wb=app.books.open(r'd:\test.xlsx')#?wb就是新建的工作簿(workbook),下面則對(duì)wb的sheet1的A1單元格賦值 wb.sheets['sheet1'].range('A1').value='苦短' wb.save() wb.close() app.quit()掌握以上代碼,已經(jīng)完全可以把Excel當(dāng)作一個(gè)txt文本進(jìn)行數(shù)據(jù)儲(chǔ)存了,也可以讀取Excel文件的數(shù)據(jù),進(jìn)行計(jì)算后,并將結(jié)果保存在Excel中。
4.3 引用工作薄、工作表和單元格
(1)按名字引用工作簿,注意工作簿應(yīng)該首先被打開
wb=xw.books['工作簿的名字‘](2)引用活動(dòng)的工作薄
wb=xw.books.active(3)引用工作簿中的sheet
sht=xw.books['工作簿的名字‘].sheets['sheet的名字'] #?或者 wb=xw.books['工作簿的名字'] sht=wb.sheets[sheet的名字](4)引用活動(dòng)sheet
sht=xw.sheets.active(5)引用A1單元格
rng=xw.books['工作簿的名字‘].sheets['sheet的名字'] #?或者 sht=xw.books['工作簿的名字‘].sheets['sheet的名字'] rng=sht.range('A1')(6)引用活動(dòng)sheet上的單元格
#?注意Range首字母大寫 rng=xw.Range('A1')#其中需要注意的是單元格的完全引用路徑是: #?第一個(gè)Excel程序的第一個(gè)工作薄的第一張sheet的第一個(gè)單元格 xw.apps[0].books[0].sheets[0].range('A1') 迅速引用單元格的方式是 sht=xw.books['名字'].sheets['名字']#?A1單元格 rng=sht[’A1']#?A1:B5單元格 rng=sht['A1:B5']#?在第i+1行,第j+1列的單元格 #?B1單元格 rng=sht[0,1]#?A1:J10 rng=sht[:10,:10]#PS:?對(duì)于單元格也可以用表示行列的tuple進(jìn)行引用 #?A1單元格的引用 xw.Range(1,1)#A1:C3單元格的引用 xw.Range((1,1),(3,3))引用單元格:
rng?=?sht.range('a1') #rng?=?sht['a1'] #rng?=?sht[0,0]?第一行的第一列即a1,相當(dāng)于pandas的切片引用區(qū)域:
rng?=?sht.range('a1:a5') #rng?=?sht['a1:a5'] #rng?=?sht[:5,0]4.4 寫入&讀取數(shù)據(jù)
1.寫入數(shù)據(jù)
(1)選擇起始單元格A1,寫入字符串‘Hello’
sht.range('a1').value?=?'Hello'(2)寫入列表
#?行存儲(chǔ):將列表[1,2,3]儲(chǔ)存在A1:C1中 sht.range('A1').value=[1,2,3] #?列存儲(chǔ):將列表[1,2,3]儲(chǔ)存在A1:A3中 sht.range('A1').options(transpose=True).value=[1,2,3] #?將2x2表格,即二維數(shù)組,儲(chǔ)存在A1:B2中,如第一行1,2,第二行3,4 sht.range('A1').options(expand='table')=[[1,2],[3,4]]默認(rèn)按行插入:A1:D1分別寫入1,2,3,4
sht.range('a1').value?=?[1,2,3,4]等同于
sht.range('a1:d1').value?=?[1,2,3,4]按列插入:A2:A5分別寫入5,6,7,8
你可能會(huì)想:
sht.range('a2:a5').value?=?[5,6,7,8]但是你會(huì)發(fā)現(xiàn)xlwings還是會(huì)按行處理的,上面一行等同于:
sht.range('a2').value?=?[5,6,7,8]正確語(yǔ)法:
sht.range('a2').options(transpose=True).value?=?[5,6,7,8]既然默認(rèn)的是按行寫入,我們就把它倒過來嘛(transpose),單詞要打?qū)?#xff0c;如果你打錯(cuò)單詞,它不會(huì)報(bào)錯(cuò),而會(huì)按默認(rèn)的行來寫入
多行輸入就要用二維列表了:
sht.range('a6').expand('table').value?=?[['a','b','c'],['d','e','f'],['g','h','i']]2.讀取數(shù)據(jù)
(1)讀取單個(gè)值
#?將A1的值,讀取到a變量中 a=sht.range('A1').value(2)將值讀取到列表中
#將A1到A2的值,讀取到a列表中 a=sht.range('A1:A2').value #?將第一行和第二行的數(shù)據(jù)按二維數(shù)組的方式讀取 a=sht.range('A1:B2').value選取一列的數(shù)據(jù)
先計(jì)算單元格的行數(shù)(前提是連續(xù)的單元格)
rng?=?sht.range('a1').expand('table') nrows?=?rng.rows.count接著就可以按準(zhǔn)確范圍讀取了
a?=?sht.range(f'a1:a{nrows}').value選取一行的數(shù)據(jù)
ncols?=?rng.columns.count #用切片 fst_col?=?sht[0,:ncols].value4.5 常用函數(shù)和方法
1.Book工作薄常用的api
wb=xw.books[‘工作簿名稱']-
wb.activate() 激活為當(dāng)前工作簿
-
wb.fullname 返回工作簿的絕對(duì)路徑
-
wb.name 返回工作簿的名稱
-
wb.save(path=None) 保存工作簿,默認(rèn)路徑為工作簿原路徑,若未保存則為腳本所在的路徑
-
wb. close() 關(guān)閉工作簿
代碼示例:
#?引用Excel程序中,當(dāng)前的工作簿 wb=xw.books.acitve #?返回工作簿的絕對(duì)路徑 x=wb.fullname #?返回工作簿的名稱 x=wb.name #?保存工作簿,默認(rèn)路徑為工作簿原路徑,若未保存則為腳本所在的路徑 x=wb.save(path=None) #?關(guān)閉工作簿 x=wb.close()2.sheet常用的api
#?引用某指定sheet sht=xw.books['工作簿名稱'].sheets['sheet的名稱'] #?激活sheet為活動(dòng)工作表 sht.activate() #?清除sheet的內(nèi)容和格式 sht.clear() #?清除sheet的內(nèi)容 sht.contents() #?獲取sheet的名稱 sht.name #?刪除sheet sht.delete3.range常用的api
#?引用當(dāng)前活動(dòng)工作表的單元格 rng=xw.Range('A1') #?加入超鏈接 # rng.add_hyperlink(r'www.baidu.com','百度',‘提示:點(diǎn)擊即鏈接到百度') #?取得當(dāng)前range的地址 rng.address rng.get_address() #?清除range的內(nèi)容 rng.clear_contents() #?清除格式和內(nèi)容 rng.clear() #?取得range的背景色,以元組形式返回RGB值 rng.color #?設(shè)置range的顏色 rng.color=(255,255,255) #?清除range的背景色 rng.color=None #?獲得range的第一列列標(biāo) rng.column #?返回range中單元格的數(shù)據(jù) rng.count #?返回current_region rng.current_region #?返回ctrl?+?方向 rng.end('down') #?獲取公式或者輸入公式 rng.formula='=SUM(B1:B5)' #?數(shù)組公式 rng.formula_array #?獲得單元格的絕對(duì)地址 rng.get_address(row_absolute=True,?column_absolute=True,include_sheetname=False,?external=False) #?獲得列寬 rng.column_width #?返回range的總寬度 rng.width #?獲得range的超鏈接 rng.hyperlink #?獲得range中右下角最后一個(gè)單元格 rng.last_cell #?range平移 rng.offset(row_offset=0,column_offset=0) #range進(jìn)行resize改變r(jià)ange的大小 rng.resize(row_size=None,column_size=None) #?range的第一行行標(biāo) rng.row #?行的高度,所有行一樣高返回行高,不一樣返回None rng.row_height #?返回range的總高度 rng.height #?返回range的行數(shù)和列數(shù) rng.shape #?返回range所在的sheet rng.sheet #返回range的所有行 rng.rows #?range的第一行 rng.rows[0] #?range的總行數(shù) rng.rows.count #?返回range的所有列 rng.columns #?返回range的第一列 rng.columns[0] #?返回range的列數(shù) rng.columns.count #?所有range的大小自適應(yīng) rng.autofit() #?所有列寬度自適應(yīng) rng.columns.autofit() #?所有行寬度自適應(yīng) rng.rows.autofit() 4.books?工作簿集合的api#?新建工作簿 xw.books.add() #?引用當(dāng)前活動(dòng)工作簿 xw.books.active4.sheets 工作表的集合
#?新建工作表 xw.sheets.add(name=None,before=None,after=None) #?引用當(dāng)前活動(dòng)sheet xw.sheets.active4.6 數(shù)據(jù)結(jié)構(gòu)
1.一維數(shù)據(jù)
python的列表,可以和Excel中的行列進(jìn)行數(shù)據(jù)交換,python中的一維列表,在Excel中默認(rèn)為一行數(shù)據(jù)。
import?xlwings?as?xwsht=xw.sheets.active#?將1,2,3分別寫入了A1,B1,C1單元格中 sht.range('A1').value=[1,2,3]#?將A1,B1,C1單元格的值存入list1列表中 list1=sht.range('A1:C1').value#?將1,2,3分別寫入了A1,A2,A3單元格中 sht.range('A1').options(transpose=True).value=[1,2,3]#?將A1,A2,A3單元格中值存入list1列表中 list1=sht.range('A1:A3').value2.二維數(shù)據(jù)
python的二維列表,可以轉(zhuǎn)換為Excel中的行列。二維列表,即列表中的元素還是列表。在Excel中,二維列表中的列表元素,代表Excel表格中的一列。例如:
#?將a1,a2,a3輸入第一列,b1,b2,b3輸入第二列 list1=[[‘a(chǎn)1’,'a2','a3'],['b1','b2','b3']] sht.range('A1').value=list1 #?將A1:B3的值賦給二維列表list1 list1=sht.range('A1:B3').value3.Excel中區(qū)域的選取表格
#?選取第一列 rng=sht.?range('A1').expand('down') rng.value=['a1','a2','a3'] #?選取第一行 rng=sht.range('A1').expand('right') rng=['a1','b1'] #?選取表格 rng.sht.range('A1').expand('table') rng.value=[[‘a(chǎn)1’,'a2','a3'],['b1','b2','b3']]4.7 xlwings生成圖表
生成圖表的方法
import?xlwings?as?xw app?=?xw.App() wb?=?app.books.active sht?=?wb.sheets.activechart?=?sht.charts.add(100,?10)??# 100, 10?為圖表放置的位置坐標(biāo)。以像素為單位。 chart.set_source_data(sht.range('A1').expand())??#?參數(shù)為表格中的數(shù)據(jù)區(qū)域。 # chart.chart_type = i ??????????????#?用來設(shè)置圖表類型,具體參數(shù)件下面詳細(xì)說明。 chart.api[1].ChartTitle.Text?=?i??????????#?用來設(shè)置圖表的標(biāo)題。示例代碼:
import?xlwings?as?xw app?=?xw.App() wb?=?app.books.active sht?=?wb.sheets.active #?生成圖表的數(shù)據(jù) sht.range('A1').value?=?[['時(shí)間',?'數(shù)量'],?['1日',?2],?['2日',?1],?['3日',?3],?['4日',?4],?['5日',?5],?['6日',?6]] """圖表類型參數(shù),被注釋的那幾個(gè),無(wú)法生成對(duì)應(yīng)的圖表""" dic?=?{'3d_area':?-4098,'3d_area_stacked':?78,'3d_area_stacked_100':?79,'3d_bar_clustered':?60,'3d_bar_stacked':?61,'3d_bar_stacked_100':?62,'3d_column':?-4100,'3d_column_clustered':?54,'3d_column_stacked':?55,'3d_column_stacked_100':?56,'3d_line':?-4101,'3d_pie':?-4102,'3d_pie_exploded':?70,'area':?1,'area_stacked':?76,'area_stacked_100':?77,'bar_clustered':?57,'bar_of_pie':?71,'bar_stacked':?58,'bar_stacked_100':?59,'bubble':?15,'bubble_3d_effect':?87,'column_clustered':?51,'column_stacked':?52,'column_stacked_100':?53,'cone_bar_clustered':?102,'cone_bar_stacked':?103,'cone_bar_stacked_100':?104,'cone_col':?105,'cone_col_clustered':?99,'cone_col_stacked':?100,'cone_col_stacked_100':?101,'cylinder_bar_clustered':?95,'cylinder_bar_stacked':?96,'cylinder_bar_stacked_100':?97,'cylinder_col':?98,'cylinder_col_clustered':?92,'cylinder_col_stacked':?93,'cylinder_col_stacked_100':?94,'doughnut':?-4120,'doughnut_exploded':?80,'line':?4,'line_markers':?65,'line_markers_stacked':?66,'line_markers_stacked_100':?67,'line_stacked':?63,'line_stacked_100':?64,'pie':?5,'pie_exploded':?69,'pie_of_pie':?68,'pyramid_bar_clustered':?109,'pyramid_bar_stacked':?110,'pyramid_bar_stacked_100':?111,'pyramid_col':?112,'pyramid_col_clustered':?106,'pyramid_col_stacked':?107,'pyramid_col_stacked_100':?108,'radar':?-4151,'radar_filled':?82,'radar_markers':?81,#?'stock_hlc':?88,#?'stock_ohlc':?89,#?'stock_vhlc':?90,#?'stock_vohlc':?91,#?'surface':?83,#?'surface_top_view':?85,#?'surface_top_view_wireframe':?86,#?'surface_wireframe':?84,'xy_scatter':?-4169,'xy_scatter_lines':?74,'xy_scatter_lines_no_markers':?75,'xy_scatter_smooth':?72,'xy_scatter_smooth_no_markers':?73 } w?=?385 h?=?241 n?=?0 x?=?100 y?=?10 for?i?in?dic.keys():xx?=?x?+?n?%?3*w??#?用來生成圖表放置的x坐標(biāo)。yy?=?y?+?n//3*h???#?用來生成圖表放置的y坐標(biāo)。chart?=?sht.charts.add(xx,?yy)chart.set_source_data(sht.range('A1').expand())chart.chart_type?=?ichart.api[1].ChartTitle.Text?=?in?+=?1 wb.save('chart_圖表') wb.close() app.quit()效果如下:
4.8 實(shí)戰(zhàn)訓(xùn)練
1.xlwings 新建 Excel 文檔
程序示例:
#?3.4.2?xlwings?新建?Excle?文檔 def?fun3_4_2():"""visibleTure:可見excelFalse:不可見exceladd_bookTrue:打開excel并且新建工作簿False:不新建工作簿"""app?=?xw.App(visible=True,?add_book=False)#?新建工作簿?(如果不接下一條代碼的話,Excel只會(huì)一閃而過,賣個(gè)萌就走了)wb?=?app.books.add()#?保存工作簿wb.save('example.xlsx')#?退出工作簿wb.close()#?退出Excelapp.quit()執(zhí)行程序后文件夾增加了“example.xlsx”:
此時(shí)表格是空的:
2.xlwings 打開已存在的 Excel 文檔
現(xiàn)有表格長(zhǎng)這樣:
運(yùn)行程序:
#?3.4.3?xlwings?打開已存在的Excel文件 def?fun3_4_3():#?新建Excle 默認(rèn)設(shè)置:程序可見,只打開不新建工作薄,屏幕更新關(guān)閉app?=?xw.App(visible=True,?add_book=False)app.display_alerts?=?Falseapp.screen_updating?=?False#?打開已存在的Excel文件wb=app.books.open('./3_4?xlwings?修改操作練習(xí).xlsx')#?保存工作簿wb.save('example_2.xlsx')#?退出工作簿wb.close()#?退出Excelapp.quit()生成新的表格:
內(nèi)容如下:
3.xlwings 讀寫 Excel
程序示例:
#??3.4.4?xlwings讀寫?Excel def?fun3_4_4():#?新建Excle 默認(rèn)設(shè)置:程序可見,只打開不新建工作薄,屏幕更新關(guān)閉app?=?xw.App(visible=True,?add_book=False)app.display_alerts?=?Falseapp.screen_updating?=?False#?打開已存在的Excel文件wb=app.books.open('./3_4?xlwings?修改操作練習(xí).xlsx')#?獲取sheet對(duì)象print(wb.sheets)sheet?=?wb.sheets[0]#?sheet?=?wb.sheets["sheet1"]#?讀取Excel信息cellB1_value?=?sheet.range('B1').valueprint("單元格B1內(nèi)容為:",cellB1_value)#?清除單元格內(nèi)容和格式sheet.range('A1').clear()#?寫入單元格sheet.range('A1').value?=?"xlwings寫入"#?保存工作簿wb.save('example_3.xlsx')#?退出工作簿wb.close()#?退出Excelapp.quit()執(zhí)行效果:
4.9 更多請(qǐng)參考
xlwings官方文檔
插上翅膀,讓Excel飛起來——xlwings(一)
插上翅膀,讓Excel飛起來——xlwings(二)
插上翅膀,讓Excel飛起來——xlwings(三)
插上翅膀,讓Excel飛起來——xlwings(四)
Python與Excel交互——Xlwings
5 Python openpyxl 讀取 寫入 修改 操作Excel
在openpyxl中,主要用到三個(gè)概念:Workbooks,Sheets,Cells。
-
Workbook就是一個(gè)excel工作表;
-
Sheet是工作表中的一張表頁(yè);
-
Cell就是簡(jiǎn)單的一個(gè)格。
openpyxl就是圍繞著這三個(gè)概念進(jìn)行的,不管讀寫都是“三板斧”:打開Workbook,定位Sheet,操作Cell。
官方文檔:https://openpyxl.readthedocs.io/en/stable/
官方示例:
from?openpyxl?import?Workbook wb?=?Workbook()#?grab?the?active?worksheet ws?=?wb.active#?Data?can?be?assigned?directly?to?cells ws['A1']?=?42#?Rows?can?also?be?appended ws.append([1,?2,?3])#?Python?types?will?automatically?be?converted import?datetime ws['A2']?=?datetime.datetime.now()#?Save?the?file wb.save("sample.xlsx")5.1 openpyxl 基本操作
1.安裝
pip?install?openpyxl因?yàn)槲乙呀?jīng)安裝,所以提示如下信息:
2.打開文件
(1)新建
from??openpyxl?import??Workbook? #?實(shí)例化 wb?=?Workbook() #?激活?worksheet ws?=?wb.active(2)打開已有
from?openpyxl??import?load_workbookwb?=?load_workbook('文件名稱.xlsx')3.寫入數(shù)據(jù)
#?方式一:數(shù)據(jù)可以直接分配到單元格中(可以輸入公式) ws['A1']?=?42 #?方式二:可以附加行,從第一列開始附加(從最下方空白處,最左開始)(可以輸入多行) ws.append([1,?2,?3]) #?方式三:Python 類型會(huì)被自動(dòng)轉(zhuǎn)換 ws['A3']?=?datetime.datetime.now().strftime("%Y-%m-%d")4.創(chuàng)建表(sheet)
#?方式一:插入到最后(default) ws1?=?wb.create_sheet("Mysheet")? #?方式二:插入到最開始的位置 ws2?=?wb.create_sheet("Mysheet",?0)5.選擇表(sheet)
#?sheet?名稱可以作為?key?進(jìn)行索引 >>>?ws3?=?wb["New?Title"] >>>?ws4?=?wb.get_sheet_by_name("New?Title") >>>?ws?is?ws3?is?ws4 True6.查看表名(sheet)
#?顯示所有表名 >>>?print(wb.sheetnames) ['Sheet2',?'New?Title',??'Sheet1'] #?遍歷所有表 >>>?for?sheet?in??wb: ...?????print(sheet.title)7.訪問單元格(cell)
(1)單個(gè)單元格訪問
#?方法一 >>>?c?=?ws['A4'] #?方法二:row 行;column 列 >>>?d?=?ws.cell(row=4,?column=2,?value=10) #?方法三:只要訪問就創(chuàng)建 >>>?for?i?in??range(1,101): ...?????????for?j?in?range(1,101): ...????????????ws.cell(row=i,?column=j)(2)多個(gè)單元格訪問
#?通過切片 >>>?cell_range?=?ws['A1':'C2'] #?通過行(列) >>>?colC?=?ws['C'] >>>?col_range?=?ws['C:D'] >>>?row10?=?ws[10] >>>?row_range?=?ws[5:10] #?通過指定范圍(行?→?行) >>>?for?row?in??ws.iter_rows(min_row=1,?max_col=3,?max_row=2): ...????for?cell?in??row: ...????????print(cell) <Cell?Sheet1.A1> <Cell?Sheet1.B1> <Cell?Sheet1.C1> <Cell?Sheet1.A2> <Cell?Sheet1.B2> <Cell?Sheet1.C2>? #?通過指定范圍(列?→?列) >>>?for?row?in??ws.iter_rows(min_row=1,?max_col=3,?max_row=2): ...????for?cell?in??row: ...????????print(cell) <Cell?Sheet1.A1> <Cell?Sheet1.B1> <Cell?Sheet1.C1> <Cell?Sheet1.A2> <Cell?Sheet1.B2> <Cell?Sheet1.C2> #?遍歷所有?方法一 >>>?ws?=?wb.active >>>?ws['C9']?=?'hello?world' >>>?tuple(ws.rows) ((<Cell?Sheet.A1>,?<Cell?Sheet.B1>,?<Cell?Sheet.C1>), (<Cell?Sheet.A2>,?<Cell?Sheet.B2>,?<Cell?Sheet.C2>), ... (<Cell?Sheet.A8>,?<Cell?Sheet.B8>,?<Cell?Sheet.C8>), (<Cell?Sheet.A9>,?<Cell?Sheet.B9>,?<Cell?Sheet.C9>)) #?遍歷所有?方法二 >>>?tuple(ws.columns) ((<Cell?Sheet.A1>, <Cell?Sheet.A2>, <Cell?Sheet.A3>, ... <Cell?Sheet.B7>, <Cell?Sheet.B8>, <Cell?Sheet.B9>), (<Cell?Sheet.C1>, ... <Cell?Sheet.C8>, <Cell?Sheet.C9>))8.保存數(shù)據(jù)
wb.save('文件名稱.xlsx')9.其它
(1)改變sheet標(biāo)簽按鈕顏色
ws.sheet_properties.tabColor?=?"1072BA"?#?色值為RGB16進(jìn)制值(2)獲取最大行,最大列
#?獲得最大列和最大行 print(sheet.max_row) print(sheet.max_column)(3)獲取每一行每一列
sheet.rows為生成器, 里面是每一行的數(shù)據(jù),每一行又由一個(gè)tuple包裹。
sheet.columns類似,不過里面是每個(gè)tuple是每一列的單元格。
#?因?yàn)榘葱?#xff0c;所以返回A1,?B1,?C1這樣的順序 for?row?in?sheet.rows:for?cell?in?row:print(cell.value)#?A1,?A2,?A3這樣的順序 for?column?in?sheet.columns:for?cell?in?column:print(cell.value)(4)根據(jù)數(shù)字得到字母,根據(jù)字母得到數(shù)字
from?openpyxl.utils?import?get_column_letter,?column_index_from_string#?根據(jù)列的數(shù)字返回字母 print(get_column_letter(2))??#?B #?根據(jù)字母返回列的數(shù)字 print(column_index_from_string('D'))??#?4(5)刪除工作表
#?方式一 wb.remove(sheet) #?方式二 del?wb[sheet](6)矩陣置換
rows?=?[['Number',?'data1',?'data2'],[2,?40,?30],[3,?40,?25],[4,?50,?30],[5,?30,?10],[6,?25,?5],[7,?50,?10]]list(zip(*rows))#?out [('Number',?2,?3,?4,?5,?6,?7),('data1',?40,?40,?50,?30,?25,?50),('data2',?30,?25,?30,?10,?5,?10)]#?注意?方法會(huì)舍棄缺少數(shù)據(jù)的列(行) rows?=?[['Number',?'data1',?'data2'],[2,?40??????],????#?這里少一個(gè)數(shù)據(jù)[3,?40,?25],[4,?50,?30],[5,?30,?10],[6,?25,?5],[7,?50,?10], ] #?out [('Number',?2,?3,?4,?5,?6,?7),?('data1',?40,?40,?50,?30,?25,?50)]10.設(shè)置單元格風(fēng)格
(1)需要導(dǎo)入的類
from?openpyxl.styles?import?Font,?colors,?Alignment(2)字體
下面的代碼指定了等線24號(hào),加粗斜體,字體顏色紅色。直接使用cell的font屬性,將Font對(duì)象賦值給它。
bold_itatic_24_font?=?Font(name='等線',?size=24,?italic=True,?color=colors.RED,?bold=True)sheet['A1'].font?=?bold_itatic_24_font(3)對(duì)齊方式
也是直接使用cell的屬性aligment,這里指定垂直居中和水平居中。除了center,還可以使用right、left等等參數(shù)
#?設(shè)置B1中的數(shù)據(jù)垂直居中和水平居中 sheet['B1'].alignment?=?Alignment(horizontal='center',?vertical='center')(4)設(shè)置行高和列寬
#?第2行行高 sheet.row_dimensions[2].height?=?40 #?C列列寬 sheet.column_dimensions['C'].width?=?30(5)合并和拆分單元格
-
所謂合并單元格,即以合并區(qū)域的左上角的那個(gè)單元格為基準(zhǔn),覆蓋其他單元格使之稱為一個(gè)大的單元格。
-
相反,拆分單元格后將這個(gè)大單元格的值返回到原來的左上角位置。
-
合并后只可以往左上角寫入數(shù)據(jù),也就是區(qū)間中:左邊的坐標(biāo)。
-
如果這些要合并的單元格都有數(shù)據(jù),只會(huì)保留左上角的數(shù)據(jù),其他則丟棄。換句話說若合并前不是在左上角寫入數(shù)據(jù),合并后單元格中不會(huì)有數(shù)據(jù)。
-
以下是拆分單元格的代碼。拆分后,值回到A1位置
11.示例代碼
import?datetime from?random?import?choice from?time?import?time from?openpyxl?import?load_workbook from?openpyxl.utils?import?get_column_letter#?設(shè)置文件?mingc addr?=?"openpyxl.xlsx" #?打開文件 wb?=?load_workbook(addr) #?創(chuàng)建一張新表 ws?=?wb.create_sheet() #?第一行輸入 ws.append(['TIME',?'TITLE',?'A-Z'])#?輸入內(nèi)容(500行數(shù)據(jù)) for?i?in?range(500):TIME?=?datetime.datetime.now().strftime("%H:%M:%S")TITLE?=?str(time())A_Z?=?get_column_letter(choice(range(1,?50)))ws.append([TIME,?TITLE,?A_Z])#?獲取最大行 row_max?=?ws.max_row #?獲取最大列 con_max?=?ws.max_column #?把上面寫入內(nèi)容打印在控制臺(tái) for?j?in?ws.rows:????#?we.rows?獲取每一行數(shù)據(jù)for?n?in?j:print(n.value,?end="\t")???#?n.value?獲取單元格的值print() #?保存,save(必須要寫文件名(絕對(duì)地址)默認(rèn)?py?同級(jí)目錄下,只支持?xlsx?格式) wb.save(addr)5.2 openpyxl生成2D圖表
示例代碼:
from?openpyxl?import?Workbook from?openpyxl.chart?import?BarChart,?Series,?Referencewb?=?Workbook(write_only=True) ws?=?wb.create_sheet()rows?=?[('Number',?'Batch?1',?'Batch?2'),(2,?10,?30),(3,?40,?60),(4,?50,?70),(5,?20,?10),(6,?10,?40),(7,?50,?30), ]for?row?in?rows:ws.append(row)chart1?=?BarChart() chart1.type?=?"col" chart1.style?=?10 chart1.title?=?"Bar?Chart" chart1.y_axis.title?=?'Test?number' chart1.x_axis.title?=?'Sample?length?(mm)'data?=?Reference(ws,?min_col=2,?min_row=1,?max_row=7,?max_col=3) cats?=?Reference(ws,?min_col=1,?min_row=2,?max_row=7) chart1.add_data(data,?titles_from_data=True) chart1.set_categories(cats) chart1.shape?=?4 ws.add_chart(chart1,?"A10")from?copy?import?deepcopychart2?=?deepcopy(chart1) chart2.style?=?11 chart2.type?=?"bar" chart2.title?=?"Horizontal?Bar?Chart" ws.add_chart(chart2,?"G10")chart3?=?deepcopy(chart1) chart3.type?=?"col" chart3.style?=?12 chart3.grouping?=?"stacked" chart3.overlap?=?100 chart3.title?=?'Stacked?Chart' ws.add_chart(chart3,?"A27")chart4?=?deepcopy(chart1) chart4.type?=?"bar" chart4.style?=?13 chart4.grouping?=?"percentStacked" chart4.overlap?=?100 chart4.title?=?'Percent?Stacked?Chart' ws.add_chart(chart4,?"G27")wb.save("bar.xlsx")效果如下:
5.3 openpyxl生成3D圖表
示例代碼:
from?openpyxl?import?Workbook from?openpyxl.chart?import?(Reference,Series,BarChart3D, )wb?=?Workbook() ws?=?wb.activerows?=?[(None,?2013,?2014),("Apples",?5,?4),("Oranges",?6,?2),("Pears",?8,?3) ]for?row?in?rows:ws.append(row)data?=?Reference(ws,?min_col=2,?min_row=1,?max_col=3,?max_row=4) titles?=?Reference(ws,?min_col=1,?min_row=2,?max_row=4) chart?=?BarChart3D() chart.title?=?"3D?Bar?Chart" chart.add_data(data=data,?titles_from_data=True) chart.set_categories(titles)ws.add_chart(chart,?"E5") wb.save("bar3d.xlsx")效果如下:
5.4 實(shí)戰(zhàn)訓(xùn)練
1.openpyxl 新建Excel
程序示例:
#?3.5.2?openpyxl?新建Excel def?fun3_5_2():wb?=?Workbook()#?注意:該函數(shù)調(diào)用工作表的索引(_active_sheet_index),默認(rèn)是0。#?除非你修改了這個(gè)值,否則你使用該函數(shù)一直是在對(duì)第一張工作表進(jìn)行操作。ws?=?wb.active#?設(shè)置sheet名稱ws.title?=?"New?Title"#?設(shè)置sheet顏色ws.sheet_properties.tabColor?=?"1072BA"#?保存表格wb.save('保存一個(gè)新的excel.xlsx')執(zhí)行效果:
并對(duì)sheet設(shè)置了標(biāo)題和背景顏色:
2.openpyxl 打開已存在Excel
程序示例:
#?3.5.3?openpyxl?打開已存在Excel def?fun3_5_3():wb?=?load_workbook("./3_5?openpyxl?修改操作練習(xí).xlsx")#?注意:該函數(shù)調(diào)用工作表的索引(_active_sheet_index),默認(rèn)是0。#?除非你修改了這個(gè)值,否則你使用該函數(shù)一直是在對(duì)第一張工作表進(jìn)行操作。ws?=?wb.active#?保存表格wb.save('copy.xlsx')效果如下:
3.openpyxl 讀寫Excel
程序示例:
#?3.5.4?openpyxl?讀寫Excel def?fun3_5_4():wb?=?load_workbook("./3_5?openpyxl?修改操作練習(xí).xlsx")#?注意:該函數(shù)調(diào)用工作表的索引(_active_sheet_index),默認(rèn)是0。#?除非你修改了這個(gè)值,否則你使用該函數(shù)一直是在對(duì)第一張工作表進(jìn)行操作。ws?=?wb.active#?讀取單元格信息cellB2_value?=?ws['B2'].valueprint("單元格B2內(nèi)容為:",cellB2_value)#?寫入單元格ws['A1'].value?=?"OPENPYXL"#?保存表格wb.save('copy.xlsx')執(zhí)行結(jié)果:
6 Python xlswriter 寫入 操作Excel
XlsxWriter是一個(gè)用來寫Excel2007和xlsx文件格式的python模塊。它可以用來寫文本、數(shù)字、公式并支持單元格格式化、圖片、圖表、文檔配置、自動(dòng)過濾等特性
優(yōu)點(diǎn):功能更多、文檔高保真、擴(kuò)展格式類型、更快并可配置 缺點(diǎn):不能用來讀取和修改excel文件
官方文檔:https://xlsxwriter.readthedocs.io/
6.1 xlswriter基本操作
1.安裝 xlswriter 模塊
pip?install?XlsxWriter由于我已經(jīng)安裝過了,所以提示已經(jīng)安裝:
2.創(chuàng)建excel文件
#?創(chuàng)建文件 workbook?=?xlsxwriter.Workbook("new_excel.xlsx")?3.創(chuàng)建sheet
#?創(chuàng)建sheet worksheet?=?workbook.add_worksheet("first_sheet")?4.寫入數(shù)據(jù)
(1)寫入文本
#?法一: worksheet.write('A1',?'write?something') #?法二: worksheet.write(1,?0,?'hello?world')(2)寫入數(shù)字
#?寫入數(shù)字 worksheet.write(0,?1,?32) worksheet.write(1,?1,?32.3)(3)寫入函數(shù)
worksheet.write(2,?1,?'=sum(B1:B2)')(4)寫入圖片
#?插入圖片 worksheet.insert_image(0,?5,?'test.png') worksheet.insert_image(0,?5,?'test.png',?{'url':?'http://httpbin.org/'})(5)寫入日期
#?寫入日期 d?=?workbook.add_format({'num_format':?'yyyy-mm-dd'}) worksheet.write(0,?2,?datetime.datetime.strptime('2017-09-13',?'%Y-%m-%d'),?d)(6)設(shè)置行、列屬性
#?設(shè)置行屬性,行高設(shè)置為40 worksheet.set_row(0,?40)#?設(shè)置列屬性,把A到B列寬設(shè)置為20 worksheet.set_column('A:B',?20)5.自定義格式
常用格式:
-
字體顏色:color
-
字體加粗:bold
-
字體大小:font_site
-
日期格式:num_format
-
超鏈接:url
-
下劃線設(shè)置:underline
-
單元格顏色:bg_color
-
邊框:border
-
對(duì)齊方式:align
6.批量往單元格寫入數(shù)據(jù)
#?批量往單元格寫入數(shù)據(jù) worksheet.write_column('A15',?[1,?2,?3,?4,?5])??#?列寫入,從A15開始 worksheet.write_row('A12',?[6,?7,?8,?9])????????#?行寫入,從A12開始7.合并單元格寫入
#?合并單元格寫入 worksheet.merge_range(7,5,?11,?8,?'merge_range')8.關(guān)閉文件
workbook.close()6.3 xlswriter 生成折線圖
示例代碼:
#?-*-?coding:utf-8?-*-import?xlsxwriter#?創(chuàng)建一個(gè)excel workbook?=?xlsxwriter.Workbook("chart_line.xlsx") #?創(chuàng)建一個(gè)sheet worksheet?=?workbook.add_worksheet() #?worksheet?=?workbook.add_worksheet("bug_analysis")#?自定義樣式,加粗 bold?=?workbook.add_format({'bold':?1})#?--------1、準(zhǔn)備數(shù)據(jù)并寫入excel--------------- #?向excel中寫入數(shù)據(jù),建立圖標(biāo)時(shí)要用到 headings?=?['Number',?'testA',?'testB'] data?=?[['2017-9-1',?'2017-9-2',?'2017-9-3',?'2017-9-4',?'2017-9-5',?'2017-9-6'],[10,?40,?50,?20,?10,?50],[30,?60,?70,?50,?40,?30], ]#?寫入表頭 worksheet.write_row('A1',?headings,?bold)#?寫入數(shù)據(jù) worksheet.write_column('A2',?data[0]) worksheet.write_column('B2',?data[1]) worksheet.write_column('C2',?data[2])#?--------2、生成圖表并插入到excel--------------- #?創(chuàng)建一個(gè)柱狀圖(line?chart) chart_col?=?workbook.add_chart({'type':?'line'})#?配置第一個(gè)系列數(shù)據(jù) chart_col.add_series({#?這里的sheet1是默認(rèn)的值,因?yàn)槲覀冊(cè)谛陆╯heet時(shí)沒有指定sheet名#?如果我們新建sheet時(shí)設(shè)置了sheet名,這里就要設(shè)置成相應(yīng)的值'name':?'=Sheet1!$B$1','categories':?'=Sheet1!$A$2:$A$7','values':???'=Sheet1!$B$2:$B$7','line':?{'color':?'red'}, })#?配置第二個(gè)系列數(shù)據(jù) chart_col.add_series({'name':?'=Sheet1!$C$1','categories':??'=Sheet1!$A$2:$A$7','values':???'=Sheet1!$C$2:$C$7','line':?{'color':?'yellow'}, })#?配置第二個(gè)系列數(shù)據(jù)(用了另一種語(yǔ)法) #?chart_col.add_series({ #?????'name':?['Sheet1',?0,?2], #?????'categories':?['Sheet1',?1,?0,?6,?0], #?????'values':?['Sheet1',?1,?2,?6,?2], #?????'line':?{'color':?'yellow'}, #?})#?設(shè)置圖表的title?和?x,y軸信息 chart_col.set_title({'name':?'The?xxx?site?Bug?Analysis'}) chart_col.set_x_axis({'name':?'Test?number'}) chart_col.set_y_axis({'name':??'Sample?length?(mm)'})#?設(shè)置圖表的風(fēng)格 chart_col.set_style(1)#?把圖表插入到worksheet并設(shè)置偏移 worksheet.insert_chart('A10',?chart_col,?{'x_offset':?25,?'y_offset':?10})workbook.close()效果如下:
6.4 xlswriter 生成柱狀圖
示例代碼:
#?-*-?coding:utf-8?-*-import?xlsxwriter#?創(chuàng)建一個(gè)excel workbook?=?xlsxwriter.Workbook("chart_column.xlsx") #?創(chuàng)建一個(gè)sheet worksheet?=?workbook.add_worksheet() #?worksheet?=?workbook.add_worksheet("bug_analysis")#?自定義樣式,加粗 bold?=?workbook.add_format({'bold':?1})#?--------1、準(zhǔn)備數(shù)據(jù)并寫入excel--------------- #?向excel中寫入數(shù)據(jù),建立圖標(biāo)時(shí)要用到 headings?=?['Number',?'testA',?'testB'] data?=?[['2017-9-1',?'2017-9-2',?'2017-9-3',?'2017-9-4',?'2017-9-5',?'2017-9-6'],[10,?40,?50,?20,?10,?50],[30,?60,?70,?50,?40,?30], ]#?寫入表頭 worksheet.write_row('A1',?headings,?bold)#?寫入數(shù)據(jù) worksheet.write_column('A2',?data[0]) worksheet.write_column('B2',?data[1]) worksheet.write_column('C2',?data[2])#?--------2、生成圖表并插入到excel--------------- #?創(chuàng)建一個(gè)柱狀圖(column?chart) chart_col?=?workbook.add_chart({'type':?'column'})#?配置第一個(gè)系列數(shù)據(jù) chart_col.add_series({#?這里的sheet1是默認(rèn)的值,因?yàn)槲覀冊(cè)谛陆╯heet時(shí)沒有指定sheet名#?如果我們新建sheet時(shí)設(shè)置了sheet名,這里就要設(shè)置成相應(yīng)的值'name':?'=Sheet1!$B$1','categories':?'=Sheet1!$A$2:$A$7','values':???'=Sheet1!$B$2:$B$7','line':?{'color':?'red'}, })#?配置第二個(gè)系列數(shù)據(jù)(用了另一種語(yǔ)法) chart_col.add_series({'name':?'=Sheet1!$C$1','categories':??'=Sheet1!$A$2:$A$7','values':???'=Sheet1!$C$2:$C$7','line':?{'color':?'yellow'}, })#?配置第二個(gè)系列數(shù)據(jù)(用了另一種語(yǔ)法) #?chart_col.add_series({ #?????'name':?['Sheet1',?0,?2], #?????'categories':?['Sheet1',?1,?0,?6,?0], #?????'values':?['Sheet1',?1,?2,?6,?2], #?????'line':?{'color':?'yellow'}, #?})#?設(shè)置圖表的title?和?x,y軸信息 chart_col.set_title({'name':?'The?xxx?site?Bug?Analysis'}) chart_col.set_x_axis({'name':?'Test?number'}) chart_col.set_y_axis({'name':??'Sample?length?(mm)'})#?設(shè)置圖表的風(fēng)格 chart_col.set_style(1)#?把圖表插入到worksheet以及偏移 worksheet.insert_chart('A10',?chart_col,?{'x_offset':?25,?'y_offset':?10})workbook.close()效果如下:
6.5 xlswriter 生成餅圖
示例代碼:
#?-*-?coding:utf-8?-*-import?xlsxwriter#?創(chuàng)建一個(gè)excel workbook?=?xlsxwriter.Workbook("chart_pie.xlsx") #?創(chuàng)建一個(gè)sheet worksheet?=?workbook.add_worksheet()#?自定義樣式,加粗 bold?=?workbook.add_format({'bold':?1})#?--------1、準(zhǔn)備數(shù)據(jù)并寫入excel--------------- #?向excel中寫入數(shù)據(jù),建立圖標(biāo)時(shí)要用到 data?=?[['closed',?'active',?'reopen',?'NT'],[1012,?109,?123,?131], ]#?寫入數(shù)據(jù) worksheet.write_row('A1',?data[0],?bold) worksheet.write_row('A2',?data[1])#?--------2、生成圖表并插入到excel--------------- #?創(chuàng)建一個(gè)柱狀圖(pie?chart) chart_col?=?workbook.add_chart({'type':?'pie'})#?配置第一個(gè)系列數(shù)據(jù) chart_col.add_series({'name':?'Bug?Analysis','categories':?'=Sheet1!$A$1:$D$1','values':?'=Sheet1!$A$2:$D$2','points':?[{'fill':?{'color':?'#00CD00'}},{'fill':?{'color':?'red'}},{'fill':?{'color':?'yellow'}},{'fill':?{'color':?'gray'}},],})#?設(shè)置圖表的title?和?x,y軸信息 chart_col.set_title({'name':?'Bug?Analysis'})#?設(shè)置圖表的風(fēng)格 chart_col.set_style(10)#?把圖表插入到worksheet以及偏移 worksheet.insert_chart('B10',?chart_col,?{'x_offset':?25,?'y_offset':?10}) workbook.close()效果如下:
6.6 實(shí)戰(zhàn)訓(xùn)練
1.xlswriter新建并寫入Excel
程序示例:
#?3.6.2?xlswriter新建并寫入Excel def?fun3_6_2():#?創(chuàng)建Exce并添加sheetworkbook?=?xlsxwriter.Workbook('demo.xlsx')worksheet?=?workbook.add_worksheet()#?設(shè)置列寬worksheet.set_column('A:A',?20)#?設(shè)置格式bold?=?workbook.add_format({'bold':?True})#?添加文字內(nèi)容worksheet.write('A1',?'Hello')#?按格式添加內(nèi)容worksheet.write('A2',?'World',?bold)#?寫一些數(shù)字worksheet.write(2,?0,?123)worksheet.write(3,?0,?123.456)#?添加圖片worksheet.insert_image('B5',?'demo.png')workbook.close()效果如下:
7 Python win32com 讀取 寫入 修改 操作Excel
python可以使用一個(gè)第三方庫(kù)叫做win32com達(dá)到操作com的目的,win32com功能強(qiáng)大,可以操作word、調(diào)用宏等等等。
7.1 pip安裝win32com
pip?install?pypiwin32由于我已經(jīng)安裝過了,所以提示已經(jīng)安裝:
7.2 Python使用win32com讀寫Excel
程序示例:
import?win32com from?win32com.client?import?Dispatch,?constants import?os#?獲取當(dāng)前腳本路徑 def?getScriptPath():nowpath?=?os.path.split(os.path.realpath(__file__))[0]print(nowpath)return?nowpath#?3.7.2?Python使用win32com讀寫Excel def?fun3_7_2():app?=?win32com.client.Dispatch('Excel.Application')#?后臺(tái)運(yùn)行,不顯示,不警告app.Visible?=?0app.DisplayAlerts?=?0#?創(chuàng)建新的Excel#?WorkBook?=?app.Workbooks.Add()#?新建sheet#?sheet?=?WorkBook.Worksheets.Add()#?打開已存在表格,注意這里要用絕對(duì)路徑WorkBook?=?app.Workbooks.Open(getScriptPath()?+?"\\3_7?win32com?修改操作練習(xí).xlsx")sheet?=?WorkBook.Worksheets('Sheet1')#?獲取單元格信息?第n行n列,不用-1cell01_value?=?sheet.Cells(1,2).Valueprint("cell01的內(nèi)容為:",cell01_value)#?寫入表格信息sheet.Cells(2,?1).Value?=?"win32com"#?保存表格#WorkBook.Save()#?另存為實(shí)現(xiàn)拷貝WorkBook.SaveAs(getScriptPath()?+?"\\new.xlsx")#?關(guān)閉表格WorkBook.Close()app.Quit()if?__name__?==?'__main__':fun3_7_2()效果如下:
內(nèi)容為:
8 Python pandas 讀取 寫入 操作Excel
簡(jiǎn)介:
pandas 是基于NumPy 的一種工具,該工具是為了解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的。Pandas 納入了大量庫(kù)和一些標(biāo)準(zhǔn)的數(shù)據(jù)模型,提供了高效地操作大型數(shù)據(jù)集所需的工具。pandas提供了大量能使我們快速便捷地處理數(shù)據(jù)的函數(shù)和方法。你很快就會(huì)發(fā)現(xiàn),它是使Python成為強(qiáng)大而高效的數(shù)據(jù)分析環(huán)境的重要因素之一。
官方網(wǎng)站:https://pandas.pydata.org/
中文網(wǎng)站:https://www.pypandas.cn/
官方文檔:https://pandas.pydata.org/pandas-docs/stable/
8.1 pip安裝pandas
pip?install?pandas8.2 pandas 讀寫 Excel
表格內(nèi)容如下:
程序示例:
import?pandas?as?pd from?pandas?import?DataFrame#?3.8.2?pandas讀寫Excel def?fun3_8_2():data?=?pd.read_excel('3_8?pandas?修改操作練習(xí).xlsx',?sheet_name='Sheet1')print(data)#?增加行數(shù)據(jù),在第5行新增data.loc[4]?=?['4',?'john',?'pandas']#?增加列數(shù)據(jù),給定默認(rèn)值Nonedata['new_col']?=?None#?保存數(shù)據(jù)DataFrame(data).to_excel('new.xlsx',?sheet_name='Sheet1',?index=False,?header=True)if?__name__?==?'__main__':fun3_8_2()效果如下:
生成的excel如下:
pandas功能非常強(qiáng)大,這里只是做了又給很簡(jiǎn)單的示例,還有很多其它操作,可參考官方文檔或快速入門進(jìn)行學(xué)習(xí)。
總結(jié)
以上是生活随笔為你收集整理的全网最全 Python 操作 Excel 教程,建议收藏!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一图看懂windows11新功能
- 下一篇: python导入csv数据例子-使用py