1. 程式人生 > 實用技巧 >Python辦公自動化之Excel做表自動化:全網最全,看這一篇就夠了!

Python辦公自動化之Excel做表自動化:全網最全,看這一篇就夠了!

文章目錄

很多人學習python,不知道從何學起。
很多人學習python,掌握了基本語法過後,不知道在哪裡尋找案例上手。
很多已經做案例的人,卻不知道如何去學習更加高深的知識。
那麼針對這三類人,我給大家提供一個好的學習平臺,免費領取視訊教程,電子書籍,以及課程的原始碼!
QQ群:101677771

修訂歷史

更新日期版本號備註修改者
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 使用介紹

  1. 常用單元格的資料型別
  • empty(空的)
  • string(text)
  • number
  • date
  • boolean
  • error
  • blank(空白表格)
  1. 匯入模組
import xlrd
  • 1
  1. 開啟Excel檔案讀取資料
data = xlrd.open_workbook(filename)#檔名以及路徑,如果路徑或者檔名有中文給前面加一個 r
  • 1
  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://www.xlwings.org/

官方文件: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': 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座標。
  yy = y + n//3*h   # 用來生成圖表放置的y座標。
  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()
  • 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
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99

效果如下:

4.8 實戰訓練

1. xlwings 新建 Excel 文件

程式示例:

# 3.4.2 xlwings 新建 Excle 文件
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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

執行程式後文件夾增加了“example.xlsx”:

此時表格是空的:

2. xlwings 開啟已存在的 Excel 文件

現有表格長這樣:

執行程式:

# 3.4.3 xlwings 開啟已存在的Excel檔案
def fun3_4_3():
    # 新建Excle 預設設定:程式可見,只打開不新建工作薄,螢幕更新關閉
    app = xw.App(visible=True, add_book=False)
    app.display_alerts = False
    app.screen_updating = False

    # 開啟已存在的Excel檔案
    wb=app.books.open('./3_4 xlwings 修改操作練習.xlsx')

    # 儲存工作簿
    wb.save('example_2.xlsx')

    # 退出工作簿
    wb.close()

    # 退出Excel
    app.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

生成新的表格:

內容如下:

3. xlwings 讀寫 Excel

程式示例:

#  3.4.4 xlwings讀寫 Excel
def fun3_4_4():
    # 新建Excle 預設設定:程式可見,只打開不新建工作薄,螢幕更新關閉
    app = xw.App(visible=True, add_book=False)
    app.display_alerts = False
    app.screen_updating = False

    # 開啟已存在的Excel檔案
    wb=app.books.open('./3_4 xlwings 修改操作練習.xlsx')

    # 獲取sheet物件
    print(wb.sheets)
    sheet = wb.sheets[0]
    # sheet = wb.sheets["sheet1"]

    # 讀取Excel資訊
    cellB1_value = sheet.range('B1').value
    print("單元格B1內容為:",cellB1_value)

    # 清除單元格內容和格式
    sheet.range('A1').clear()

    # 寫入單元格
    sheet.range('A1').value = "xlwings寫入"

    # 儲存工作簿
    wb.save('example_3.xlsx')

    # 退出工作簿
    wb.close()

    # 退出Excel
    app.quit()
  • 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

執行效果:

4.9 更多請參考

xlwings官方文件

插上翅膀,讓Excel飛起來——xlwings(一)

插上翅膀,讓Excel飛起來——xlwings(二)

插上翅膀,讓Excel飛起來——xlwings(三)

插上翅膀,讓Excel飛起來——xlwings(四)

Python與Excel互動——Xlwings

5 Python openpyxl 讀取 寫入 修改 操作Excel

在openpyxl中,主要用到三個概念:Workbooks,Sheets,Cells。

  • Workbook就是一個excel工作表;

  • Sheet是工作表中的一張表頁;

  • Cell就是簡單的一個格。

openpyxl就是圍繞著這三個概念進行的,不管讀寫都是“三板斧”:開啟Workbook,定位Sheet,操作Cell。

官方文件:https://openpyxl.readthedocs.io/en/stable/

官方示例:

from openpyxl import Workbook
wb = Workbook()

# grab the active worksheet
ws = wb.active

# Data can be assigned directly to cells
ws['A1'] = 42

# Rows can also be appended
ws.append([1, 2, 3])

# Python types will automatically be converted
import datetime
ws['A2'] = datetime.datetime.now()

# Save the file
wb.save("sample.xlsx")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

5.1 openpyxl 基本操作

1.安裝

pip install openpyxl
  • 1

因為我已經安裝,所以提示如下資訊:

2.開啟檔案

(1)新建

from  openpyxl import  Workbook 
# 例項化
wb = Workbook()
# 啟用 worksheet
ws = wb.active
  • 1
  • 2
  • 3
  • 4
  • 5

(2)開啟已有

from openpyxl  import load_workbook

wb = load_workbook('檔名稱.xlsx')
  • 1
  • 2
  • 3

3.寫入資料

# 方式一:資料可以直接分配到單元格中(可以輸入公式)
ws['A1'] = 42
# 方式二:可以附加行,從第一列開始附加(從最下方空白處,最左開始)(可以輸入多行)
ws.append([1, 2, 3])
# 方式三:Python 型別會被自動轉換
ws['A3'] = datetime.datetime.now().strftime("%Y-%m-%d")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4.建立表(sheet)

# 方式一:插入到最後(default)
ws1 = wb.create_sheet("Mysheet") 
# 方式二:插入到最開始的位置
ws2 = wb.create_sheet("Mysheet", 0)
  • 1
  • 2
  • 3
  • 4

5.選擇表(sheet)

# sheet 名稱可以作為 key 進行索引
>>> ws3 = wb["New Title"]
>>> ws4 = wb.get_sheet_by_name("New Title")
>>> ws is ws3 is ws4
True
  • 1
  • 2
  • 3
  • 4
  • 5

6.查看錶名(sheet)

# 顯示所有表名
>>> print(wb.sheetnames)
['Sheet2', 'New Title',  'Sheet1']
# 遍歷所有表
>>> for sheet in  wb:
...     print(sheet.title)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

7.訪問單元格(cell)

(1)單個單元格訪問

# 方法一
>>> c = ws['A4']
# 方法二:row 行;column 列
>>> d = ws.cell(row=4, column=2, value=10)
# 方法三:只要訪問就建立
>>> for i in  range(1,101):
...         for j in range(1,101):
...            ws.cell(row=i, column=j)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

(2)多個單元格訪問

# 通過切片
>>> 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>))
  • 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

8.儲存資料

wb.save('檔名稱.xlsx')
  • 1

9.其它

(1)改變sheet標籤按鈕顏色

ws.sheet_properties.tabColor = "1072BA" # 色值為RGB16進位制值
  • 1

(2)獲取最大行,最大列

# 獲得最大列和最大行
print(sheet.max_row)
print(sheet.max_column)
  • 1
  • 2
  • 3

(3)獲取每一行每一列

  • sheet.rows為生成器, 裡面是每一行的資料,每一行又由一個tuple包裹。
  • sheet.columns類似,不過裡面是每個tuple是每一列的單元格。
# 因為按行,所以返回A1, B1, C1這樣的順序
for row in sheet.rows:
    for cell in row:
        print(cell.value)

# A1, A2, A3這樣的順序
for column in sheet.columns:
    for cell in column:
        print(cell.value)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

(4)根據數字得到字母,根據字母得到數字

from openpyxl.utils import get_column_letter, column_index_from_string

# 根據列的數字返回字母
print(get_column_letter(2))  # B
# 根據字母返回列的數字
print(column_index_from_string('D'))  # 4
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

(5)刪除工作表

# 方式一
wb.remove(sheet)
# 方式二
del wb[sheet]
  • 1
  • 2
  • 3
  • 4

(6)矩陣置換

rows = [
    ['Number', 'data1', 'data2'],
    [2, 40, 30],
    [3, 40, 25],
    [4, 50, 30],
    [5, 30, 10],
    [6, 25, 5],
    [7, 50, 10]]

list(zip(*rows))

# out
[('Number', 2, 3, 4, 5, 6, 7),
 ('data1', 40, 40, 50, 30, 25, 50),
 ('data2', 30, 25, 30, 10, 5, 10)]

# 注意 方法會捨棄缺少資料的列(行)
rows = [
    ['Number', 'data1', 'data2'],
    [2, 40      ],    # 這裡少一個數據
    [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)]
  • 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

10.設定單元格風格

(1)需要匯入的類

from openpyxl.styles import Font, colors, Alignment
  • 1

(2)字型

  • 下面的程式碼指定了等線24號加粗斜體,字型顏色紅色。直接使用cell的font屬性,將Font物件賦值給它。
bold_itatic_24_font = Font(name='等線', size=24, italic=True, color=colors.RED, bold=True)

sheet['A1'].font = bold_itatic_24_font
  • 1
  • 2
  • 3

(3)對齊方式

  • 也是直接使用cell的屬性aligment,這裡指定垂直居中和水平居中。除了center,還可以使用right、left等等引數
# 設定B1中的資料垂直居中和水平居中
sheet['B1'].alignment = Alignment(horizontal='center', vertical='center')
  • 1
  • 2

(4)設定行高和列寬

# 第2行行高
sheet.row_dimensions[2].height = 40
# C列列寬
sheet.column_dimensions['C'].width = 30
  • 1
  • 2
  • 3
  • 4

(5)合併和拆分單元格

  • 所謂合併單元格,即以合併區域的左上角的那個單元格為基準,覆蓋其他單元格使之稱為一個大的單元格。
  • 相反,拆分單元格後將這個大單元格的值返回到原來的左上角位置。
# 合併單元格, 往左上角寫入資料即可
sheet.merge_cells('B1:G1') # 合併一行中的幾個單元格
sheet.merge_cells('A1:C3') # 合併一個矩形區域中的單元格
  • 1
  • 2
  • 3
  • 合併後只可以往左上角寫入資料,也就是區間中:左邊的座標。
  • 如果這些要合併的單元格都有資料,只會保留左上角的資料,其他則丟棄。換句話說若合併前不是在左上角寫入資料,合併後單元格中不會有資料。
  • 以下是拆分單元格的程式碼。拆分後,值回到A1位置
sheet.unmerge_cells('A1:C3')
  • 1

11.示例程式碼

import datetime
from random import choice
from time import time
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter

# 設定檔案 mingc
addr = "openpyxl.xlsx"
# 開啟檔案
wb = load_workbook(addr)
# 建立一張新表
ws = wb.create_sheet()
# 第一行輸入
ws.append(['TIME', 'TITLE', 'A-Z'])

# 輸入內容(500行資料)
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
# 把上面寫入內容列印在控制檯
for j in ws.rows:    # we.rows 獲取每一行資料
    for n in j:
        print(n.value, end="\t")   # n.value 獲取單元格的值
    print()
# 儲存,save(必須要寫檔名(絕對地址)預設 py 同級目錄下,只支援 xlsx 格式)
wb.save(addr)
  • 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

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")
  • 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

效果如下:

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")
  • 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

效果如下:

5.4 實戰訓練

1.openpyxl 新建Excel

程式示例:

# 3.5.2 openpyxl 新建Excel
def fun3_5_2():
    wb = Workbook()

    # 注意:該函式呼叫工作表的索引(_active_sheet_index),預設是0。
    # 除非你修改了這個值,否則你使用該函式一直是在對第一張工作表進行操作。
    ws = wb.active

    # 設定sheet名稱
    ws.title = "New Title"

    # 設定sheet顏色
    ws.sheet_properties.tabColor = "1072BA"

    # 儲存表格
    wb.save('儲存一個新的excel.xlsx')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

執行效果:

並對sheet設定了標題和背景顏色:

2.openpyxl 開啟已存在Excel

程式示例:

# 3.5.3 openpyxl 開啟已存在Excel
def fun3_5_3():
    wb = load_workbook("./3_5 openpyxl 修改操作練習.xlsx")

    # 注意:該函式呼叫工作表的索引(_active_sheet_index),預設是0。
    # 除非你修改了這個值,否則你使用該函式一直是在對第一張工作表進行操作。
    ws = wb.active

    # 儲存表格
    wb.save('copy.xlsx')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

效果如下:

3.openpyxl 讀寫Excel

程式示例:

# 3.5.4 openpyxl 讀寫Excel
def fun3_5_4():
    wb = load_workbook("./3_5 openpyxl 修改操作練習.xlsx")

    # 注意:該函式呼叫工作表的索引(_active_sheet_index),預設是0。
    # 除非你修改了這個值,否則你使用該函式一直是在對第一張工作表進行操作。
    ws = wb.active

    # 讀取單元格資訊
    cellB2_value = ws['B2'].value
    print("單元格B2內容為:",cellB2_value)

    # 寫入單元格
    ws['A1'].value = "OPENPYXL"

    # 儲存表格
    wb.save('copy.xlsx')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

執行結果:

6 Python xlswriter 寫入 操作Excel

  • XlsxWriter是一個用來寫Excel2007和xlsx檔案格式的python模組。它可以用來寫文字、數字、公式並支援單元格格式化、圖片、圖表、文件配置、自動過濾等特性
  • 優點:功能更多、文件高保真、擴充套件格式型別、更快並可配置 缺點:不能用來讀取和修改excel檔案

官方文件:https://xlsxwriter.readthedocs.io/

6.1 xlswriter基本操作

1.安裝 xlswriter 模組

pip install XlsxWriter
  • 1

由於我已經安裝過了,所以提示已經安裝:

2.建立excel檔案

# 建立檔案
workbook = xlsxwriter.Workbook("new_excel.xlsx") 
  • 1
  • 2

3.建立sheet

# 建立sheet
worksheet = workbook.add_worksheet("first_sheet") 
  • 1
  • 2

4.寫入資料

(1)寫入文字

# 法一:
worksheet.write('A1', 'write something')
# 法二:
worksheet.write(1, 0, 'hello world')
  • 1
  • 2
  • 3
  • 4

(2)寫入數字

# 寫入數字
worksheet.write(0, 1, 32)
worksheet.write(1, 1, 32.3)
  • 1
  • 2
  • 3

(3)寫入函式

worksheet.write(2, 1, '=sum(B1:B2)')
  • 1

(4)寫入圖片

# 插入圖片
worksheet.insert_image(0, 5, 'test.png')
worksheet.insert_image(0, 5, 'test.png', {'url': 'http://httpbin.org/'})
  • 1
  • 2
  • 3

(5)寫入日期

# 寫入日期
d = workbook.add_format({'num_format': 'yyyy-mm-dd'})
worksheet.write(0, 2, datetime.datetime.strptime('2017-09-13', '%Y-%m-%d'), d)
  • 1
  • 2
  • 3

(6)設定行、列屬性

# 設定行屬性,行高設定為40
worksheet.set_row(0, 40)

# 設定列屬性,把A到B列寬設定為20
worksheet.set_column('A:B', 20)
  • 1
  • 2
  • 3
  • 4
  • 5

5.自定義格式

常用格式:

  • 字型顏色:color
  • 字型加粗:bold
  • 字型大小:font_site
  • 日期格式:num_format
  • 超連結:url
  • 下劃線設定:underline
  • 單元格顏色:bg_color
  • 邊框:border
  • 對齊方式:align
# 自定義格式
f = workbook.add_format({'border': 1, 'font_size': 13, 'bold': True, 'align': 'center','bg_color': 'cccccc'})
worksheet.write('A3', "python excel", f)
worksheet.set_row(0, 40, f)
worksheet.set_column('A:E', 20, f)
  • 1
  • 2
  • 3
  • 4
  • 5

6.批量往單元格寫入資料

# 批量往單元格寫入資料
worksheet.write_column('A15', [1, 2, 3, 4, 5])  # 列寫入,從A15開始
worksheet.write_row('A12', [6, 7, 8, 9])        # 行寫入,從A12開始
  • 1
  • 2
  • 3

7.合併單元格寫入

# 合併單元格寫入
worksheet.merge_range(7,5, 11, 8, 'merge_range')
  • 1
  • 2

8.關閉檔案

workbook.close()
  • 1

6.3 xlswriter 生成折線圖

示例程式碼:

# -*- coding:utf-8 -*-

import xlsxwriter

# 建立一個excel
workbook = xlsxwriter.Workbook("chart_line.xlsx")
# 建立一個sheet
worksheet = workbook.add_worksheet()
# worksheet = workbook.add_worksheet("bug_analysis")

# 自定義樣式,加粗
bold = workbook.add_format({'bold': 1})

# --------1、準備資料並寫入excel---------------
# 向excel中寫入資料,建立圖示時要用到
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)

# 寫入資料
worksheet.write_column('A2', data[0])
worksheet.write_column('B2', data[1])
worksheet.write_column('C2', data[2])

# --------2、生成圖表並插入到excel---------------
# 建立一個柱狀圖(line chart)
chart_col = workbook.add_chart({'type': 'line'})

# 配置第一個系列資料
chart_col.add_series({
    # 這裡的sheet1是預設的值,因為我們在新建sheet時沒有指定sheet名
    # 如果我們新建sheet時設定了sheet名,這裡就要設定成相應的值
    'name': '=Sheet1!$B$1',
    'categories': '=Sheet1!$A$2:$A$7',
    'values':   '=Sheet1!$B$2:$B$7',
    'line': {'color': 'red'},
})

# 配置第二個系列資料
chart_col.add_series({
    'name': '=Sheet1!$C$1',
    'categories':  '=Sheet1!$A$2:$A$7',
    'values':   '=Sheet1!$C$2:$C$7',
    'line': {'color': 'yellow'},
})

# 配置第二個系列資料(用了另一種語法)
# chart_col.add_series({
#     'name': ['Sheet1', 0, 2],
#     'categories': ['Sheet1', 1, 0, 6, 0],
#     'values': ['Sheet1', 1, 2, 6, 2],
#     'line': {'color': 'yellow'},
# })

# 設定圖表的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)'})

# 設定圖表的風格
chart_col.set_style(1)

# 把圖表插入到worksheet並設定偏移
worksheet.insert_chart('A10', chart_col, {'x_offset': 25, 'y_offset': 10})

workbook.close()
  • 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
  • 72

效果如下:

6.4 xlswriter 生成柱狀圖

示例程式碼:

# -*- coding:utf-8 -*-

import xlsxwriter

# 建立一個excel
workbook = xlsxwriter.Workbook("chart_column.xlsx")
# 建立一個sheet
worksheet = workbook.add_worksheet()
# worksheet = workbook.add_worksheet("bug_analysis")

# 自定義樣式,加粗
bold = workbook.add_format({'bold': 1})

# --------1、準備資料並寫入excel---------------
# 向excel中寫入資料,建立圖示時要用到
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)

# 寫入資料
worksheet.write_column('A2', data[0])
worksheet.write_column('B2', data[1])
worksheet.write_column('C2', data[2])

# --------2、生成圖表並插入到excel---------------
# 建立一個柱狀圖(column chart)
chart_col = workbook.add_chart({'type': 'column'})

# 配置第一個系列資料
chart_col.add_series({
    # 這裡的sheet1是預設的值,因為我們在新建sheet時沒有指定sheet名
    # 如果我們新建sheet時設定了sheet名,這裡就要設定成相應的值
    'name': '=Sheet1!$B$1',
    'categories': '=Sheet1!$A$2:$A$7',
    'values':   '=Sheet1!$B$2:$B$7',
    'line': {'color': 'red'},
})

# 配置第二個系列資料(用了另一種語法)
chart_col.add_series({
    'name': '=Sheet1!$C$1',
    'categories':  '=Sheet1!$A$2:$A$7',
    'values':   '=Sheet1!$C$2:$C$7',
    'line': {'color': 'yellow'},
})

# 配置第二個系列資料(用了另一種語法)
# chart_col.add_series({
#     'name': ['Sheet1', 0, 2],
#     'categories': ['Sheet1', 1, 0, 6, 0],
#     'values': ['Sheet1', 1, 2, 6, 2],
#     'line': {'color': 'yellow'},
# })

# 設定圖表的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)'})

# 設定圖表的風格
chart_col.set_style(1)

# 把圖表插入到worksheet以及偏移
worksheet.insert_chart('A10', chart_col, {'x_offset': 25, 'y_offset': 10})

workbook.close()
  • 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
  • 72

效果如下:

6.5 xlswriter 生成餅圖

示例程式碼:

# -*- coding:utf-8 -*-

import xlsxwriter

# 建立一個excel
workbook = xlsxwriter.Workbook("chart_pie.xlsx")
# 建立一個sheet
worksheet = workbook.add_worksheet()

# 自定義樣式,加粗
bold = workbook.add_format({'bold': 1})

# --------1、準備資料並寫入excel---------------
# 向excel中寫入資料,建立圖示時要用到
data = [
    ['closed', 'active', 'reopen', 'NT'],
    [1012, 109, 123, 131],
]

# 寫入資料
worksheet.write_row('A1', data[0], bold)
worksheet.write_row('A2', data[1])

