日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

全网最全 Python 操作 Excel 教程,建议收藏!

發(fā)布時(shí)間:2025/3/20 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 全网最全 Python 操作 Excel 教程,建议收藏! 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【歡迎關(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?xlwings

4.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].value

4.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.delete

3.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.active

4.sheets 工作表的集合

#?新建工作表 xw.sheets.add(name=None,before=None,after=None) #?引用當(dāng)前活動(dòng)sheet xw.sheets.active

4.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').value

2.二維數(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').value

3.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 True

6.查看表名(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ù)即可 sheet.merge_cells('B1:G1')?#?合并一行中的幾個(gè)單元格 sheet.merge_cells('A1:C3')?#?合并一個(gè)矩形區(qū)域中的單元格
  • 合并后只可以往左上角寫入數(shù)據(jù),也就是區(qū)間中:左邊的坐標(biāo)。

  • 如果這些要合并的單元格都有數(shù)據(jù),只會(huì)保留左上角的數(shù)據(jù),其他則丟棄。換句話說若合并前不是在左上角寫入數(shù)據(jù),合并后單元格中不會(huì)有數(shù)據(jù)。

  • 以下是拆分單元格的代碼。拆分后,值回到A1位置

sheet.unmerge_cells('A1:C3')

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

#?自定義格式 f?=?workbook.add_format({'border':?1,?'font_size':?13,?'bold':?True,?'align':?'center','bg_color':?'cccccc'}) worksheet.write('A3',?"python?excel",?f) worksheet.set_row(0,?40,?f) worksheet.set_column('A:E',?20,?f)

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?pandas

8.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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。