最近工做須要整理將近60位同事的週報合併到一個excel中,每週都會佔用的大量的時間。但願把這個工做自動化,網上看了下基本都是用vba編程實現這一功能。因爲沒有使用過vba,但願使用本身會的東西去實現。
咱們的週報模板大體是這個樣子的:
html
搜了下python操做excel的包,看到最多的是xlrd和xlwt。個人操做其實很簡單就是拷貝每個excel中的內容並粘貼到一個彙總的excel,但這兩個包好像並不符合個人要求。python
偶然間看到xlwings這個python包,使用這個包基本能夠實現你在excel中的操做,如選中B5 到J20 這些單元格中的數據。這正是我想要的,寫了個簡單的腳本實現週報的整理,在這裏記錄下。
使用中參考了xlwings官方文檔
我主要使用了WorkBook、Sheet、Range這三個。編程
self.wb.sheets.add('Shope Info')#這句話是添加一個工做表名哦
import xlwings as xw
#app_visible=False 不打開excel窗口
wb = xw.Workbook(path), app_visible=False)
detail_sheet = xw.Sheet(unicode("任務詳細信息", "utf-8"))
#獲取有數據的最大行數,因爲咱們單個excel數據不會超過幾十行,我使用的是B4:I40
last_row_index = xw.Range(detail_sheet, "B4").table.last_cell.row
#肯定咱們選取的數據範圍,如: B4:I20
rg = "B4:I" + str(last_row_index)
#獲取劃定範圍單元格中的數據
work_detail = xw.Range(detail_sheet, rg).value
#關閉打開的excel
wb.close()
接下來就是將work_detail 獲取到的數據拷貝到咱們彙總的excel中,代碼幾乎一致api
target_excel_path = u"F:\經分應用產品線小組週報模板.xlsx"
wb_target = xw.Workbook(target_excel_path, app_visible=False)
cr_sheet = xw.Sheet(u"任務詳細信息")
#清空內容,單不清空格式
xw.Range(cr_sheet, "B4:I200").clear_contents()
xw.Range(cr_sheet, "B4").table.value = work_detail
wb_target.save(u"F:\經分應用產品線小組週報.xlsx")
wb_target.close()
(PS 後面但願加入自動添加數據透視圖的功能,暫時還沒找到這方面的接口)數據結構
好了,之後只須要run一下python腳本,自動整理而且發送郵件給負責人。
搞定 。。。。。。app
- xlwings基本對象
xlwings基本對象
App至關於Excel程序,Book至關於工做簿。N個Excel程序則由apps表示,N個工做簿由books表示。函數
- 對工做簿的操做
#導入xlwings模塊
import xlwings as xw
#新建工做簿,這裏默認爲新建了一個App,即打開Excel程序,並新建一個工做簿
xw.Book()
#引用工做簿
xw.Book('工做簿3')
# 引用工做簿也能夠用books
xw.books['工做簿3’]
#打開已有工做簿
xw.Book(r'e:\myworkbook.xlsx')
- 對sheet以及Range的操做
import xlwings as xw
wb=xw.Book()
# 引用名字爲"sheet2"的sheet
sht=wb.sheets['sheet2']
# 引用"sheet2"中的B1單元格
rng=sht.range('B1')
# 將B1單元格的值改成666
rng.value=666
數據結構
- 一維數據
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
- 二維數據
python的二維列表,能夠轉換爲Excel中的行列。二維列表,即列表中的元素仍是列表。在Excel中,二維列表中的列表元素,表明Excel表格中的一列。例如: # 將a1,a2,a3輸入第一列,b1,b2,b3輸入第二列
list1=[[‘a1’,'a2','a3'],['b1','b2','b3']]
sht.range('A1').value=list1
運行結果
# 將A1:B3的值賦給二維列表list1
list1=sht.range('A1:B3‘).value
- Excel中區域的選取表格
# 選取第一列
rng=sht. range('A1').expand('down')
rng.value=['a1','a2','a3']
第一列
# 選取第一行
rng=sht.range('A1').expand('right')
rng=['a1','b1']
第一行
# 選取表格
rng.sht.range('A1').expand('table')
rng.value=[[‘a1’,'a2','a3'],['b1','b2','b3']]
表格
結束
- 本文首先簡單介紹了,經過Python運用xlwings模塊,對Excel工做簿、工做表和單元格的操做。
- 再介紹了xlwings,如何對Excel表格的行和列寫入和引用數據
- 經過二維或者一維列表對Excel工做表的數據進行寫入或者引用,既簡化了代碼,也提升了程序的效率。由於python讀寫Excel表格的速度,原小於python程序自身的運行速度。
=================================post
xlwings如何設置字體、顏色等屬性
最近使用python在寫一個小軟件,中間須要處理excel文件,因此瞭解了一下,使用python來操做excel文件的模塊有不少,參考了[1]中的模塊對比:測試
因而果斷選擇了「xlwings」做爲我操做excel的模塊。不得不說,xlwings是一個很是好的模塊,根據網上的教程以及官方文檔[2]我很快完成了數據讀寫部分的程序,並且測試了一下,總體讀寫的速度都很快。字體
可是在測試的過程當中,遇到的第一個問題來了。
xlsx文件被鎖定了怎麼辦?
下圖就是我在debug完了之後,再次打開個人xlsx文件想去看看效果的時候彈出來的通知
查閱資料後,發現是由於咱們在debug過程當中結束程序後,沒有執行到app.quit()語句來關閉xlwings建立的app,因此後臺這個xlsx進程並無關閉。
因此解決這個問題的方法很簡單,打開任務管理器,找到上圖進程,而後結束進程便可。
xlwings如何設置字體、顏色等屬性
這部分是今天主要解決的問題。目前網上我所看到的全部關於xlwings的資料都沒有提到設置字體的方面,甚至我在官方文檔[2]中也沒有看到關於設置字體的函數,在貼吧裏還看到有兄弟說xlwings不能修改字體:
正好個人軟件裏面須要修改xlsx文件中的字體及其顏色,並且個人軟件已經使用xlwings模塊寫了很大一部分了,再換模塊顯然是不划算的,因此我決定深刻研究一下。
我在使用xlwings完成按列降序排列的時候參考了@RobbenEmi 的博文[3],很是感謝@RobbenEmi,雖然他的博文很短,可是他必定是作過深刻研究的。
受@RobbenEmi 博文[3]的啓發,我感受突破口可能在xlwings的api方法上,因而我返回官方文檔[2]從新查找相應的函數方法,以下圖所示。
看到這句話,再結合@RobbenEmi 的博文[3],我去微軟官網查看了一下office VBA參考中的Font.Color方法
再結合xlwings官方文檔中說的使用api()方法返回的是pywin32或appscript對象,我在網上查閱了pywin32如何操做xlsx文件,參考了@帥胡 的博文[4],我實現了使用xlwings模塊設置字體、顏色、加粗等屬性。
以下源碼展現如何獲取相應的屬性。
# coding: utf-8
import xlwings as xw
app=xw.App(visible=False,add_book=False)
filepath = '../data/test.xlsx'
wb=app.books.open(filepath)
sht = wb.sheets('Sheet1')
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(font_name)
print(font_size)
print(bold)
print(color)
wb.save()
wb.close()
app.quit()
打印的結果以下
相應xlsx文件中的信息以下
xlwings模塊獲取結果與實際xlsx文件字體屬性吻合,由於xlwings模塊相同的語句既能夠獲取property又能夠set property,因此設置相應屬性的源碼以下。
# coding: utf-8
import xlwings as xw
app=xw.App(visible=False,add_book=False)
filepath = '../data/test.xlsx'
wb=app.books.open(filepath)
sht = wb.sheets('Sheet1')
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(font_name)
print(font_size)
print(bold)
print(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(font_name)
print(font_size)
print(bold)
print(color)
wb.save()
wb.close()
app.quit()
打印的結果以下
相應xlsx文件中的信息以下
如今你可使用xlwings自由地設置你想要的任何字體屬性了!
細心的你必定會觀察到,我這段設置字體屬性的源碼中,設置字體顏色的那句代碼的賦值,並非紅色RGB(255,0,0)的十六進制6位顏色碼,這是怎麼回事呢?
在下一篇博文(關於顏色碼的幾種經常使用表示及其相互轉換)中,我會討論RGB顏色碼的一些問題,相信你會在下篇博文找到答案。
補充資料
獲取工做表的總行數和總列數
workbook=xw.Book(r'path)
workbook.sheets[1].range(1, 1).expand().shape 返回:(25087, 3)