【Python】處理Excel的庫Xlwings


# # 引入庫
import xlwings as xw
import time

# 打開Excel程序,默認設置:程序可見,只打開不新建工作薄
# app = xw.App(visible=True,add_book=False)
#新建工作簿 (如果不接下一條代碼的話,Excel只會一閃而過,賣個萌就走了)
# wb = app.books.add()

# 打開已有工作簿(支持絕對路徑和相對路徑)
# wb = app.books.open('example.xlsx')
練習的時候建議直接用下面這條,這樣的話就不會頻繁打開新的Excel
wb = xw.Book('example.xlsx')

print('-----新建sheet-----')
wb.sheets.add('jenny')

# 引用Excel工作表,單元格
print('-----引用-----')
# 引用工作表
sht = wb.sheets[0]
#sht = wb.sheets[第一個sheet名]

# 引用單元格
rng = sht.range('a1')
# #rng = sht['a1']
# #rng = sht[0,0] 第一行的第一列即a1,相當於pandas的切片
print ("引用單元格: "+str(rng.value))
#
# # 引用區域
rng = sht.range('a1:a5')
#rng = sht['a1:a5']
#rng = sht[:5,0]
print ("引用區域: "+str(rng.value))

# 重頭戲:寫入數據
# (xlwings多個單元格的寫入大多是以表格形式)
print('-----寫入-----')
# 選擇起始單元格A1,寫入字符串‘Hello’
print('-----寫入單元格-----')
sht.range('a1').value = 'Hello'
time.sleep(3)
# 默認按行插入:A1:D1分別寫入1,2,3,4
print('-----按行寫入-----')
sht.range('a1').value = [1,2,3,4]
time.sleep(3)

# 等同於
# sht.range('a1:d1').value = [1,2,3,4]

# 按列插入: A2:A5分別寫入5,6,7,8
# 你可能會想
sht.range('a2:a5').value = [5,6,7,8]

# 但是你會發現xlwings還是會按行處理的,上面一行等同於
# sht.range('a2').value = [5,6,7,8]

# 正確語法:
print('-----按列寫入-----')
sht.range('a2').options(transpose=True).value = [5,6,7,8]
# 既然默認的是按行寫入,我們就把它倒過來嘛(transpose),單詞要打對,如果你打錯單詞,它不會報錯,而會按默認的行來寫入(別問我怎么知道的)

# 我們輸入信息的時候往往不只是寫入一行或一列,
# 多行輸入就要用二維列表了:
sht.range('a6').expand('table').value = [['a','b','c'],['d','e','f'],['g','h','i']]

#B2到E5單元格全部賦同樣的值
sht.range("B2","E5").value="bb"

# 說完了寫入就該講讀取了,記住了寫入,讀取就簡單了
# 讀取A1:D4(直接填入單元格范圍就行了)
print('-----讀取單元格內容-----')
print("讀取A1:D4: "+str(sht.range('a1:d4').value))

# 返回的值是列表形式,多行多列為二維列表,但有一點要注意,返回的數值默認是浮點數
a = sht.range('a1:d1').value
print("讀取A1:D1: "+str(a))
for i in a:
    print("讀取單元格: "+str(i))
    print("單元格數據類型: "+str(type(i)))

# 讀取excel的第一列怎么做?
a = sht.range('a:a').value
print (a)
print(len(a))
# 你將會得到一個1048576個元素的列表,也就是空值也包含進去了,所以這種方法不行

# 思路:先計算單元格的行數(前提是連續的單元格)
rng = sht.range('a1').expand('table')
nrows = rng.rows.count

# 接着就可以按准確范圍讀取了
a = sht.range(f'a1:a{nrows}').value
print("讀取excel的第一列: "+str(a))

# 同理選取一行的數據也一樣
ncols = rng.columns.count
#用切片
fst_col = sht[0,:ncols].value
print("讀取excel的第一行: "+str(fst_col))

# 獲取單元格字體,大小,顏色等屬性
print('-----讀取格式-----')
font_name = sht.range('A1').api.Font.Name	# 獲取字體名稱
font_size = sht.range('A1').api.Font.Size	# 獲取字體大小
bold = sht.range('A1').api.Font.Bold		# 獲取是否加粗,True--加粗,False--未加粗
color = sht.range('A1').api.Font.Color		# 獲取字體顏色
print("A1單元格字體:"+font_name)
print("A1單元格大小:"+str(font_size))
print("A1單元格是否加粗:"+str(bold))
print("A1單元格顏色:"+str(color))

# 設置單元格字體,大小,顏色等屬性
print('-----設置格式-----')
sht.range('A1').api.Font.Name = 'Times New Roman'	# 設置字體為Times New Roman
sht.range('A1').api.Font.Size = 15			# 設置字號為15
sht.range('A1').api.Font.Bold = True		# 加粗
sht.range('A1').api.Font.Color = 0x0000ff	# 設置為紅色RGB(255,0,0)
font_name = sht.range('A1').api.Font.Name	# 獲取字體名稱
font_size = sht.range('A1').api.Font.Size	# 獲取字體大小
bold = sht.range('A1').api.Font.Bold		# 獲取是否加粗,True--加粗,False--未加粗
color = sht.range('A1').api.Font.Color		# 獲取字體顏色
print("A1單元格字體:"+font_name)
print("A1單元格大小:"+str(font_size))
print("A1單元格是否加粗:"+str(bold))
print("A1單元格顏色:"+str(color))

# 設置背景色
print('-----設置背景色-----')
sht.range('A6:V10').color = (255,0,255)
time.sleep(3)

sht["A1048576"].end('up').row #最大行,根據單元格位置
print(sht["XFD1"].end('left').column) #最大列,根據單元格位置

# 清理內容,清理數據及格式
print('-----清理內容,清理數據及格式-----')
sht.range('A6:V10').clear()

# 刪除行和列,插入行和列
print('-----按行寫入-----')
sht.range('b2').value = ["papi","lucy","kunal","snoopy"]
print('-----按列寫入-----')
sht.range('b3').options(transpose=True).value = ["year","month"]
print('-----刪除行和列,插入行和列-----')
sht.api.rows(1).delete #刪除首行
time.sleep(3)
sht.api.columns(1).delete# 刪除首列
sht.api.columns(2).insert #插入列
sht.api.rows(2).insert #插入行
time.sleep(3)

# 合並單元格
print('-----合並單元格-----')
sht.range('A1:A5').api.merge()

# 保存工作簿
wb.save('example.xlsx')

# 退出工作簿(可省略)
wb.close()

# 退出Excel
app.quit()
#

  


免責聲明!

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



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