Python辦公自動化之Excel做表自動化:全網最全,看這一篇就夠了!
文章目錄
很多人學習python,不知道從何學起。
很多人學習python,掌握了基本語法過後,不知道在哪裡尋找案例上手。
很多已經做案例的人,卻不知道如何去學習更加高深的知識。
那麼針對這三類人,我給大家提供一個好的學習平臺,免費領取視訊教程,電子書籍,以及課程的原始碼!
QQ群:101677771
- 修訂歷史
- 0.Python Excel庫對比
- 1 Python xlrd 讀取 操作Excel
- 2 Python xlwt 寫入 操作Excel(`僅限xls格式!`)
- 2.1 pip安裝xlwt
- 2.2 使用xlwt建立新表格並寫入
- 2.3 xlwt 設定字型格式
- 2.4 xlwt 設定列寬
- 2.5 xlwt 設定行高
- 2.6 xlwt 合併列和行
- 2.7 xlwt 新增邊框
- 2.8 xlwt為單元格設定背景色
- 2.9 xlwt設定單元格對齊
- 3 Python xlutils 修改 操作Excel
- 4 Python xlwings 讀取 寫入 修改 操作Excel
- 4.1 pip安裝xlwings
- 4.2 基本操作
- 4.3 引用工作薄、工作表和單元格
- 4.4 寫入&讀取資料
- 4.5 常用函式和方法
- 4.6 資料結構
- 4.7 xlwings生成圖表
- 4.8 實戰訓練
- 4.9 更多請參考
- 5 Python openpyxl 讀取 寫入 修改 操作Excel
- 6 Python xlswriter 寫入 操作Excel
- 7 Python win32com 讀取 寫入 修改 操作Excel
- 8 Python pandas 讀取 寫入 操作Excel
修訂歷史
更新日期 | 版本號 | 備註 | 修改者 |
---|---|---|---|
2020.8.15 | v1.0 | 新建,包含7個庫的實戰操作 | tangxing07 |
2020.8.20 | v2.0 | 新增各個庫基本操作,增加圖表操作 | tangxing07 |
0.Python Excel庫對比
1.Python xlrd 讀取 操作Excel
2.Python xlwt 寫入 操作Excel
3.Python xlutils 修改 操作Excel
4.Python xlwings 讀取 寫入 修改 操作Excel
5.Python openpyxl 讀取 寫入 修改 操作Excel
6.Python xlswriter 寫入 操作Excel
7.Python win32com 讀取 寫入 修改 操作Excel
8.Python pandas 讀取 寫入 操作Excel
0.Python Excel庫對比
我們先來看一下python中能操作Excel的庫對比(一共九個庫):
1 Python xlrd 讀取 操作Excel
1.1 xlrd模組介紹
(1)什麼是xlrd模組?
- python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。
(2)為什麼使用xlrd模組?
- 在UI自動化或者介面自動化中資料維護是一個核心,所以此模組非常實用。
xlrd模組可以用於讀取Excel的資料,速度非常快,推薦使用!
官方文件:https://xlrd.readthedocs.io/en/latest/
1.2 安裝xlrd模組
-
到python官網下載http://pypi.python.org/pypi/xlrd模組安裝,前提是已經安裝了python 環境。
-
或者在cmd視窗 pip install xlrd
pip install xlrd
- 1
我這裡是anaconda自帶有xlrd,所以提示已經安裝:
1.3 使用介紹
- 常用單元格的資料型別
- empty(空的)
- string(text)
- number
- date
- boolean
- error
- blank(空白表格)
- 匯入模組
import xlrd
- 1
- 開啟Excel檔案讀取資料
data = xlrd.open_workbook(filename)#檔名以及路徑,如果路徑或者檔名有中文給前面加一個 r
- 1
- 常用的函式
- excel中最重要的方法就是book和sheet的操作
(1)獲取book(excel檔案)中一個工作表
table = data.sheets()[0] #通過索引順序獲取
table = data.sheet_by_index(sheet_indx) #通過索引順序獲取
table = data.sheet_by_name(sheet_name) #通過名稱獲取
# 以上三個函式都會返回一個xlrd.sheet.Sheet()物件
names = data.sheet_names() #返回book中所有工作表的名字
data.sheet_loaded(sheet_name or indx) # 檢查某個sheet是否匯入完畢
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
(2) 行的操作
nrows = table.nrows
# 獲取該sheet中的行數,注,這裡table.nrows後面不帶().
table.row(rowx)
# 返回由該行中所有的單元格物件組成的列表,這與tabel.raw()方法並沒有區別。
table.row_slice(rowx)
# 返回由該行中所有的單元格物件組成的列表
table.row_types(rowx, start_colx=0, end_colx=None)
# 返回由該行中所有單元格的資料型別組成的列表;
# 返回值為邏輯值列表,若型別為empy則為0,否則為1
table.row_values(rowx, start_colx=0, end_colx=None)
# 返回由該行中所有單元格的資料組成的列表
table.row_len(rowx)
# 返回該行的有效單元格長度,即這一行有多少個數據
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
(3)列(colnum)的操作
ncols = table.ncols
# 獲取列表的有效列數
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)
# 返回由該列中所有單元格的資料型別組成的列表
table.col_values(colx, start_rowx=0, end_rowx=None)
# 返回由該列中所有單元格的資料組成的列表
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
(4)單元格的操作
table.cell(rowx,colx)
# 返回單元格物件
table.cell_type(rowx,colx)
# 返回對應位置單元格中的資料型別
table.cell_value(rowx,colx)
# 返回對應位置單元格中的資料
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
1.4 實戰訓練
我們先在表格放入以下資料,點選儲存:
使用xlrd模組進行讀取:
import xlrd
xlsx = xlrd.open_workbook('./3_1 xlrd 讀取 操作練習.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)
# 獲取表格行數
nrows = table.nrows
print("表格一共有",nrows,"行")
# 獲取第4列所有值(列表生成式)
name_list = [str(table.cell_value(i, 3)) for i in range(1, nrows)]
print("第4列所有的值:",name_list)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
列印結果:
列表生成式介紹:
列表生成式學習連結:
https://www.liaoxuefeng.com/wiki/1016959663602400/1017317609699776
2 Python xlwt 寫入 操作Excel(僅限xls格式!
)
xlwt可以用於寫入新的Excel表格或者在原表格基礎上進行修改,速度也很快,推薦使用!
官方文件:https://xlwt.readthedocs.io/en/latest/
2.1 pip安裝xlwt
pip install xlwt
- 1
我這裡是anaconda自帶有xlwt,所以提示已經安裝:
2.2 使用xlwt建立新表格並寫入
一開始目錄下只有這兩個檔案:
編寫xlwt新表格寫入程式:
# 3.2.2 使用xlwt建立新表格並寫入
def fun3_2_2():
# 建立新的workbook(其實就是建立新的excel)
workbook = xlwt.Workbook(encoding= 'ascii')
# 建立新的sheet表
worksheet = workbook.add_sheet("My new Sheet")
# 往表格寫入內容
worksheet.write(0,0, "內容1")
worksheet.write(2,1, "內容2")
# 儲存
workbook.save("新建立的表格.xls")
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
生成的表格內容如下:
2.3 xlwt 設定字型格式
程式示例:
# 3.2.3 xlwt設定字型格式
def fun3_2_3():
# 建立新的workbook(其實就是建立新的excel)
workbook = xlwt.Workbook(encoding= 'ascii')
# 建立新的sheet表
worksheet = workbook.add_sheet("My new Sheet")
# 初始化樣式
style = xlwt.XFStyle()
# 為樣式建立字型
font = xlwt.Font()
font.name = 'Times New Roman' #字型
font.bold = True #加粗
font.underline = True #下劃線
font.italic = True #斜體
# 設定樣式
style.font = font
# 往表格寫入內容
worksheet.write(0,0, "內容1")
worksheet.write(2,1, "內容2",style)
# 儲存
workbook.save("新建立的表格.xls")
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
效果如下:
2.4 xlwt 設定列寬
xlwt中列寬的值表示方法:預設字型0的1/256為衡量單位。
xlwt建立時使用的預設寬度為2960,既11個字元0的寬度
所以我們在設定列寬時可以用如下方法:
width = 256 * 20 256為衡量單位,20表示20個字元寬度
程式示例:
# 3.2.4 設定列寬
def fun3_2_4():
# 建立新的workbook(其實就是建立新的excel)
workbook = xlwt.Workbook(encoding= 'ascii')
# 建立新的sheet表
worksheet = workbook.add_sheet("My new Sheet")
# 往表格寫入內容
worksheet.write(0,0, "內容1")
worksheet.write(2,1, "內容2")
# 設定列寬
worksheet.col(0).width = 256*20
# 儲存
workbook.save("新建立的表格.xls")
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
效果如下:
2.5 xlwt 設定行高
在xlwt中沒有特定的函式來設定預設的列寬及行高
行高是在單元格的樣式中設定的,你可以通過自動換行通過輸入文字的多少來確定行高
程式示例:
# 3.2.5 設定行高
def fun3_2_5():
# 建立新的workbook(其實就是建立新的excel)
workbook = xlwt.Workbook(encoding= 'ascii')
# 建立新的sheet表
worksheet = workbook.add_sheet("My new Sheet")
# 往表格寫入內容
worksheet.write(0,0, "內容1")
worksheet.write(2,1, "內容2")
# 設定行高
style = xlwt.easyxf('font:height 360;') # 18pt,型別小初的字號
row = worksheet.row(0)
row.set_style(style)
# 儲存
workbook.save("新建立的表格.xls")
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
效果如下:
2.6 xlwt 合併列和行
程式示例:
# 3.2.6 合併列和行
def fun3_2_6():
# 建立新的workbook(其實就是建立新的excel)
workbook = xlwt.Workbook(encoding= 'ascii')
# 建立新的sheet表
worksheet = workbook.add_sheet("My new Sheet")
# 往表格寫入內容
worksheet.write(0,0, "內容1")
# 合併 第1行到第2行 的 第0列到第3列
worksheet.write_merge(1, 2, 0, 3, 'Merge Test')
# 儲存
workbook.save("新建立的表格.xls")
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
效果如下:
2.7 xlwt 新增邊框
程式示例:
# 3.2.7 新增邊框
def fun3_2_7():
# 建立新的workbook(其實就是建立新的excel)
workbook = xlwt.Workbook(encoding= 'ascii')
# 建立新的sheet表
worksheet = workbook.add_sheet("My new Sheet")
# 往表格寫入內容
worksheet.write(0,0, "內容1")
# 設定邊框樣式
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, '內容1', style)
worksheet.write(2,1, "內容2")
# 儲存
workbook.save("新建立的表格.xls")
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
效果如下:
2.8 xlwt為單元格設定背景色
程式示例:
# 設定單元格背景色
def fun3_2_8():
# 建立新的workbook(其實就是建立新的excel)
workbook = xlwt.Workbook(encoding= 'ascii')
# 建立新的sheet表
worksheet = workbook.add_sheet("My new Sheet")
# 往表格寫入內容
worksheet.write(0,0, "內容1")
# 建立樣式
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, "內容2",style)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
效果如下:
2.9 xlwt設定單元格對齊
使用xlwt中的Alignment來設定單元格的對齊方式,其中horz代表水平對齊方式,vert代表垂直對齊方式。
VERT_TOP = 0x00 上端對齊
VERT_CENTER = 0x01 居中對齊(垂直方向上)
VERT_BOTTOM = 0x02 低端對齊
HORZ_LEFT = 0x01 左端對齊
HORZ_CENTER = 0x02 居中對齊(水平方向上)
HORZ_RIGHT = 0x03 右端對齊
程式示例:
# 設定單元格對齊
def fun3_2_9():
# 建立新的workbook(其實就是建立新的excel)
workbook = xlwt.Workbook(encoding= 'ascii')
# 建立新的sheet表
worksheet = workbook.add_sheet("My new Sheet")
# 往表格寫入內容
worksheet.write(0,0, "內容1")
# 設定樣式
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 # 設定水平居中
al.vert = 0x01 # 設定垂直居中
style.alignment = al
# 對齊寫入
worksheet.write(2,1, "內容2",style)
# 儲存
workbook.save("新建立的表格.xls")
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
效果如下:
3 Python xlutils 修改 操作Excel
xlutils可用於拷貝原excel或者在原excel基礎上進行修改,並儲存;
官方文件:https://xlutils.readthedocs.io/en/latest/
3.1 pip安裝xlutils
pip install xlutils
- 1
安裝過程:
3.2 xlutils拷貝原始檔(需配合xlrd使用)
表格內容如下:
程式示例:
# 3.3.2 拷貝原始檔
def fun3_3_2():
workbook = xlrd.open_workbook('3_3 xlutils 修改操作練習.xlsx') # 開啟工作簿
new_workbook = copy(workbook) # 將xlrd物件拷貝轉化為xlwt物件
new_workbook.save("new_test.xls") # 儲存工作簿
- 1
- 2
- 3
- 4
- 5
效果如下:
內容為:
不過表格的樣式全部消失了。
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 修改操作練習.xlsx')
new_workbook = copy(workbook) # 將xlrd物件拷貝轉化為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") # 儲存工作簿
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
效果如下:
複製了原始檔資訊,並進行了追加:
4 Python xlwings 讀取 寫入 修改 操作Excel
xlwings比起xlrd、xlwt和xlutils,xlwings可豪華多了,它具備以下特點:
- xlwings能夠非常方便的讀寫Excel檔案中的資料,並且能夠進行單元格格式的修改
- 可以和matplotlib以及pandas無縫連線,支援讀寫numpy、pandas資料型別,將matplotlib視覺化圖表匯入到excel中。
- 可以呼叫Excel檔案中VBA寫好的程式,也可以讓VBA呼叫用Python寫的程式。
- 開源免費,一直在更新
官方文件:https://docs.xlwings.org/en/stable/api.html
4.1 pip安裝xlwings
pip install xlwings
- 1
4.2 基本操作
引入庫
import xlwings as xw
- 1
開啟Excel程式,預設設定:程式可見,只打開不新建工作薄
app = xw.App(visible=True,add_book=False)
#新建工作簿 (如果不接下一條程式碼的話,Excel只會一閃而過,賣個萌就走了)
wb = app.books.add()
- 1
- 2
- 3
開啟已有工作簿(支援絕對路徑和相對路徑)
wb = app.books.open('example.xlsx')
#練習的時候建議直接用下面這條
#wb = xw.Book('example.xlsx')
#這樣的話就不會頻繁開啟新的Excel
- 1
- 2
- 3
- 4
儲存工作簿
wb.save('example.xlsx')
- 1
退出工作簿(可省略)
wb.close()
- 1
退出Excel
app.quit()
- 1
三個例子:
(1)開啟已存在的Excel文件
# 匯入xlwings模組
import xlwings as xw
# 開啟Excel程式,預設設定:程式可見,只打開不新建工作薄,螢幕更新關閉
app=xw.App(visible=True,add_book=False)
app.display_alerts=False
app.screen_updating=False
# 檔案位置:filepath,開啟test文件,然後儲存,關閉,結束程式
filepath=r'g:\Python Scripts\test.xlsx'
wb=app.books.open(filepath)
wb.save()
wb.close()
app.quit()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
(2)新建Excel文件,命名為test.xlsx,並儲存在D盤
import xlwings as xw
app=xw.App(visible=True,add_book=False)
wb=app.books.add()
wb.save(r'd:\test.xlsx')
wb.close()
app.quit()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
(3)在單元格輸入值
新建test.xlsx,在sheet1的第一個單元格輸入 “人生” ,然後儲存關閉,退出Excel程式。
import xlwings as xw
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()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
開啟已儲存的test.xlsx,在sheet2的第二個單元格輸入“苦短”,然後儲存關閉,退出Excel程式
import xlwings as xw
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()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
掌握以上程式碼,已經完全可以把Excel當作一個txt文字進行資料儲存了,也可以讀取Excel檔案的資料,進行計算後,並將結果儲存在Excel中。
4.3 引用工作薄、工作表和單元格
(1)按名字引用工作簿,注意工作簿應該首先被開啟
wb=xw.books['工作簿的名字‘]
- 1
(2)引用活動的工作薄
wb=xw.books.active
- 1
(3)引用工作簿中的sheet
sht=xw.books['工作簿的名字‘].sheets['sheet的名字']
# 或者
wb=xw.books['工作簿的名字']
sht=wb.sheets[sheet的名字]
- 1
- 2
- 3
- 4
(4)引用活動sheet
sht=xw.sheets.active
- 1
(5)引用A1單元格
rng=xw.books['工作簿的名字‘].sheets['sheet的名字']
# 或者
sht=xw.books['工作簿的名字‘].sheets['sheet的名字']
rng=sht.range('A1')
- 1
- 2
- 3
- 4
(6)引用活動sheet上的單元格
# 注意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))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
引用單元格:
rng = sht.range('a1')
#rng = sht['a1']
#rng = sht[0,0] 第一行的第一列即a1,相當於pandas的切片
- 1
- 2
- 3
引用區域:
rng = sht.range('a1:a5')
#rng = sht['a1:a5']
#rng = sht[:5,0]
- 1
- 2
- 3
4.4 寫入&讀取資料
1.寫入資料
(1)選擇起始單元格A1,寫入字串‘Hello’
sht.range('a1').value = 'Hello'
- 1
(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表格,即二維陣列,儲存在A1:B2中,如第一行1,2,第二行3,4
sht.range('A1').options(expand='table')=[[1,2],[3,4]]
- 1
- 2
- 3
- 4
- 5
- 6
- 預設按行插入:A1:D1分別寫入1,2,3,4
sht.range('a1').value = [1,2,3,4]
- 1
等同於
sht.range('a1:d1').value = [1,2,3,4]
- 1
- 按列插入: A2:A5分別寫入5,6,7,8
你可能會想:
sht.range('a2:a5').value = [5,6,7,8]
- 1
但是你會發現xlwings還是會按行處理的,上面一行等同於:
sht.range('a2').value = [5,6,7,8]
- 1
正確語法:
sht.range('a2').options(transpose=True).value = [5,6,7,8]
- 1
既然預設的是按行寫入,我們就把它倒過來嘛(transpose),單詞要打對,如果你打錯單詞,它不會報錯,而會按預設的行來寫入(別問我怎麼知道的)
- 多行輸入就要用二維列表了:
sht.range('a6').expand('table').value = [['a','b','c'],['d','e','f'],['g','h','i']]
- 1
2.讀取資料
(1)讀取單個值
# 將A1的值,讀取到a變數中
a=sht.range('A1').value
- 1
- 2
(2)將值讀取到列表中
#將A1到A2的值,讀取到a列表中
a=sht.range('A1:A2').value
# 將第一行和第二行的資料按二維陣列的方式讀取
a=sht.range('A1:B2').value
- 1
- 2
- 3
- 4
- 選取一列的資料
先計算單元格的行數(前提是連續的單元格)
rng = sht.range('a1').expand('table')
nrows = rng.rows.count
- 1
- 2
接著就可以按準確範圍讀取了
a = sht.range(f'a1:a{nrows}').value
- 1
- 選取一行的資料
ncols = rng.columns.count
#用切片
fst_col = sht[0,:ncols].value
- 1
- 2
- 3
4.5 常用函式和方法
1.Book工作薄常用的api
wb=xw.books[‘工作簿名稱']
- 1
-
wb.activate() 啟用為當前工作簿
-
wb.fullname 返回工作簿的絕對路徑
-
wb.name 返回工作簿的名稱
-
wb.save(path=None) 儲存工作簿,預設路徑為工作簿原路徑,若未儲存則為指令碼所在的路徑
-
wb. close() 關閉工作簿
程式碼示例:
# 引用Excel程式中,當前的工作簿
wb=xw.books.acitve
# 返回工作簿的絕對路徑
x=wb.fullname
# 返回工作簿的名稱
x=wb.name
# 儲存工作簿,預設路徑為工作簿原路徑,若未儲存則為指令碼所在的路徑
x=wb.save(path=None)
# 關閉工作簿
x=wb.close()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
2.sheet常用的api
# 引用某指定sheet
sht=xw.books['工作簿名稱'].sheets['sheet的名稱']
# 啟用sheet為活動工作表
sht.activate()
# 清除sheet的內容和格式
sht.clear()
# 清除sheet的內容
sht.contents()
# 獲取sheet的名稱
sht.name
# 刪除sheet
sht.delete
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
3.range常用的api
# 引用當前活動工作表的單元格
rng=xw.Range('A1')
# 加入超連結
# rng.add_hyperlink(r'www.baidu.com','百度',‘提示:點選即連結到百度')
# 取得當前range的地址
rng.address
rng.get_address()
# 清除range的內容
rng.clear_contents()
# 清除格式和內容
rng.clear()
# 取得range的背景色,以元組形式返回RGB值
rng.color
# 設定range的顏色
rng.color=(255,255,255)
# 清除range的背景色
rng.color=None
# 獲得range的第一列列標
rng.column
# 返回range中單元格的資料
rng.count
# 返回current_region
rng.current_region
# 返回ctrl + 方向
rng.end('down')
# 獲取公式或者輸入公式
rng.formula='=SUM(B1:B5)'
# 陣列公式
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的第一行行標
rng.row
# 行的高度,所有行一樣高返回行高,不一樣返回None
rng.row_height
# 返回range的總高度
rng.height
# 返回range的行數和列數
rng.shape
# 返回range所在的sheet
rng.sheet
#返回range的所有行
rng.rows
# range的第一行
rng.rows[0]
# range的總行數
rng.rows.count
# 返回range的所有列
rng.columns
# 返回range的第一列
rng.columns[0]
# 返回range的列數
rng.columns.count
# 所有range的大小自適應
rng.autofit()
# 所有列寬度自適應
rng.columns.autofit()
# 所有行寬度自適應
rng.rows.autofit()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
4.books 工作簿集合的api
# 新建工作簿
xw.books.add()
# 引用當前活動工作簿
xw.books.active
- 1
- 2
- 3
- 4
4.sheets 工作表的集合
# 新建工作表
xw.sheets.add(name=None,before=None,after=None)
# 引用當前活動sheet
xw.sheets.active
- 1
- 2
- 3
- 4
4.6 資料結構
1.一維資料
python的列表,可以和Excel中的行列進行資料交換,python中的一維列表,在Excel中預設為一行資料。
import xlwings as xw
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
2.二維資料
python的二維列表,可以轉換為Excel中的行列。二維列表,即列表中的元素還是列表。在Excel中,二維列表中的列表元素,代表Excel表格中的一列。例如:
# 將a1,a2,a3輸入第一列,b1,b2,b3輸入第二列
list1=[[‘a1’,'a2','a3'],['b1','b2','b3']]
sht.range('A1').value=list1
- 1
- 2
- 3
# 將A1:B3的值賦給二維列表list1
list1=sht.range('A1:B3').value
- 1
- 2
3.Excel中區域的選取表格
# 選取第一列
rng=sht. range('A1').expand('down')
rng.value=['a1','a2','a3']
- 1
- 2
- 3
# 選取第一行
rng=sht.range('A1').expand('right')
rng=['a1','b1']
- 1
- 2
- 3
# 選取表格
rng.sht.range('A1').expand('table')
rng.value=[[‘a1’,'a2','a3'],['b1','b2','b3']]
- 1
- 2
- 3
4.7 xlwings生成圖表
生成圖表的方法
import xlwings as xw
app = xw.App()
wb = app.books.active
sht = wb.sheets.active
chart = sht.charts.add(100, 10) # 100, 10 為圖表放置的位置座標。以畫素為單位。
chart.set_source_data(sht.range('A1').expand()) # 引數為表格中的資料區域。
# chart.chart_type = i # 用來設定圖表型別,具體引數件下面詳細說明。
chart.api[1].ChartTitle.Text = i # 用來設定圖表的標題。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
示例程式碼:
import xlwings as xw
app = xw.App()
wb = app.books.active
sht = wb.sheets.active
# 生成圖表的資料
sht.range('A1').value = [['時間', '數量'], ['1日', 2], ['2日', 1], ['3日', 3]
, ['4日', 4], ['5日', 5], ['6日', 6]]
"""圖表型別引數,被註釋的那幾個,無法生成對應的圖表"""
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':