中文文檔:https://www.kancloud.cn/gnefnuy/xlwings-docs/1127454
import xlwings
#查找包路徑
print(xlwings.__path__)
#['D:\\python_mcw\\venv\\lib\\site-packages\\xlwings']
#查看版本
print(xlwings.__version__)
#0.25.1
1. 腳本: 從Python與Excel進行自動化交互
建立與工作簿的連接:
import xlwings as xw # wb = xw.Book() # 這將創建一個新的工作簿 # wb = xw.Book('mcw.xlsx') # 連接到當前工作目錄中的現有文件 wb = xw.Book(r'D:\學習筆記\第2章 用Python對 Excel讀寫數據\2.9 修改工作簿、工作表、單元格\招生表.xls')# 在Windows上:使用原始字符串來轉義反斜杠
執行之后創建工作簿
執行之后打開wps,打開表格文件
執行之后打開表格
如果您在兩個Excel實例中打開了相同的文件,則需要完全限定它並包含應用程序實例。 您將通過xw.apps.keys()
找到您的應用實例密鑰(PID):
>>> xw.apps[10559].books['FileName.xlsx']
實例化工作表對象
import xlwings as xw # wb = xw.Book() # 這將創建一個新的工作簿 wb = xw.Book('mcw.xlsx') # 連接到當前工作目錄中的現有文件 sht = wb.sheets['mcwSheet1']
執行一次,就創建一個新的工作簿,數字循環到4了。sheets里面的是已有的工作表名字。創建好的工作簿好像默認只有一個工作表
在Range內讀取/寫入值非常簡單:
寫入和讀取單個單元格的內容
打開了的,執行程序再次打開一個是只讀的,並且將第一個單元格重新賦值了,現在應該是沒有保存到磁盤的

import xlwings as xw # wb = xw.Book() # 這將創建一個新的工作簿 wb = xw.Book('mcw.xlsx') # 連接到當前工作目錄中的現有文件 sht = wb.sheets['mcw'] #獲取工作簿中的指定工作表 sht.range('A1').value = 'Foo 1' #設置單個單元格值 print(sht.range('A1').value) #讀取單個單元格的值
寫入多行多列數據(指定起始點):
從A1單元格為起始點,設置多個值。值是一個大列表,大列表里有小列表。小列表是單行所有列的數值,大列表是所有行的數值集合。小列表每個元素才是單個單元格的內容。
讀取多行多列數據:
獲取到的就是之前設置的值。兩層列表,外層包含所有行的。內層列表是單行所有列的數據。內層列表每個元素才是每個單元格的值
pandas作為數據源
功能強大的轉換器處理大多數感興趣的數據類型,包括Numpy數組和Pandas DataFrames兩個方向:
三個列表,第一個值為None

import xlwings as xw # wb = xw.Book() # 這將創建一個新的工作簿 wb = xw.Book('mcw.xlsx') # 連接到當前工作目錄中的現有文件 sht = wb.sheets['mcw'] #獲取工作簿中的指定工作表 import pandas as pd df = pd.DataFrame([[1,2], [3,4]], columns=['a', 'b']) print(df) #columns生成的是列標題,前面列表是列標題下的每行數據。每行數據好像都不是從第一列開始的,第一列 #第一列可能是數值的行序號(又或者是列表索引),從0開始。行上並不包含第一行,列標題 sht.range('A1').value = df #將這種數據作為這個單元格為起始點的值, mcw=sht.range('A1').options(pd.DataFrame, expand='table').value #獲取pd的數值 mcw2=sht.range('A1').expand().value #獲取表中的數值 print(mcw) print(mcw2)
Matplotlib數字可以在Excel中顯示為圖片:

import xlwings as xw # wb = xw.Book() # 這將創建一個新的工作簿 wb = xw.Book('mcw.xlsx') # 連接到當前工作目錄中的現有文件 sht = wb.sheets['mcw'] #獲取工作簿中的指定工作表 import matplotlib.pyplot as plt fig = plt.figure() mcw=plt.plot([1, 2, 3, 4, 5])#像是個列表 mcw2=sht.pictures.add(fig, name='MyPlot', update=True) print(mcw,type(mcw)) #2是個圖片,將plt圖片加入到 print(mcw2) #表格中
如果你設置update = True
,你可以在Excel上調整大小並定位圖:后續調用同名的pictures.add()
('MyPlot'
)會更新圖片而不改變它的位置或大小。
大小,位置和其他屬性可以在pictures.add()
中設置為參數,或者通過操作圖片 返回的對象,參見xlwings.Picture()
。
例如:

import matplotlib.pyplot as plt import xlwings as xw fig = plt.figure() plt.plot([1, 2, 3]) sht = xw.Book().sheets[0] sht.pictures.add(fig, name='MyPlot', update=True, left=sht.range('B5').left, top=sht.range('B5').top) #添加left和top參數
除以2好像是變小了

import matplotlib.pyplot as plt import xlwings as xw fig = plt.figure() plt.plot([1, 2, 3]) sht = xw.Book().sheets[0] # sht.pictures.add(fig, name='MyPlot', update=True, # left=sht.range('B5').left, top=sht.range('B5').top) ##添加left和top參數 plot = sht.pictures.add(fig, name='MyPlot', update=True) plot.height /= 2 plot.width /= 2
得到一個Matplotlib數字
以下是一些如何獲得matplotlib“figure”對象的示例:
-
通過PyPlot界面:
import matplotlib.pyplot as plt fig = plt.figure() plt.plot([1, 2, 3, 4, 5])
或:
import matplotlib.pyplot as plt plt.plot([1, 2, 3, 4, 5]) fig = plt.gcf()
-
通過面向對象的接口:
from matplotlib.figure import Figure fig = Figure(figsize=(8, 6)) ax = fig.add_subplot(111) ax.plot([1, 2, 3, 4, 5])
-
通過Pandas:
import pandas as pd import numpy as np df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd']) ax = df.plot(kind='bar') fig = ax.get_figure()

import matplotlib.pyplot as plt import xlwings as xw fig = plt.figure() plt.plot([1, 2, 3, 4, 5]) sht = xw.Book().sheets[0] # sht.pictures.add(fig, name='MyPlot', update=True, # left=sht.range('B5').left, top=sht.range('B5').top) ##添加left和top參數 plot = sht.pictures.add(fig, name='MyPlot', update=True) plot.height /= 2 plot.width /= 2
生成一個工作簿

import xlwings as xw app = xw.App(visible=True, add_book=False) app.display_alerts = False # 關閉一些提示信息,可以加快運行速度。 默認為 True。 app.screen_updating = True # 更新顯示工作表的內容。默認為 True。關閉它也可以提升運行速度。 wb = app.books.add() sht = wb.sheets.active print(sht) print(wb,app)
import xlwings as xw
app = xw.App(visible=True, add_book=False)
'''工作簿'''
# wb = app.books.add() # 新建工作簿。
# wb = app.books.open(r'mcw.xlsx') # 打開現有的工作簿
wb = app.books.active() # 獲取當前活動的工作簿#這個有問題,執行失敗
print(wb,type(wb)) #TypeError: 'Book' object is not callable
app = xw.App(visible=True, add_book=True) #添加工作簿為真就添加,否就不添加
import xlwings as xw app = xw.App(visible=True, add_book=False) #添加工作簿為真就添加,否就不添加,但是配合下面這條就可以創建工作簿 wb = app.books.add() # 新建工作簿。
import xlwings as xw wb = xw.Book('mcw.xlsx') # 連接到當前工作目錄中的現有文件,每次運行都重新打開一個 sht = wb.sheets['mcw'] # # sht = wb.sheets.active # 獲取當前活動的工作表,這個不清楚是干嘛的 # sht = wb.sheets[0] # 按索引獲取工作表 <Sheet [mcw.xlsx]mcw> # sht = wb.sheets['Sheet2'] # 按表名獲取工作表 <Sheet [mcw.xlsx]Sheet2> # sht1 = wb.sheets.add() # 新建工作表,默認新建的放在最前面。 <Sheet [mcw.xlsx]Sheet1> sht1 = wb.sheets.add('新建工作表', after=sht) # 新建工作表,放在sht工作表后面。放在了mcw工作表后面<Sheet [mcw.xlsx]新建工作表> print(sht1)
讀取單元格
-
b3 = sht.range('b3')

import xlwings as xw wb = xw.Book('mcw.xlsx') # 連接到當前工作目錄中的現有文件,每次運行都重新打開一個 sht = wb.sheets['mcw'] # b3 = sht.range('b3') print(sht,b3)
獲取指定單元格或指定單元格范圍的內容

import xlwings as xw wb = xw.Book('mcw.xlsx') # 連接到當前工作目錄中的現有文件,每次運行都重新打開一個 sht = wb.sheets['mcw'] # b3 = sht.range('b3') #獲取單元格 # 獲取 b3 中的值 v = b3.value #也可以根據行列號讀取 b3_value = sht.range(3,2).value #讀取一段區間內的值 a1_c4_value = sht.range('a1:c4').options(ndim=2).value # 加上 option 讀取二維的數據 a1_c4_value2 = sht.range((1,1),(4,3)).options(ndim=2).value # 和上面讀取的內容一樣。 print(sht,b3) print('m1',v) print('m2',b3_value) print('m3',a1_c4_value) print('m4',a1_c4_value2)
""" 寫入 就是把值賦值給讀取的單元格就可以了"""
"""設置單元格大小"""

import xlwings as xw wb = xw.Book('mcw.xlsx') # 連接到當前工作目錄中的現有文件,每次運行都重新打開一個 sht = wb.sheets['mcw'] # """設置單元格大小""" sht.autofit() # 自動調整單元格大小。注:此方法是在單元格寫入內容后,再使用,才有效。 sht.range(6,1).value='自動調整單元格大小。注:此方法是在單元格寫入內容后,再使用,才有效。' sht.range(1,4).column_width = 55 # 設置第4列 列寬。(1,4)為第1行第4列的單元格 sht.range(1,4).row_height = 55 # 設置第1行 行高
"""設置單元格 字體格式"""

import xlwings as xw wb = xw.Book('mcw.xlsx') # 連接到當前工作目錄中的現有文件,每次運行都重新打開一個 sht = wb.sheets['mcw'] # b3 = sht.range('b3') """設置單元格 字體格式""" b3.color = 255,200,255 # 設置單元格的填充顏色 b3.api.Font.ColorIndex = 3 # 設置字體的顏色,具體顏色索引見下方。 b3.api.Font.Size = 24 # 設置字體的大小。 b3.api.Font.Bold = True # 設置為粗體。 b3.api.HorizontalAlignment = -4108 # -4108 水平居中。 -4131 靠左,-4152 靠右。 b3.api.VerticalAlignment = -4130 # -4108 垂直居中(默認)。 -4160 靠上,-4107 靠下, -4130 自動換行對齊。 b3.api.NumberFormat = "0.00" # 設置單元格的數字格式。
"""設置邊框"""

"""設置邊框""" # Borders(9) 底部邊框,LineStyle = 1 直線。 b3.api.Borders(9).LineStyle = 1 b3.api.Borders(9).Weight = 3 # 設置邊框粗細。 # Borders(7) 左邊框,LineStyle = 2 虛線。 b3.api.Borders(7).LineStyle = 2 b3.api.Borders(7).Weight = 3 # Borders(8) 頂部框,LineStyle = 5 雙點划線。 b3.api.Borders(8).LineStyle = 5 b3.api.Borders(8).Weight = 3 # Borders(10) 右邊框,LineStyle = 4 點划線。 b3.api.Borders(10).LineStyle = 4 b3.api.Borders(10).Weight = 3 # Borders(5) 單元格內從左上角 到 右下角。 b3.api.Borders(5).LineStyle = 1 b3.api.Borders(5).Weight = 3 # Borders(6) 單元格內從左下角 到 右上角。 b3.api.Borders(6).LineStyle = 匯總1 b3.api.Borders(6).Weight = 3 """如果是一個區域的單元格,內部邊框設置如下""" # # Borders(11) 內部垂直邊線。 # b3.api.Borders(11).LineStyle = 1 # b3.api.Borders(11).Weight = 3 # # # Borders(12) 內部水平邊線。 # b3.api.Borders(12).LineStyle = 1 # b3.api.Borders(12).Weight = 3 ———————————————— 版權聲明:本文為CSDN博主「葆寧seismologist」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/weixin_42305163/article/details/113326060
"""如果是一個區域的單元格,內部邊框設置如下"""

import xlwings as xw wb = xw.Book('mcw.xlsx') # 連接到當前工作目錄中的現有文件,每次運行都重新打開一個 sht = wb.sheets['mcw'] # a1 = sht.range('a1') b2 = sht.range('b2') a3 = sht.range('a3:b4') b5 = sht.range('b3:c5') """設置邊框""" # Borders(5) 單元格內從左上角 到 右下角。 a1.api.Borders(5).LineStyle = 1 a1.api.Borders(5).Weight = 3 # Borders(6) 單元格內從左下角 到 右上角。 b2.api.Borders(6).LineStyle = 1 b2.api.Borders(6).Weight = 3 """如果是一個區域的單元格,內部邊框設置如下""" # Borders(11) 內部垂直邊線。 a3.api.Borders(11).LineStyle = 1 a3.api.Borders(11).Weight = 3 # Borders(12) 內部水平邊線。 b5.api.Borders(12).LineStyle = 1 b5.api.Borders(12).Weight = 3 #
"""合並拆分單元格""" 失敗的,沒成功
import xlwings as xw wb = xw.Book('mcw.xlsx') # 連接到當前工作目錄中的現有文件,每次運行都重新打開一個 sht = wb.sheets['mcw'] # """合並拆分單元格""" # print(sht.range('a1:c1').value) sht.range('C1:C5').api.merge() # 合並單元格a1:c1 # sht.range('a2:c3').api.merge() # 合並單元格 a2:c3 # sht.range('a4:c4').api.merge() # 合並單元格 a4:c4 # # sht.range('A4:C4').api.unmerge() # 拆分單元格。
插入,刪除一行

import xlwings as xw wb = xw.Book('mcw.xlsx') # 連接到當前工作目錄中的現有文件,每次運行都重新打開一個 sht = wb.sheets['mcw'] # '''插入 、刪除 一行''' sht.range('a3').api.EntireRow.Delete() # 會刪除 ’a3‘ 單元格所在的行。 # sht.api.Rows(3).Insert() # 會在第3行插入一行,原來的第3行下移。

import xlwings as xw wb = xw.Book('mcw.xlsx') # 連接到當前工作目錄中的現有文件,每次運行都重新打開一個 sht = wb.sheets['mcw'] # '''插入 、刪除 一行''' # sht.range('a3').api.EntireRow.Delete() # 會刪除 ’a3‘ 單元格所在的行。 sht.api.Rows(3).Insert() # 會在第3行插入一行,原來的第3行下移。
插入,刪除一列

import xlwings as xw wb = xw.Book('mcw.xlsx') # 連接到當前工作目錄中的現有文件,每次運行都重新打開一個 sht = wb.sheets['mcw'] # '''插入 、刪除 一列''' sht.range('b2').api.EntireColumn.Delete() # 會刪除 ’b2‘ 單元格所在的列。 # sht.api.Columns(3).Insert() # 會在第3列插入一列,原來的第3列右移。(也可以用列的字母表示)

import xlwings as xw wb = xw.Book('mcw.xlsx') # 連接到當前工作目錄中的現有文件,每次運行都重新打開一個 sht = wb.sheets['mcw'] # '''插入 、刪除 一列''' # sht.range('b2').api.EntireColumn.Delete() # 會刪除 ’b2‘ 單元格所在的列。 sht.api.Columns(3).Insert() # 會在第3列插入一列,原來的第3列右移。(也可以用列的字母表示)
'''選擇sheet頁面最右下角的單元格,獲取最大行數,和列數'''

import xlwings as xw wb = xw.Book('mcw.xlsx') # 連接到當前工作目錄中的現有文件,每次運行都重新打開一個 sht = wb.sheets['mcw'] # '''選擇sheet頁面最右下角的單元格,獲取最大行數,和列數''' # 區別 expand(), expand()只選中與之連續的單元格。 cell = sht.used_range.last_cell rows = cell.row columns = cell.column print(rows,columns)
默認統計額外的,不連續的單元格

import xlwings as xw wb = xw.Book('mcw.xlsx') # 連接到當前工作目錄中的現有文件,每次運行都重新打開一個 sht = wb.sheets['mcw'] # '''選擇sheet頁面最右下角的單元格,獲取最大行數,和列數''' # 區別 expand(), expand()只選中與之連續的單元格。 cell = sht.used_range.last_cell rows = cell.row columns = cell.column print(rows,columns)
統計連續的行數
'''排序,刪除重復值'''#這個不管用
排序前:

import xlwings as xw wb = xw.Book('mcw.xlsx') # 連接到當前工作目錄中的現有文件,每次運行都重新打開一個 sht = wb.sheets['mcw'] # '''排序,刪除重復值''' # 排序使用方法: # 1、選擇需要排序的區域。這里用 'a2' 是因為排序的數據送從第二行開始的,第一行是標題,不應該參與排序。 # 2、選擇按那一列進行排序 Key1=sht.range('c2').api, 這里選擇的是按 第 C 列排序,所以這里選擇 c1 和 c2 都可以。 # 3、Order1=1 為升序,2為降序。 # sht.range('a2',(rows,columns)).api.Sort(Key1=sht.range('c2').api, Order1=1) # sht.range('a2',(5,4)).api.Sort(Key1=sht.range('c2').api, Order1=1) # 刪除重復值使用方法: sht.RemoveDuplicates(3) #為按第3列內容進行刪除重復項。
"""插入、讀取公式"""

import xlwings as xw wb = xw.Book('mcw.xlsx') # 連接到當前工作目錄中的現有文件,每次運行都重新打開一個 sht = wb.sheets['mcw'] # """插入、讀取公式""" sht.range('e7').formula = '=AVERAGE(E2:E6)' # 插入公式 print(sht.range('e7').formula)
插入公式,就會計算
生成公式,然后復制到程序里面試試
結果是可以的。插入函數的公式,應該大部分都可以復制進來直接使用的
'''同個表格復制、粘貼'''

import xlwings as xw wb = xw.Book('mcw.xlsx') # 連接到當前工作目錄中的現有文件,每次運行都重新打開一個 sht = wb.sheets['mcw'] # '''同個表格復制、粘貼''' # 復制 a2 到 a6 之間單元格的值,粘貼到'a9'中 sht.range('a2','a6').api.Copy(sht.range('a9').api)

import xlwings as xw wb = xw.Book('mcw.xlsx') # 連接到當前工作目錄中的現有文件,每次運行都重新打開一個 sht = wb.sheets['mcw'] # '''同個表格復制、粘貼''' # 復制 a2 到 a6 之間單元格的值,粘貼到'a9'中 sht.range('a2','a6').api.Copy(sht.range('a9').api)
'''跨表格復制、粘貼'''

import xlwings as xw wb1 = xw.Book('mcw.xlsx') # 連接到當前工作目錄中的現有文件,每次運行都重新打開一個 sht1 = wb1.sheets['mcw'] # wb2 = xw.Book('mcw2.xlsx') # 連接到當前工作目錄中的現有文件,每次運行都重新打開一個 sht2 = wb2.sheets['Sheet1'] # '''跨表格復制、粘貼''' my_values = sht1.range('a2:d4').options(ndim=2).value # 讀取二維的數據 print(my_values) sht2.range('a1').value = my_values #打開第一個工作簿,再打開第二個工作簿,隨后第二個 #工作簿上復制了1的a2到_d4的數據,粘貼在了2的a1單元格為起始點的位置
保存工作簿
wb.save()
#wb.close()
#app.quit
無法導入模塊錯誤,直接把檢查注釋掉
module "matploblib" not have attribute "get_data_path"
是
參考鏈接:https://blog.csdn.net/weixin_42305163/article/details/113326060