xlwings模塊詳解


 

中文文檔: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) #讀取單個單元格的值
View Code

 

 

寫入多行多列數據(指定起始點): 

從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)

讀取單元格

  1. 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行 行高
View Code

 """設置單元格 字體格式"""

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

 

  1. wb.save()
  2.  
    #wb.close()
  3.  
    #app.quit


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM