讓Excel飛起來——xlwings

最近工做須要整理將近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




 

 

 

 

  1. xlwings基本對象

    xlwings基本對象

App至關於Excel程序,Book至關於工做簿。N個Excel程序則由apps表示,N個工做簿由books表示。函數

  1. 對工做簿的操做
    #導入xlwings模塊
    import xlwings as xw
    #新建工做簿,這裏默認爲新建了一個App,即打開Excel程序,並新建一個工做簿
    xw.Book()
    #引用工做簿
    xw.Book('工做簿3')
    # 引用工做簿也能夠用books
    xw.books['工做簿3’]
    #打開已有工做簿
    xw.Book(r'e:\myworkbook.xlsx')
  2. 對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

數據結構

  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
  2. 二維數據
    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
  3. 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)

相關文章
相關標籤/搜索