# --------2、生成圖表並插入到excel---------------
# 建立一個柱狀圖(pie chart)
chart_col = workbook.add_chart({'type': 'pie'})

# 配置第一個系列資料
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'}},
    ],

})

# 設定圖表的title 和 x,y軸資訊
chart_col.set_title({'name': 'Bug Analysis'})

# 設定圖表的風格
chart_col.set_style(10)

# 把圖表插入到worksheet以及偏移
worksheet.insert_chart('B10', chart_col, {'x_offset': 25, 'y_offset': 10})
workbook.close()
  • 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

效果如下:

6.6 實戰訓練

1.xlswriter新建並寫入Excel

程式示例:

# 3.6.2 xlswriter新建並寫入Excel
def fun3_6_2():
    # 建立Exce並新增sheet
    workbook = xlsxwriter.Workbook('demo.xlsx')
    worksheet = workbook.add_worksheet()

    # 設定列寬
    worksheet.set_column('A:A', 20)

    # 設定格式
    bold = workbook.add_format({'bold': True})

    # 新增文字內容
    worksheet.write('A1', 'Hello')

    # 按格式新增內容
    worksheet.write('A2', 'World', bold)

    # 寫一些數字
    worksheet.write(2, 0, 123)
    worksheet.write(3, 0, 123.456)

    # 新增圖片
    worksheet.insert_image('B5', 'demo.png')

    workbook.close()
  • 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

效果如下:

7 Python win32com 讀取 寫入 修改 操作Excel

python可以使用一個第三方庫叫做win32com達到操作com的目的,win32com功能強大,可以操作word、呼叫巨集等等等。

7.1 pip安裝win32com

pip install pypiwin32
  • 1

由於我已經安裝過了,所以提示已經安裝:

7.2 Python使用win32com讀寫Excel

程式示例:

import win32com
from win32com.client import Dispatch, constants
import os

# 獲取當前指令碼路徑
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

    # 建立新的Excel
    # WorkBook = app.Workbooks.Add()
    # 新建sheet
    # sheet = WorkBook.Worksheets.Add()

    # 開啟已存在表格,注意這裡要用絕對路徑
    WorkBook = app.Workbooks.Open(getScriptPath() + "\\3_7 win32com 修改操作練習.xlsx")
    sheet = WorkBook.Worksheets('Sheet1')

    # 獲取單元格資訊 第n行n列,不用-1
    cell01_value = sheet.Cells(1,2).Value
    print("cell01的內容為:",cell01_value)

    # 寫入表格資訊
    sheet.Cells(2, 1).Value = "win32com"

    # 儲存表格
    #WorkBook.Save()

    # 另存為實現拷貝
    WorkBook.SaveAs(getScriptPath() + "\\new.xlsx")

    # 關閉表格
    WorkBook.Close()
    app.Quit()


if __name__ == '__main__':
    fun3_7_2()
  • 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

效果如下:

內容為:

8 Python pandas 讀取 寫入 操作Excel

簡介:

pandas 是基於NumPy的一種工具,該工具是為了解決資料分析任務而建立的。Pandas 納入了大量庫和一些標準的資料模型,提供了高效地操作大型資料集所需的工具。pandas提供了大量能使我們快速便捷地處理資料的函式和方法。你很快就會發現,它是使Python成為強大而高效的資料分析環境的重要因素之一。

官方網站:https://pandas.pydata.org/

中文網站:https://www.pypandas.cn/

官方文件:https://pandas.pydata.org/pandas-docs/stable/

8.1 pip安裝pandas

pip install pandas
  • 1

8.2 pandas 讀寫 Excel

表格內容如下:

程式示例:

import pandas as pd
from pandas import DataFrame

# 3.8.2 pandas讀寫Excel
def fun3_8_2():
    data = pd.read_excel('3_8 pandas 修改操作練習.xlsx', sheet_name='Sheet1')
    print(data)

    # 增加行資料,在第5行新增
    data.loc[4] = ['4', 'john', 'pandas']

    # 增加列資料,給定預設值None
    data['new_col'] = None

    # 儲存資料
    DataFrame(data).to_excel('new.xlsx', sheet_name='Sheet1', index=False, header=True)


if __name__ == '__main__':
    fun3_8_2()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

效果如下:

生成的excel如下: