Python辦公自動(dòng)化之Excel報(bào)表自動(dòng)化,看這一篇就夠了!

作者:超級(jí)大洋蔥806
來(lái)源:https://blog.csdn.net/u014779536/article/details/108182833
今天給大家分享一篇Python自動(dòng)化辦公干貨,全文3W+字,內(nèi)容很干,可以碼住細(xì)細(xì)品味。
0. Python Excel庫(kù)對(duì)比
我們先來(lái)看一下python中能操作Excel的庫(kù)對(duì)比(一共九個(gè)庫(kù)):
1. Python xlrd 讀取 操作Excel
1.1 xlrd模塊介紹
(1)什么是xlrd模塊?python操作excel主要用到xlrd和xlwt這兩個(gè)庫(kù),即xlrd是讀excel,xlwt是寫(xiě)excel的庫(kù)。
在UI自動(dòng)化或者接口自動(dòng)化中數(shù)據(jù)維護(hù)是一個(gè)核心,所以此模塊非常實(shí)用。
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ù)類(lèi)型
- empty(空的)
- string(text)
- number
- date
- boolean
- error
- blank(空白表格)
- 導(dǎo)入模塊
import?xlrd
- 打開(kāi)Excel文件讀取數(shù)據(jù)
data?=?xlrd.open_workbook(filename)#文件名以及路徑,如果路徑或者文件名有中文給前面加一個(gè)?r
- 常用的函數(shù)
excel中最重要的方法就是book和sheet的操作
table?=?data.sheets()[0]?????????????#通過(guò)索引順序獲取(2) 行的操作
table?=?data.sheet_by_index(sheet_indx)??#通過(guò)索引順序獲取
table?=?data.sheet_by_name(sheet_name)??#通過(guò)名稱(chēng)獲取
#?以上三個(gè)函數(shù)都會(huì)返回一個(gè)xlrd.sheet.Sheet()對(duì)象
names?=?data.sheet_names()????????#返回book中所有工作表的名字
data.sheet_loaded(sheet_name?or?indx)????#?檢查某個(gè)sheet是否導(dǎo)入完畢
nrows?=?table.nrows
????#?獲取該sheet中的行數(shù),注,這里table.nrows后面不帶().
table.row(rowx)
????#?返回由該行中所有的單元格對(duì)象組成的列表,這與tabel.raw()方法并沒(méi)有區(qū)別。
table.row_slice(rowx)
????#?返回由該行中所有的單元格對(duì)象組成的列表
table.row_types(rowx,?start_colx=0,?end_colx=None)
????#?返回由該行中所有單元格的數(shù)據(jù)類(lèi)型組成的列表;????
????#?返回值為邏輯值列表,若類(lèi)型為empy則為0,否則為1
table.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ù)類(lèi)型組成的列表
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ù)類(lèi)型
table.cell_value(rowx,colx)
????#?返回對(duì)應(yīng)位置單元格中的數(shù)據(jù)
1.4 實(shí)戰(zhàn)訓(xùn)練
我們先在表格放入以下數(shù)據(jù),點(diǎn)擊保存:
使用xlrd模塊進(jìn)行讀?。?/span>import?xlrd打印結(jié)果:
xlsx?=?xlrd.open_workbook('./3_1?xlrd?讀取?操作練習(xí).xlsx')
#?通過(guò)sheet名查找:xlsx.sheet_by_name("sheet1")
#?通過(guò)索引查找: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)
列表生成式介紹:
列表生成式學(xué)習(xí)鏈接:https://www.liaoxuefeng.com/wiki/1016959663602400/10173176096997762. Python xlwt 寫(xiě)入 操作Excel(僅限xls格式?。?/span>
xlwt可以用于寫(xiě)入新的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)建新表格并寫(xiě)入
一開(kāi)始目錄下只有這兩個(gè)文件:
編寫(xiě)xlwt新表格寫(xiě)入程序:#?3.2.2?使用xlwt創(chuàng)建新表格并寫(xiě)入
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")
????#?往表格寫(xiě)入內(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
????#?往表格寫(xiě)入內(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")
????#?往表格寫(xiě)入內(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中沒(méi)有特定的函數(shù)來(lái)設(shè)置默認(rèn)的列寬及行高行高是在單元格的樣式中設(shè)置的,你可以通過(guò)自動(dòng)換行通過(guò)輸入文字的多少來(lái)確定行高程序示例:#?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")
????#?往表格寫(xiě)入內(nèi)容
????worksheet.write(0,0,?"內(nèi)容1")
????worksheet.write(2,1,?"內(nèi)容2")
????#?設(shè)置行高
????style?=?xlwt.easyxf('font:height?360;')??#?18pt,類(lèi)型小初的字號(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")
????#?往表格寫(xiě)入內(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")
????#?往表格寫(xiě)入內(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沒(méi)有
????#?THIN實(shí)線
????
????borders.left?=?xlwt.Borders.DASHED
????borders.right?=?xlwt.Borders.DASHED
????borders.top?=?xlwt.Borders.DASHED
????borders.bottom?=?xlwt.Borders.DASHED
????borders.left_colour?=?0x40
????borders.right_colour?=?0x40
????borders.top_colour?=?0x40
????borders.bottom_colour?=?0x40
????
????style?=?xlwt.XFStyle()??#?Create?Style
????style.borders?=?borders??#?Add?Borders?to?Style
????
????worksheet.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")
????#?往表格寫(xiě)入內(nèi)容
????worksheet.write(0,0,?"內(nèi)容1")
????#?創(chuàng)建樣式
????pattern?=?xlwt.Pattern()
????
????#?May?be:?NO_PATTERN,?SOLID_PATTERN,?or?0x00?through?0x12
????pattern.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?=?5
????style?=?xlwt.XFStyle()
????style.pattern?=?pattern
????#?使用樣式
????worksheet.write(2,1,?"內(nèi)容2",style)

2.9 xlwt設(shè)置單元格對(duì)齊
使用xlwt中的Alignment來(lái)設(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")
????#?往表格寫(xiě)入內(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ì)齊寫(xiě)入
????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安裝過(guò)程:

3.2 xlutils拷貝源文件(需配合x(chóng)lrd使用)
表格內(nèi)容如下:
程序示例:#?3.3.2?拷貝源文件效果如下:
def?fun3_3_2():
????workbook?=?xlrd.open_workbook('3_3?xlutils?修改操作練習(xí).xlsx')??#?打開(kāi)工作簿
????new_workbook?=?copy(workbook)??#?將xlrd對(duì)象拷貝轉(zhuǎn)化為xlwt對(duì)象
????new_workbook.save("new_test.xls")??#?保存工作簿
內(nèi)容為:
不過(guò)表格的樣式全部消失了。3.3 xlutils 讀取 寫(xiě)入 (也就是修改)Excel 表格信息
程序示例:#?3.3.3?xlutils讀取?寫(xiě)入?Excel?表格信息效果如下:
def?fun3_3_3():
????# file_path:文件路徑,包含文件的全名稱(chēng)
????# 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)
????#?寫(xiě)入表格信息
????write_save?=?new_workbook.get_sheet(0)
????write_save.write(0,?0,?"xlutils寫(xiě)入!")
????new_workbook.save("new_test.xls")??#?保存工作簿
復(fù)制了源文件信息,并進(jìn)行了追加:
4. Python xlwings 讀取 寫(xiě)入 修改 操作Excel
xlwings比起xlrd、xlwt和xlutils,xlwings可豪華多了,它具備以下特點(diǎn):xlwings能夠非常方便的讀寫(xiě)Excel文件中的數(shù)據(jù),并且能夠進(jìn)行單元格格式的修改
可以和matplotlib以及pandas無(wú)縫連接,支持讀寫(xiě)numpy、pandas數(shù)據(jù)類(lèi)型,將matplotlib可視化圖表導(dǎo)入到excel中。
可以調(diào)用Excel文件中VBA寫(xiě)好的程序,也可以讓VBA調(diào)用用Python寫(xiě)的程序。
開(kāi)源免費(fèi),一直在更新


4.1 pip安裝xlwings
pip?install?xlwings
4.2 基本操作
引入庫(kù)import?xlwings?as?xw?打開(kāi)Excel程序,默認(rèn)設(shè)置:程序可見(jiàn),只打開(kāi)不新建工作薄
app?=?xw.App(visible=True,add_book=False)打開(kāi)已有工作簿(支持絕對(duì)路徑和相對(duì)路徑)
#新建工作簿?(如果不接下一條代碼的話,Excel只會(huì)一閃而過(guò),賣(mài)個(gè)萌就走了)
wb?=?app.books.add()
wb?=?app.books.open('example.xlsx')保存工作簿
#練習(xí)的時(shí)候建議直接用下面這條
#wb?=?xw.Book('example.xlsx')
#這樣的話就不會(huì)頻繁打開(kāi)新的Excel
wb.save('example.xlsx')退出工作簿(可省略)
wb.close()退出Excel
app.quit()三個(gè)例子:(1)打開(kāi)已存在的Excel文檔
#?導(dǎo)入xlwings模塊(2)新建Excel文檔,命名為test.xlsx,并保存在D盤(pán)
import?xlwings?as?xw
#?打開(kāi)Excel程序,默認(rèn)設(shè)置:程序可見(jiàn),只打開(kāi)不新建工作薄,屏幕更新關(guān)閉
app=xw.App(visible=True,add_book=False)
app.display_alerts=False
app.screen_updating=False
#?文件位置:filepath,打開(kāi)test文檔,然后保存,關(guān)閉,結(jié)束程序
filepath=r'g:\Python?Scripts\test.xlsx'
wb=app.books.open(filepath)
wb.save()
wb.close()
app.quit()
import?xlwings?as?xw(3)在單元格輸入值新建test.xlsx,在sheet1的第一個(gè)單元格輸入 “人生” ,然后保存關(guān)閉,退出Excel程序。
app=xw.App(visible=True,add_book=False)
wb=app.books.add()
wb.save(r'd:\test.xlsx')
wb.close()
app.quit()
?import?xlwings?as?xw打開(kāi)已保存的test.xlsx,在sheet2的第二個(gè)單元格輸入“苦短”,然后保存關(guān)閉,退出Excel程序
????
?app=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()
?import?xlwings?as?xw掌握以上代碼,已經(jīng)完全可以把Excel當(dāng)作一個(gè)txt文本進(jìn)行數(shù)據(jù)儲(chǔ)存了,也可以讀取Excel文件的數(shù)據(jù),進(jìn)行計(jì)算后,并將結(jié)果保存在Excel中。
????
?app=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()
4.3 引用工作薄、工作表和單元格
(1)按名字引用工作簿,注意工作簿應(yīng)該首先被打開(kāi)wb=xw.books['工作簿的名字‘]
(2)引用活動(dòng)的工作薄wb=xw.books.active(3)引用工作簿中的sheet
sht=xw.books['工作簿的名字‘].sheets['sheet的名字'](4)引用活動(dòng)sheet
#?或者
wb=xw.books['工作簿的名字']
sht=wb.sheets[sheet的名字]
sht=xw.sheets.active(5)引用A1單元格
rng=xw.books['工作簿的名字‘].sheets['sheet的名字'](6)引用活動(dòng)sheet上的單元格
#?或者
sht=xw.books['工作簿的名字‘].sheets['sheet的名字']
rng=sht.range('A1')
#?注意Range首字母大寫(xiě)引用單元格:
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')引用區(qū)域:
#rng?=?sht['a1']
#rng?=?sht[0,0]?第一行的第一列即a1,相當(dāng)于pandas的切片
rng?=?sht.range('a1:a5')
#rng?=?sht['a1:a5']
#rng?=?sht[:5,0]
4.4 寫(xiě)入&讀取數(shù)據(jù)
1.寫(xiě)入數(shù)據(jù)(1)選擇起始單元格A1,寫(xiě)入字符串‘Hello’sht.range('a1').value?=?'Hello'(2)寫(xiě)入列表
#?行存儲(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分別寫(xiě)入1,2,3,4
sht.range('a1').value?=?[1,2,3,4]等同于
sht.range('a1:d1').value?=?[1,2,3,4]
- 按列插入:A2:A5分別寫(xiě)入5,6,7,8
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)的是按行寫(xiě)入,我們就把它倒過(guò)來(lái)嘛(transpose),單詞要打?qū)Γ绻愦蝈e(cuò)單詞,它不會(huì)報(bào)錯(cuò),而會(huì)按默認(rèn)的行來(lái)寫(xiě)入(別問(wèn)我怎么知道的)
多行輸入就要用二維列表了:
sht.range('a6').expand('table').value?=?[['a','b','c'],['d','e','f'],['g','h','i']]2.讀取數(shù)據(jù)(1)讀取單個(gè)值
#?將A1的值,讀取到a變量中(2)將值讀取到列表中
a=sht.range('A1').value
#將A1到A2的值,讀取到a列表中
a=sht.range('A1:A2').value
#?將第一行和第二行的數(shù)據(jù)按二維數(shù)組的方式讀取
a=sht.range('A1:B2').value
- 選取一列的數(shù)據(jù)
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工作薄常用的apiwb=xw.books[‘工作簿名稱(chēng)']
- wb.activate() 激活為當(dāng)前工作簿
- wb.fullname 返回工作簿的絕對(duì)路徑
- wb.name 返回工作簿的名稱(chēng)
- wb.save(path=None) 保存工作簿,默認(rèn)路徑為工作簿原路徑,若未保存則為腳本所在的路徑
- wb. close() 關(guān)閉工作簿
#?引用Excel程序中,當(dāng)前的工作簿2.sheet常用的api
wb=xw.books.acitve
#?返回工作簿的絕對(duì)路徑
x=wb.fullname
#?返回工作簿的名稱(chēng)
x=wb.name
#?保存工作簿,默認(rèn)路徑為工作簿原路徑,若未保存則為腳本所在的路徑
x=wb.save(path=None)
#?關(guān)閉工作簿
x=wb.close()
#?引用某指定sheet3.range常用的api
sht=xw.books['工作簿名稱(chēng)'].sheets['sheet的名稱(chēng)']
#?激活sheet為活動(dòng)工作表
sht.activate()
#?清除sheet的內(nèi)容和格式
sht.clear()
#?清除sheet的內(nèi)容
sht.contents()
#?獲取sheet的名稱(chēng)
sht.name
#?刪除sheet
sht.delete
#?引用當(dāng)前活動(dòng)工作表的單元格4.books 工作簿集合的api
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.sheets 工作表的集合
xw.books.add()
#?引用當(dāng)前活動(dòng)工作簿
xw.books.active
#?新建工作表
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?xw2.二維數(shù)據(jù)python的二維列表,可以轉(zhuǎn)換為Excel中的行列。二維列表,即列表中的元素還是列表。在Excel中,二維列表中的列表元素,代表Excel表格中的一列。例如:
sht=xw.sheets.active
#?將1,2,3分別寫(xiě)入了A1,B1,C1單元格中
sht.range('A1').value=[1,2,3]
#?將A1,B1,C1單元格的值存入list1列表中
list1=sht.range('A1:C1').value
#?將1,2,3分別寫(xiě)入了A1,A2,A3單元格中
sht.range('A1').options(transpose=True).value=[1,2,3]
#?將A1,A2,A3單元格中值存入list1列表中
list1=sht.range('A1:A3').value
#?將a1,a2,a3輸入第一列,b1,b2,b3輸入第二列
list1=[[‘a(chǎn)1’,'a2','a3'],['b1','b2','b3']]
sht.range('A1').value=list1

#?將A1:B3的值賦給二維列表list13.Excel中區(qū)域的選取表格
list1=sht.range('A1:B3').value
#?選取第一列
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生成圖表
生成圖表的方法,具體方法也可參見(jiàn):Python 操作 Excel 庫(kù) xlwings 常用操作詳解!import?xlwings?as?xw示例代碼:
app?=?xw.App()
wb?=?app.books.active
sht?=?wb.sheets.active
chart?=?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 ??????????????#?用來(lái)設(shè)置圖表類(lèi)型,具體參數(shù)件下面詳細(xì)說(shuō)明。
chart.api[1].ChartTitle.Text?=?i??????????#?用來(lá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]]
"""圖表類(lèi)型參數(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??#?用來(lái)生成圖表放置的x坐標(biāo)。
??yy?=?y?+?n//3*h???#?用來(lái)生成圖表放置的y坐標(biāo)。
??chart?=?sht.charts.add(xx,?yy)
??chart.set_source_data(sht.range('A1').expand())
??chart.chart_type?=?i
??chart.api[1].ChartTitle.Text?=?i
??n?+=?1
wb.save('chart_圖表')
wb.close()
app.quit()





4.8 實(shí)戰(zhàn)訓(xùn)練
1. xlwings 新建 Excel 文檔
程序示例:#?3.4.2?xlwings?新建?Excle?文檔執(zhí)行程序后文件夾增加了“example.xlsx”:
def?fun3_4_2():
????"""
????visible
??? Ture:可見(jiàn)excel
??? False:不可見(jiàn)excel
????add_book
????True:打開(kāi)excel并且新建工作簿
??? False:不新建工作簿
????"""
????app?=?xw.App(visible=True,?add_book=False)
????#?新建工作簿?(如果不接下一條代碼的話,Excel只會(huì)一閃而過(guò),賣(mài)個(gè)萌就走了)
????wb?=?app.books.add()
????#?保存工作簿
????wb.save('example.xlsx')
????#?退出工作簿
????wb.close()
????#?退出Excel
????app.quit()
此時(shí)表格是空的:
2. xlwings 打開(kāi)已存在的 Excel 文檔現(xiàn)有表格長(zhǎng)這樣:
運(yùn)行程序:#?3.4.3?xlwings?打開(kāi)已存在的Excel文件生成新的表格:
def?fun3_4_3():
????#?新建Excle 默認(rèn)設(shè)置:程序可見(jiàn),只打開(kāi)不新建工作薄,屏幕更新關(guān)閉
????app?=?xw.App(visible=True,?add_book=False)
????app.display_alerts?=?False
????app.screen_updating?=?False
????#?打開(kāi)已存在的Excel文件
????wb=app.books.open('./3_4?xlwings?修改操作練習(xí).xlsx')
????#?保存工作簿
????wb.save('example_2.xlsx')
????#?退出工作簿
????wb.close()
????#?退出Excel
????app.quit()
內(nèi)容如下:
3. xlwings 讀寫(xiě) Excel程序示例:#??3.4.4?xlwings讀寫(xiě)?Excel執(zhí)行效果:
def?fun3_4_4():
????#?新建Excle 默認(rèn)設(shè)置:程序可見(jiàn),只打開(kāi)不新建工作薄,屏幕更新關(guān)閉
????app?=?xw.App(visible=True,?add_book=False)
????app.display_alerts?=?False
????app.screen_updating?=?False
????#?打開(kāi)已存在的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').value
????print("單元格B1內(nèi)容為:",cellB1_value)
????#?清除單元格內(nèi)容和格式
????sheet.range('A1').clear()
????#?寫(xiě)入單元格
????sheet.range('A1').value?=?"xlwings寫(xiě)入"
????#?保存工作簿
????wb.save('example_3.xlsx')
????#?退出工作簿
????wb.close()
????#?退出Excel
????app.quit()


相關(guān)文章閱讀:
6000字長(zhǎng)文,帶你用Python完成Excel的各種騷操作!Python 操作 Excel 庫(kù) xlwings 常用操作詳解!
詳解 Python 操作 Excel 的各種騷操作!
5. Python openpyxl 讀取 寫(xiě)入 修改 操作Excel
在openpyxl中,主要用到三個(gè)概念:Workbooks,Sheets,Cells。Workbook就是一個(gè)excel工作表;
Sheet是工作表中的一張表頁(yè);
Cell就是簡(jiǎn)單的一個(gè)格。
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.打開(kāi)文件(1)新建from??openpyxl?import??Workbook?(2)打開(kāi)已有
#?實(shí)例化
wb?=?Workbook()
#?激活?worksheet
ws?=?wb.active
from?openpyxl??import?load_workbook3.寫(xiě)入數(shù)據(jù)
wb?=?load_workbook('文件名稱(chēng).xlsx')
#?方式一:數(shù)據(jù)可以直接分配到單元格中(可以輸入公式)4.創(chuàng)建表(sheet)
ws['A1']?=?42
#?方式二:可以附加行,從第一列開(kāi)始附加(從最下方空白處,最左開(kāi)始)(可以輸入多行)
ws.append([1,?2,?3])
#?方式三:Python 類(lèi)型會(huì)被自動(dòng)轉(zhuǎn)換
ws['A3']?=?datetime.datetime.now().strftime("%Y-%m-%d")
#?方式一:插入到最后(default)5.選擇表(sheet)
ws1?=?wb.create_sheet("Mysheet")?
#?方式二:插入到最開(kāi)始的位置
ws2?=?wb.create_sheet("Mysheet",?0)
#?sheet?名稱(chēng)可以作為?key?進(jìn)行索引6.查看表名(sheet)
>>>?ws3?=?wb["New?Title"]
>>>?ws4?=?wb.get_sheet_by_name("New?Title")
>>>?ws?is?ws3?is?ws4
True
#?顯示所有表名7.訪問(wèn)單元格(cell)(1)單個(gè)單元格訪問(wèn)
>>>?print(wb.sheetnames)
['Sheet2',?'New?Title',??'Sheet1']
#?遍歷所有表
>>>?for?sheet?in??wb:
...?????print(sheet.title)
#?方法一(2)多個(gè)單元格訪問(wèn)
>>>?c?=?ws['A4']
#?方法二:row 行;column 列
>>>?d?=?ws.cell(row=4,?column=2,?value=10)
#?方法三:只要訪問(wèn)就創(chuàng)建
>>>?for?i?in??range(1,101):
...?????????for?j?in?range(1,101):
...????????????ws.cell(row=i,?column=j)
#?通過(guò)切片8.保存數(shù)據(jù)
>>>?cell_range?=?ws['A1':'C2']
#?通過(guò)行(列)
>>>?colC?=?ws['C']
>>>?col_range?=?ws['C:D']
>>>?row10?=?ws[10]
>>>?row_range?=?ws[5:10]
#?通過(guò)指定范圍(行?→?行)
>>>?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>?
#?通過(guò)指定范圍(列?→?列)
>>>?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>))
wb.save('文件名稱(chēng).xlsx')9.其它(1)改變sheet標(biāo)簽按鈕顏色
ws.sheet_properties.tabColor?=?"1072BA"?#?色值為RGB16進(jìn)制值(2)獲取最大行,最大列
#?獲得最大列和最大行(3)獲取每一行每一列
print(sheet.max_row)
print(sheet.max_column)
sheet.rows為生成器, 里面是每一行的數(shù)據(jù),每一行又由一個(gè)tuple包裹。sheet.columns類(lèi)似,不過(guò)里面是每個(gè)tuple是每一列的單元格。
#?因?yàn)榘葱校苑祷谹1,?B1,?C1這樣的順序(4)根據(jù)數(shù)字得到字母,根據(jù)字母得到數(shù)字
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)
from?openpyxl.utils?import?get_column_letter,?column_index_from_string(5)刪除工作表
#?根據(jù)列的數(shù)字返回字母
print(get_column_letter(2))??#?B
#?根據(jù)字母返回列的數(shù)字
print(column_index_from_string('D'))??#?4
#?方式一(6)矩陣置換
wb.remove(sheet)
#?方式二
del?wb[sheet]
rows?=?[10.設(shè)置單元格風(fēng)格(1)需要導(dǎo)入的類(lèi)
????['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)]
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)(3)對(duì)齊方式
sheet['A1'].font?=?bold_itatic_24_font
也是直接使用cell的屬性
aligment,這里指定垂直居中和水平居中。除了center,還可以使用right、left等等參數(shù)
#?設(shè)置B1中的數(shù)據(jù)垂直居中和水平居中(4)設(shè)置行高和列寬
sheet['B1'].alignment?=?Alignment(horizontal='center',?vertical='center')
#?第2行行高(5)合并和拆分單元格
sheet.row_dimensions[2].height?=?40
#?C列列寬
sheet.column_dimensions['C'].width?=?30
- 所謂合并單元格,即以合并區(qū)域的左上角的那個(gè)單元格為基準(zhǔn),覆蓋其他單元格使之稱(chēng)為一個(gè)大的單元格。
- 相反,拆分單元格后將這個(gè)大單元格的值返回到原來(lái)的左上角位置。
#?合并單元格,?往左上角寫(xiě)入數(shù)據(jù)即可
sheet.merge_cells('B1:G1')?#?合并一行中的幾個(gè)單元格
sheet.merge_cells('A1:C3')?#?合并一個(gè)矩形區(qū)域中的單元格
- 合并后只可以往左上角寫(xiě)入數(shù)據(jù),也就是區(qū)間中:左邊的坐標(biāo)。
- 如果這些要合并的單元格都有數(shù)據(jù),只會(huì)保留左上角的數(shù)據(jù),其他則丟棄。換句話說(shuō)若合并前不是在左上角寫(xiě)入數(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"
#?打開(kāi)文件
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
#?把上面寫(xiě)入內(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(必須要寫(xiě)文件名(絕對(duì)地址)默認(rèn)?py?同級(jí)目錄下,只支持?xlsx?格式)
wb.save(addr)
5.2 openpyxl生成2D圖表
示例代碼:from?openpyxl?import?Workbook效果如下:
from?openpyxl.chart?import?BarChart,?Series,?Reference
wb?=?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?deepcopy
chart2?=?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.active
rows?=?[
????(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執(zhí)行效果:
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名稱(chēng)
????ws.title?=?"New?Title"
????#?設(shè)置sheet顏色
????ws.sheet_properties.tabColor?=?"1072BA"
????#?保存表格
????wb.save('保存一個(gè)新的excel.xlsx')
并對(duì)sheet設(shè)置了標(biāo)題和背景顏色:
2.openpyxl 打開(kāi)已存在Excel程序示例:#?3.5.3?openpyxl?打開(kāi)已存在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 讀寫(xiě)Excel程序示例:#?3.5.4?openpyxl?讀寫(xiě)Excel執(zhí)行結(jié)果:
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'].value
????print("單元格B2內(nèi)容為:",cellB2_value)
????#?寫(xiě)入單元格
????ws['A1'].value?=?"OPENPYXL"
????#?保存表格
????wb.save('copy.xlsx')


6. Python xlswriter 寫(xiě)入 操作Excel
XlsxWriter是一個(gè)用來(lái)寫(xiě)Excel2007和xlsx文件格式的python模塊。它可以用來(lái)寫(xiě)文本、數(shù)字、公式并支持單元格格式化、圖片、圖表、文檔配置、自動(dòng)過(guò)濾等特性
優(yōu)點(diǎn):功能更多、文檔高保真、擴(kuò)展格式類(lèi)型、更快并可配置 缺點(diǎn):不能用來(lái)讀取和修改excel文件
6.1 xlswriter基本操作
1.安裝 xlswriter 模塊pip?install?XlsxWriter由于我已經(jīng)安裝過(guò)了,所以提示已經(jīng)安裝:
2.創(chuàng)建excel文件#?創(chuàng)建文件3.創(chuàng)建sheet
workbook?=?xlsxwriter.Workbook("new_excel.xlsx")?
#?創(chuàng)建sheet4.寫(xiě)入數(shù)據(jù)(1)寫(xiě)入文本
worksheet?=?workbook.add_worksheet("first_sheet")?
#?法一:(2)寫(xiě)入數(shù)字
worksheet.write('A1',?'write?something')
#?法二:
worksheet.write(1,?0,?'hello?world')
#?寫(xiě)入數(shù)字(3)寫(xiě)入函數(shù)
worksheet.write(0,?1,?32)
worksheet.write(1,?1,?32.3)
worksheet.write(2,?1,?'=sum(B1:B2)')(4)寫(xiě)入圖片
#?插入圖片(5)寫(xiě)入日期
worksheet.insert_image(0,?5,?'test.png')
worksheet.insert_image(0,?5,?'test.png',?{'url':?'http://httpbin.org/'})
#?寫(xiě)入日期(6)設(shè)置行、列屬性
d?=?workbook.add_format({'num_format':?'yyyy-mm-dd'})
worksheet.write(0,?2,?datetime.datetime.strptime('2017-09-13',?'%Y-%m-%d'),?d)
#?設(shè)置行屬性,行高設(shè)置為405.自定義格式常用格式:
worksheet.set_row(0,?40)
#?設(shè)置列屬性,把A到B列寬設(shè)置為20
worksheet.set_column('A:B',?20)
- 字體顏色:color
- 字體加粗:bold
- 字體大?。篺ont_site
- 日期格式:num_format
- 超鏈接:url
- 下劃線設(shè)置:underline
- 單元格顏色:bg_color
- 邊框:border
- 對(duì)齊方式:align
#?自定義格式6.批量往單元格寫(xiě)入數(shù)據(jù)
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)
#?批量往單元格寫(xiě)入數(shù)據(jù)7.合并單元格寫(xiě)入
worksheet.write_column('A15',?[1,?2,?3,?4,?5])??#?列寫(xiě)入,從A15開(kāi)始
worksheet.write_row('A12',?[6,?7,?8,?9])????????#?行寫(xiě)入,從A12開(kāi)始
#?合并單元格寫(xiě)入8.關(guān)閉文件
worksheet.merge_range(7,5,?11,?8,?'merge_range')
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ù)并寫(xiě)入excel---------------
#?向excel中寫(xiě)入數(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],
]
#?寫(xiě)入表頭
worksheet.write_row('A1',?headings,?bold)
#?寫(xiě)入數(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í)沒(méi)有指定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ù)并寫(xiě)入excel---------------
#?向excel中寫(xiě)入數(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],
]
#?寫(xiě)入表頭
worksheet.write_row('A1',?headings,?bold)
#?寫(xiě)入數(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í)沒(méi)有指定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ù)并寫(xiě)入excel---------------
#?向excel中寫(xiě)入數(shù)據(jù),建立圖標(biāo)時(shí)要用到
data?=?[
????['closed',?'active',?'reopen',?'NT'],
????[1012,?109,?123,?131],
]
#?寫(xiě)入數(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新建并寫(xiě)入Excel程序示例:#?3.6.2?xlswriter新建并寫(xiě)入Excel效果如下:
def?fun3_6_2():
????#?創(chuàng)建Exce并添加sheet
????workbook?=?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)
????#?寫(xiě)一些數(shù)字
????worksheet.write(2,?0,?123)
????worksheet.write(3,?0,?123.456)
????#?添加圖片
????worksheet.insert_image('B5',?'demo.png')
????workbook.close()

7. Python win32com 讀取 寫(xiě)入 修改 操作Excel
python可以使用一個(gè)第三方庫(kù)叫做win32com達(dá)到操作com的目的,win32com功能強(qiáng)大,可以操作word、調(diào)用宏等等等。7.1 pip安裝win32com
pip?install?pypiwin32由于我已經(jīng)安裝過(guò)了,所以提示已經(jīng)安裝:

7.2 Python使用win32com讀寫(xiě)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讀寫(xiě)Excel
def?fun3_7_2():
????app?=?win32com.client.Dispatch('Excel.Application')
????#?后臺(tái)運(yùn)行,不顯示,不警告
????app.Visible?=?0
????app.DisplayAlerts?=?0
????#?創(chuàng)建新的Excel
????#?WorkBook?=?app.Workbooks.Add()
????#?新建sheet
????#?sheet?=?WorkBook.Worksheets.Add()
????#?打開(kāi)已存在表格,注意這里要用絕對(duì)路徑
????WorkBook?=?app.Workbooks.Open(getScriptPath()?+?"\\3_7?win32com?修改操作練習(xí).xlsx")
????sheet?=?WorkBook.Worksheets('Sheet1')
????#?獲取單元格信息?第n行n列,不用-1
????cell01_value?=?sheet.Cells(1,2).Value
????print("cell01的內(nèi)容為:",cell01_value)
????#?寫(xiě)入表格信息
????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 讀取 寫(xiě)入 操作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/官方文檔:https://pandas.pydata.org/pandas-docs/stable/8.1 pip安裝pandas
pip?install?pandas
8.2 pandas 讀寫(xiě) Excel
表格內(nèi)容如下:
程序示例:import?pandas?as?pd效果如下:
from?pandas?import?DataFrame
#?3.8.2?pandas讀寫(xiě)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)值None
????data['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)單的示例,還有很多其它操作,可參考官方文檔或快速入門(mén)進(jìn)行學(xué)習(xí)。