Python辦公自動化之Excel報表自動化,看這一篇就夠了!

作者:超級大洋蔥806
來源:https://blog.csdn.net/u014779536/article/details/108182833
今天給大家分享一篇Python自動化辦公干貨,全文3W+字,內(nèi)容很干,可以碼住細細品味。
0. Python Excel庫對比
我們先來看一下python中能操作Excel的庫對比(一共九個庫):
1. Python xlrd 讀取 操作Excel
1.1 xlrd模塊介紹
(1)什么是xlrd模塊?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。
在UI自動化或者接口自動化中數(shù)據(jù)維護是一個核心,所以此模塊非常實用。
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)#文件名以及路徑,如果路徑或者文件名有中文給前面加一個?r
- 常用的函數(shù)
excel中最重要的方法就是book和sheet的操作
table?=?data.sheets()[0]?????????????#通過索引順序獲取(2) 行的操作
table?=?data.sheet_by_index(sheet_indx)??#通過索引順序獲取
table?=?data.sheet_by_name(sheet_name)??#通過名稱獲取
#?以上三個函數(shù)都會返回一個xlrd.sheet.Sheet()對象
names?=?data.sheet_names()????????#返回book中所有工作表的名字
data.sheet_loaded(sheet_name?or?indx)????#?檢查某個sheet是否導(dǎo)入完畢
nrows?=?table.nrows
????#?獲取該sheet中的行數(shù),注,這里table.nrows后面不帶().
table.row(rowx)
????#?返回由該行中所有的單元格對象組成的列表,這與tabel.raw()方法并沒有區(qū)別。
table.row_slice(rowx)
????#?返回由該行中所有的單元格對象組成的列表
table.row_types(rowx,?start_colx=0,?end_colx=None)
????#?返回由該行中所有單元格的數(shù)據(jù)類型組成的列表;????
????#?返回值為邏輯值列表,若類型為empy則為0,否則為1
table.row_values(rowx,?start_colx=0,?end_colx=None)
????#?返回由該行中所有單元格的數(shù)據(jù)組成的列表
table.row_len(rowx)
????#?返回該行的有效單元格長度,即這一行有多少個數(shù)據(jù)
(3)列(colnum)的操作ncols?=?table.ncols
????#?獲取列表的有效列數(shù)
table.col(colx,?start_rowx=0,?end_rowx=None)
????#?返回由該列中所有的單元格對象組成的列表
table.col_slice(colx,?start_rowx=0,?end_rowx=None)
????#?返回由該列中所有的單元格對象組成的列表
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)
????#?返回單元格對象
table.cell_type(rowx,colx)
????#?返回對應(yīng)位置單元格中的數(shù)據(jù)類型
table.cell_value(rowx,colx)
????#?返回對應(yīng)位置單元格中的數(shù)據(jù)
1.4 實戰(zhàn)訓(xùn)練
我們先在表格放入以下數(shù)據(jù),點擊保存:
使用xlrd模塊進行讀取:import?xlrd打印結(jié)果:
xlsx?=?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)
#?獲取單個表格值?(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 寫入 操作Excel(僅限xls格式!)
xlwt可以用于寫入新的Excel表格或者在原表格基礎(chǔ)上進行修改,速度也很快,推薦使用!官方文檔:https://xlwt.readthedocs.io/en/latest/2.1 pip安裝xlwt
pip?install?xlwt我這里是anaconda自帶有xlwt,所以提示已經(jīng)安裝:

2.2 使用xlwt創(chuàng)建新表格并寫入
一開始目錄下只有這兩個文件:
編寫xlwt新表格寫入程序:#?3.2.2?使用xlwt創(chuàng)建新表格并寫入
def?fun3_2_2():
????#?創(chuàng)建新的workbook(其實就是創(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(其實就是創(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中列寬的值表示方法:默認字體0的1/256為衡量單位。xlwt創(chuàng)建時使用的默認寬度為2960,既11個字符0的寬度所以我們在設(shè)置列寬時可以用如下方法:width = 256 * 20 256為衡量單位,20表示20個字符寬度程序示例:#?3.2.4?設(shè)置列寬效果如下:
def?fun3_2_4():
????#?創(chuàng)建新的workbook(其實就是創(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è)置默認的列寬及行高行高是在單元格的樣式中設(shè)置的,你可以通過自動換行通過輸入文字的多少來確定行高程序示例:#?3.2.5?設(shè)置行高效果如下:
def?fun3_2_5():
????#?創(chuàng)建新的workbook(其實就是創(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,類型小初的字號
????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(其實就是創(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(其實就是創(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實線
????
????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(其實就是創(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?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è)置單元格對齊
使用xlwt中的Alignment來設(shè)置單元格的對齊方式,其中horz代表水平對齊方式,vert代表垂直對齊方式。VERT_TOP = 0x00 上端對齊VERT_CENTER = 0x01 居中對齊(垂直方向上)
VERT_BOTTOM = 0x02 低端對齊
HORZ_LEFT = 0x01 左端對齊
HORZ_CENTER = 0x02 居中對齊(水平方向上)
HORZ_RIGHT = 0x03 右端對齊程序示例:
#?設(shè)置單元格對齊效果如下:
def?fun3_2_9():
????#?創(chuàng)建新的workbook(其實就是創(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???????上端對齊
????#?VERT_CENTER?=?0x01????居中對齊(垂直方向上)
????#?VERT_BOTTOM?=?0x02????低端對齊
????#?HORZ_LEFT?=?0x01??????左端對齊
????#?HORZ_CENTER?=?0x02????居中對齊(水平方向上)
????#?HORZ_RIGHT?=?0x03?????右端對齊
????al.horz?=?0x02??#?設(shè)置水平居中
????al.vert?=?0x01??#?設(shè)置垂直居中
????style.alignment?=?al
????#?對齊寫入
????worksheet.write(2,1,?"內(nèi)容2",style)
????#?保存
????workbook.save("新創(chuàng)建的表格.xls")

3. Python xlutils 修改 操作Excel
xlutils可用于拷貝原excel或者在原excel基礎(chǔ)上進行修改,并保存;官方文檔: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對象拷貝轉(zhuǎn)化為xlwt對象
????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對象拷貝轉(zhuǎn)化為xlwt對象
????#?讀取表格信息
????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ù)制了源文件信息,并進行了追加:
4. Python xlwings 讀取 寫入 修改 操作Excel
xlwings比起xlrd、xlwt和xlutils,xlwings可豪華多了,它具備以下特點:xlwings能夠非常方便的讀寫Excel文件中的數(shù)據(jù),并且能夠進行單元格格式的修改
可以和matplotlib以及pandas無縫連接,支持讀寫numpy、pandas數(shù)據(jù)類型,將matplotlib可視化圖表導(dǎo)入到excel中。
可以調(diào)用Excel文件中VBA寫好的程序,也可以讓VBA調(diào)用用Python寫的程序。
開源免費,一直在更新


4.1 pip安裝xlwings
pip?install?xlwings
4.2 基本操作
引入庫import?xlwings?as?xw?打開Excel程序,默認設(shè)置:程序可見,只打開不新建工作薄
app?=?xw.App(visible=True,add_book=False)打開已有工作簿(支持絕對路徑和相對路徑)
#新建工作簿?(如果不接下一條代碼的話,Excel只會一閃而過,賣個萌就走了)
wb?=?app.books.add()
wb?=?app.books.open('example.xlsx')保存工作簿
#練習(xí)的時候建議直接用下面這條
#wb?=?xw.Book('example.xlsx')
#這樣的話就不會頻繁打開新的Excel
wb.save('example.xlsx')退出工作簿(可省略)
wb.close()退出Excel
app.quit()三個例子:(1)打開已存在的Excel文檔
#?導(dǎo)入xlwings模塊(2)新建Excel文檔,命名為test.xlsx,并保存在D盤
import?xlwings?as?xw
#?打開Excel程序,默認設(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()
import?xlwings?as?xw(3)在單元格輸入值新建test.xlsx,在sheet1的第一個單元格輸入 “人生” ,然后保存關(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打開已保存的test.xlsx,在sheet2的第二個單元格輸入“苦短”,然后保存關(guān)閉,退出Excel程序
????
?app=xw.App(visible=True,add_book=False)
?wb=app.books.add()
????
?#?wb就是新建的工作簿(workbook),下面則對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)作一個txt文本進行數(shù)據(jù)儲存了,也可以讀取Excel文件的數(shù)據(jù),進行計算后,并將結(jié)果保存在Excel中。
????
?app=xw.App(visible=True,add_book=False)
?wb=app.books.open(r'd:\test.xlsx')
????
?#?wb就是新建的工作簿(workbook),下面則對wb的sheet1的A1單元格賦值
?wb.sheets['sheet1'].range('A1').value='苦短'
?wb.save()
?wb.close()
?app.quit()
4.3 引用工作薄、工作表和單元格
(1)按名字引用工作簿,注意工作簿應(yīng)該首先被打開wb=xw.books['工作簿的名字‘]
(2)引用活動的工作薄wb=xw.books.active(3)引用工作簿中的sheet
sht=xw.books['工作簿的名字‘].sheets['sheet的名字'](4)引用活動sheet
#?或者
wb=xw.books['工作簿的名字']
sht=wb.sheets[sheet的名字]
sht=xw.sheets.active(5)引用A1單元格
rng=xw.books['工作簿的名字‘].sheets['sheet的名字'](6)引用活動sheet上的單元格
#?或者
sht=xw.books['工作簿的名字‘].sheets['sheet的名字']
rng=sht.range('A1')
#?注意Range首字母大寫引用單元格:
rng=xw.Range('A1')
#其中需要注意的是單元格的完全引用路徑是:
#?第一個Excel程序的第一個工作薄的第一張sheet的第一個單元格
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:?對于單元格也可以用表示行列的tuple進行引用
#?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 寫入&讀取數(shù)據(jù)
1.寫入數(shù)據(jù)(1)選擇起始單元格A1,寫入字符串‘Hello’sht.range('a1').value?=?'Hello'(2)寫入列表
#?行存儲:將列表[1,2,3]儲存在A1:C1中
sht.range('A1').value=[1,2,3]
#?列存儲:將列表[1,2,3]儲存在A1:A3中
sht.range('A1').options(transpose=True).value=[1,2,3]
#?將2x2表格,即二維數(shù)組,儲存在A1:B2中,如第一行1,2,第二行3,4
sht.range('A1').options(expand='table')=[[1,2],[3,4]]
默認按行插入: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
sht.range('a2:a5').value?=?[5,6,7,8]但是你會發(fā)現(xiàn)xlwings還是會按行處理的,上面一行等同于:
sht.range('a2').value?=?[5,6,7,8]正確語法:
sht.range('a2').options(transpose=True).value?=?[5,6,7,8]既然默認的是按行寫入,我們就把它倒過來嘛(transpose),單詞要打?qū)Γ绻愦蝈e單詞,它不會報錯,而會按默認的行來寫入(別問我怎么知道的)
多行輸入就要用二維列表了:
sht.range('a6').expand('table').value?=?[['a','b','c'],['d','e','f'],['g','h','i']]2.讀取數(shù)據(jù)(1)讀取單個值
#?將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[‘工作簿名稱']
- wb.activate() 激活為當(dāng)前工作簿
- wb.fullname 返回工作簿的絕對路徑
- wb.name 返回工作簿的名稱
- wb.save(path=None) 保存工作簿,默認路徑為工作簿原路徑,若未保存則為腳本所在的路徑
- wb. close() 關(guān)閉工作簿
#?引用Excel程序中,當(dāng)前的工作簿2.sheet常用的api
wb=xw.books.acitve
#?返回工作簿的絕對路徑
x=wb.fullname
#?返回工作簿的名稱
x=wb.name
#?保存工作簿,默認路徑為工作簿原路徑,若未保存則為腳本所在的路徑
x=wb.save(path=None)
#?關(guān)閉工作簿
x=wb.close()
#?引用某指定sheet3.range常用的api
sht=xw.books['工作簿名稱'].sheets['sheet的名稱']
#?激活sheet為活動工作表
sht.activate()
#?清除sheet的內(nèi)容和格式
sht.clear()
#?清除sheet的內(nèi)容
sht.contents()
#?獲取sheet的名稱
sht.name
#?刪除sheet
sht.delete
#?引用當(dāng)前活動工作表的單元格4.books 工作簿集合的api
rng=xw.Range('A1')
#?加入超鏈接
# rng.add_hyperlink(r'www.baidu.com','百度',‘提示:點擊即鏈接到百度')
#?取得當(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
#?獲得單元格的絕對地址
rng.get_address(row_absolute=True,?column_absolute=True,include_sheetname=False,?external=False)
#?獲得列寬
rng.column_width
#?返回range的總寬度
rng.width
#?獲得range的超鏈接
rng.hyperlink
#?獲得range中右下角最后一個單元格
rng.last_cell
#?range平移
rng.offset(row_offset=0,column_offset=0)
#range進行resize改變range的大小
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)前活動工作簿
xw.books.active
#?新建工作表
xw.sheets.add(name=None,before=None,after=None)
#?引用當(dāng)前活動sheet
xw.sheets.active
4.6 數(shù)據(jù)結(jié)構(gòu)
1.一維數(shù)據(jù)python的列表,可以和Excel中的行列進行數(shù)據(jù)交換,python中的一維列表,在Excel中默認為一行數(shù)據(jù)。import?xlwings?as?xw2.二維數(shù)據(jù)python的二維列表,可以轉(zhuǎn)換為Excel中的行列。二維列表,即列表中的元素還是列表。在Excel中,二維列表中的列表元素,代表Excel表格中的一列。例如:
sht=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
#?將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生成圖表
生成圖表的方法,具體方法也可參見:Python 操作 Excel 庫 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 ??????????????#?用來設(shè)置圖表類型,具體參數(shù)件下面詳細說明。
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ù)量'],?['1日',?2],?['2日',?1],?['3日',?3]
?????????????,?['4日',?4],?['5日',?5],?['6日',?6]]
"""圖表類型參數(shù),被注釋的那幾個,無法生成對應(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?=?i
??chart.api[1].ChartTitle.Text?=?i
??n?+=?1
wb.save('chart_圖表')
wb.close()
app.quit()





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


相關(guān)文章閱讀:
6000字長文,帶你用Python完成Excel的各種騷操作!Python 操作 Excel 庫 xlwings 常用操作詳解!
詳解 Python 操作 Excel 的各種騷操作!
5. Python openpyxl 讀取 寫入 修改 操作Excel
在openpyxl中,主要用到三個概念:Workbooks,Sheets,Cells。Workbook就是一個excel工作表;
Sheet是工作表中的一張表頁;
Cell就是簡單的一個格。
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因為我已經(jīng)安裝,所以提示如下信息:
2.打開文件(1)新建from??openpyxl?import??Workbook?(2)打開已有
#?實例化
wb?=?Workbook()
#?激活?worksheet
ws?=?wb.active
from?openpyxl??import?load_workbook3.寫入數(shù)據(jù)
wb?=?load_workbook('文件名稱.xlsx')
#?方式一:數(shù)據(jù)可以直接分配到單元格中(可以輸入公式)4.創(chuàng)建表(sheet)
ws['A1']?=?42
#?方式二:可以附加行,從第一列開始附加(從最下方空白處,最左開始)(可以輸入多行)
ws.append([1,?2,?3])
#?方式三:Python 類型會被自動轉(zhuǎn)換
ws['A3']?=?datetime.datetime.now().strftime("%Y-%m-%d")
#?方式一:插入到最后(default)5.選擇表(sheet)
ws1?=?wb.create_sheet("Mysheet")?
#?方式二:插入到最開始的位置
ws2?=?wb.create_sheet("Mysheet",?0)
#?sheet?名稱可以作為?key?進行索引6.查看表名(sheet)
>>>?ws3?=?wb["New?Title"]
>>>?ws4?=?wb.get_sheet_by_name("New?Title")
>>>?ws?is?ws3?is?ws4
True
#?顯示所有表名7.訪問單元格(cell)(1)單個單元格訪問
>>>?print(wb.sheetnames)
['Sheet2',?'New?Title',??'Sheet1']
#?遍歷所有表
>>>?for?sheet?in??wb:
...?????print(sheet.title)
#?方法一(2)多個單元格訪問
>>>?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)
#?通過切片8.保存數(shù)據(jù)
>>>?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>))
wb.save('文件名稱.xlsx')9.其它(1)改變sheet標(biāo)簽按鈕顏色
ws.sheet_properties.tabColor?=?"1072BA"?#?色值為RGB16進制值(2)獲取最大行,最大列
#?獲得最大列和最大行(3)獲取每一行每一列
print(sheet.max_row)
print(sheet.max_column)
sheet.rows為生成器, 里面是每一行的數(shù)據(jù),每一行又由一個tuple包裹。sheet.columns類似,不過里面是每個tuple是每一列的單元格。
#?因為按行,所以返回A1,?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)入的類
????['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)]
#?注意?方法會舍棄缺少數(shù)據(jù)的列(行)
rows?=?[
????['Number',?'data1',?'data2'],
????[2,?40??????],????#?這里少一個數(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號,加粗斜體,字體顏色紅色。直接使用cell的font屬性,將Font對象賦值給它。
bold_itatic_24_font?=?Font(name='等線',?size=24,?italic=True,?color=colors.RED,?bold=True)(3)對齊方式
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ū)域的左上角的那個單元格為基準(zhǔn),覆蓋其他單元格使之稱為一個大的單元格。
- 相反,拆分單元格后將這個大單元格的值返回到原來的左上角位置。
#?合并單元格,?往左上角寫入數(shù)據(jù)即可
sheet.merge_cells('B1:G1')?#?合并一行中的幾個單元格
sheet.merge_cells('A1:C3')?#?合并一個矩形區(qū)域中的單元格
- 合并后只可以往左上角寫入數(shù)據(jù),也就是區(qū)間中:左邊的坐標(biāo)。
- 如果這些要合并的單元格都有數(shù)據(jù),只會保留左上角的數(shù)據(jù),其他則丟棄。換句話說若合并前不是在左上角寫入數(shù)據(jù),合并后單元格中不會有數(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)容打印在控制臺
for?j?in?ws.rows:????#?we.rows?獲取每一行數(shù)據(jù)
????for?n?in?j:
????????print(n.value,?end="\t")???#?n.value?獲取單元格的值
????print()
#?保存,save(必須要寫文件名(絕對地址)默認?py?同級目錄下,只支持?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 實戰(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),默認是0。
????#?除非你修改了這個值,否則你使用該函數(shù)一直是在對第一張工作表進行操作。
????ws?=?wb.active
????#?設(shè)置sheet名稱
????ws.title?=?"New?Title"
????#?設(shè)置sheet顏色
????ws.sheet_properties.tabColor?=?"1072BA"
????#?保存表格
????wb.save('保存一個新的excel.xlsx')
并對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),默認是0。
????#?除非你修改了這個值,否則你使用該函數(shù)一直是在對第一張工作表進行操作。
????ws?=?wb.active
????#?保存表格
????wb.save('copy.xlsx')
3.openpyxl 讀寫Excel程序示例:#?3.5.4?openpyxl?讀寫Excel執(zhí)行結(jié)果:
def?fun3_5_4():
????wb?=?load_workbook("./3_5?openpyxl?修改操作練習(xí).xlsx")
????#?注意:該函數(shù)調(diào)用工作表的索引(_active_sheet_index),默認是0。
????#?除非你修改了這個值,否則你使用該函數(shù)一直是在對第一張工作表進行操作。
????ws?=?wb.active
????#?讀取單元格信息
????cellB2_value?=?ws['B2'].value
????print("單元格B2內(nèi)容為:",cellB2_value)
????#?寫入單元格
????ws['A1'].value?=?"OPENPYXL"
????#?保存表格
????wb.save('copy.xlsx')


6. Python xlswriter 寫入 操作Excel
XlsxWriter是一個用來寫Excel2007和xlsx文件格式的python模塊。它可以用來寫文本、數(shù)字、公式并支持單元格格式化、圖片、圖表、文檔配置、自動過濾等特性
優(yōu)點:功能更多、文檔高保真、擴展格式類型、更快并可配置 缺點:不能用來讀取和修改excel文件
6.1 xlswriter基本操作
1.安裝 xlswriter 模塊pip?install?XlsxWriter由于我已經(jīng)安裝過了,所以提示已經(jīng)安裝:
2.創(chuàng)建excel文件#?創(chuàng)建文件3.創(chuàng)建sheet
workbook?=?xlsxwriter.Workbook("new_excel.xlsx")?
#?創(chuàng)建sheet4.寫入數(shù)據(jù)(1)寫入文本
worksheet?=?workbook.add_worksheet("first_sheet")?
#?法一:(2)寫入數(shù)字
worksheet.write('A1',?'write?something')
#?法二:
worksheet.write(1,?0,?'hello?world')
#?寫入數(shù)字(3)寫入函數(shù)
worksheet.write(0,?1,?32)
worksheet.write(1,?1,?32.3)
worksheet.write(2,?1,?'=sum(B1:B2)')(4)寫入圖片
#?插入圖片(5)寫入日期
worksheet.insert_image(0,?5,?'test.png')
worksheet.insert_image(0,?5,?'test.png',?{'url':?'http://httpbin.org/'})
#?寫入日期(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
- 字體大小:font_site
- 日期格式:num_format
- 超鏈接:url
- 下劃線設(shè)置:underline
- 單元格顏色:bg_color
- 邊框:border
- 對齊方式:align
#?自定義格式6.批量往單元格寫入數(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)
#?批量往單元格寫入數(shù)據(jù)7.合并單元格寫入
worksheet.write_column('A15',?[1,?2,?3,?4,?5])??#?列寫入,從A15開始
worksheet.write_row('A12',?[6,?7,?8,?9])????????#?行寫入,從A12開始
#?合并單元格寫入8.關(guān)閉文件
worksheet.merge_range(7,5,?11,?8,?'merge_range')
workbook.close()
6.3 xlswriter 生成折線圖
示例代碼:#?-*-?coding:utf-8?-*-效果如下:
import?xlsxwriter
#?創(chuàng)建一個excel
workbook?=?xlsxwriter.Workbook("chart_line.xlsx")
#?創(chuàng)建一個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)時要用到
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)建一個柱狀圖(line?chart)
chart_col?=?workbook.add_chart({'type':?'line'})
#?配置第一個系列數(shù)據(jù)
chart_col.add_series({
????#?這里的sheet1是默認的值,因為我們在新建sheet時沒有指定sheet名
????#?如果我們新建sheet時設(shè)置了sheet名,這里就要設(shè)置成相應(yīng)的值
????'name':?'=Sheet1!$B$1',
????'categories':?'=Sheet1!$A$2:$A$7',
????'values':???'=Sheet1!$B$2:$B$7',
????'line':?{'color':?'red'},
})
#?配置第二個系列數(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'},
})
#?配置第二個系列數(shù)據(jù)(用了另一種語法)
#?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)建一個excel
workbook?=?xlsxwriter.Workbook("chart_column.xlsx")
#?創(chuàng)建一個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)時要用到
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)建一個柱狀圖(column?chart)
chart_col?=?workbook.add_chart({'type':?'column'})
#?配置第一個系列數(shù)據(jù)
chart_col.add_series({
????#?這里的sheet1是默認的值,因為我們在新建sheet時沒有指定sheet名
????#?如果我們新建sheet時設(shè)置了sheet名,這里就要設(shè)置成相應(yīng)的值
????'name':?'=Sheet1!$B$1',
????'categories':?'=Sheet1!$A$2:$A$7',
????'values':???'=Sheet1!$B$2:$B$7',
????'line':?{'color':?'red'},
})
#?配置第二個系列數(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'},
})
#?配置第二個系列數(shù)據(jù)(用了另一種語法)
#?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)建一個excel
workbook?=?xlsxwriter.Workbook("chart_pie.xlsx")
#?創(chuàng)建一個sheet
worksheet?=?workbook.add_worksheet()
#?自定義樣式,加粗
bold?=?workbook.add_format({'bold':?1})
#?--------1、準(zhǔn)備數(shù)據(jù)并寫入excel---------------
#?向excel中寫入數(shù)據(jù),建立圖標(biāo)時要用到
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)建一個柱狀圖(pie?chart)
chart_col?=?workbook.add_chart({'type':?'pie'})
#?配置第一個系列數(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 實戰(zhàn)訓(xùn)練
1.xlswriter新建并寫入Excel程序示例:#?3.6.2?xlswriter新建并寫入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)
????#?寫一些數(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可以使用一個第三方庫叫做win32com達到操作com的目的,win32com功能強大,可以操作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')
????#?后臺運行,不顯示,不警告
????app.Visible?=?0
????app.DisplayAlerts?=?0
????#?創(chuàng)建新的Excel
????#?WorkBook?=?app.Workbooks.Add()
????#?新建sheet
????#?sheet?=?WorkBook.Worksheets.Add()
????#?打開已存在表格,注意這里要用絕對路徑
????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)
????#?寫入表格信息
????sheet.Cells(2,?1).Value?=?"win32com"
????#?保存表格
????#WorkBook.Save()
????#?另存為實現(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
簡介:pandas 是基于NumPy 的一種工具,該工具是為了解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的。Pandas 納入了大量庫和一些標(biāo)準(zhǔn)的數(shù)據(jù)模型,提供了高效地操作大型數(shù)據(jù)集所需的工具。pandas提供了大量能使我們快速便捷地處理數(shù)據(jù)的函數(shù)和方法。你很快就會發(fā)現(xiàn),它是使Python成為強大而高效的數(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 讀寫 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ù),給定默認值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功能非常強大,這里只是做了又給很簡單的示例,還有很多其它操作,可參考官方文檔或快速入門進行學(xué)習(xí)。