Python: 讀寫Excel(openpyxl / win32com.client)

項目週報彙報的時候要作數據彙總,老是要從不一樣的excel文件中去獲取數據最後彙總到一個excel表裏面,因此決定用python直接寫個自動化腳原本自動執行。html

用python來讀寫excel,目前找了2個方法:win32com.client和openpyxlpython

  • win32com.client能夠對excel進行各類操做,能夠調用VBA的庫,至關因而模擬用戶對excel進行操做,在執行過程當中,你能夠看到excel被打開,而後數據被寫入,最後excel文件被關閉等等過程。(文檔也能夠參看OFFICE自帶的VBA EXCEL 幫助文件(VBAXL.CHM)。這裏面講述了EXCEL VBA的編程概念, 另外,《Python Programming on Win32》書中也有很詳細的介紹。這本書中(第九章)給出了一個類來操做EXCEL 文件,能夠很容易的加以擴展。)
  • openpyxl是處理excel2007/2010及之後的格式,也就是xlsx系列,若是要處理之前的2003的表格(xls),那麼則要用另外的庫(xlrd/xlwt等)。

python雖然並非特別在乎大小寫,可是使用win32com.client必定要注意大小寫,不少函數若是不區分大小寫,是沒法調用的,好比打開excel表格的Open函數,’O’必須大寫,還有wb.Save(),‘S’也必須大寫,而咱們使用openpyxl使用小寫便可。編程

openpyxl在保存時用save(),不少原有的格式圖表是沒法保留下來的,好比對excel進行修改,裏邊原有的透視表,用openpyxl的save()是沒法保存的,可是使用win32com.client的wb.Save()倒是能夠保存這些圖表的,這也是更加方便的地方。app

這裏簡單分享項目中用到這2個模版的寫數據方式:函數

  • 首先已經把數據都存到字典中:

dict_data = {'ThinkPad_Users': 448177, 'IdeaPad_Users': 109626, 'Desktop_Users': 50605, 'Install_ThinkPad': 903036, 'Install_IdeaPad': 197467, 'Install_Desktop': 91656, 'ThinkPad_Fail': 8495, 'IdeaPad_Fail': 1970, 'Desktop_Fail': 1592}ui

  • 而後須要作的是把字典中的數據寫入到excel表格中:

使用win32com方法來修改Excelspa

import win32com.client

#使用win32com方法來修改Excel
def modify_excel_win32com(dict_data, filename, title):
    #用於修改Excel的配置
    xlApp = win32com.client.Dispatch('Excel.Application')

    #用xlApp打開用於修改和寫入數據
    xlBook = xlApp.Workbooks.Open(filename, ReadOnly = False)

    sheet = xlBook.Worksheets('WeeklyData'
    col_size = sheet.UsedRange.columns.Count + 1
    #判斷該title是否存在;如存在則覆蓋數據;如不存在則新建數據
    print(sheet.UsedRange.Value[0])
    if title in sheet.UsedRange.Value[0]:
        # print(sheet.UsedRange.Value[0].index(title))
        col_size = sheet.UsedRange.Value[0].index(title) + 1
    else:
        try:
            col_size = sheet.UsedRange.Value[0].index(None) + 1
        except:
            pass
        finally:
            sheet.Cells(1, col_size).Value = title
            print(col_size)

    for key, value in dict_data.items():
        if key=='Install_A':
            sheet.Cells(2, col_size).Value = value
        elif key=='A_Users':
            sheet.Cells(3, col_size).Value = value
        elif key=='A_Fail':
            sheet.Cells(4, col_size).Value = value
            sheet.Cells(5, col_size).Value = '%.2f%%' % (value / sheet.Cells(2, col_size).Value * 100)
            # print(sheet.Cells(5, col_size).Value)
        elif key=='Install_B':
            sheet.Cells(6, col_size).Value = value
        elif key=='B_Users':
            sheet.Cells(7, col_size).Value = value
        elif key=='B_Fail':
            sheet.Cells(8, col_size).Value = value
            sheet.Cells(9, col_size).Value = '%.2f%%' % (value / sheet.Cells(6, col_size).Value * 100)
        elif key=='Install_C':
            sheet.Cells(10, col_size).Value = value
        elif key=='C_Users':
            sheet.Cells(11, col_size).Value = value
        elif key=='C_Fail':
            sheet.Cells(12, col_size).Value = value
            sheet.Cells(13, col_size).Value = '%.2f%%' % (value / sheet.Cells(10, col_size).Value * 100)
            sheet.Cells(14, col_size).Value = '%.2f%%' % ((sheet.Cells(4, col_size).Value + sheet.Cells(8, col_size).Value + value) 
                                                / (sheet.Cells(2, col_size).Value + sheet.Cells(6, col_size).Value + sheet.Cells(10, col_size).Value) 
                                                * 100)

    xlBook.Save()     #保存  
    xlApp.quit()   #關閉excel操做環境。

 

使用openpyxl庫來修改Excelexcel

from openpyxl import worksheet
from openpyxl import workbook
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter

#使用openpyxl庫來修改Excel
def modify_excel_openpyxl(dict_data, filename, title):    
    wb = load_workbook(filename)  #打開一個工做簿    
    sheet = wb['WeeklyData']  #獲取一張表
    
    col_size = sheet.max_column+1
    first_row = []
    for i in range(1, col_size):
        first_row.append(sheet.cell(row=1, column=i).value)
    print(first_row)
    #判斷該title是否存在;如存在則覆蓋數據;如不存在則新建數據
    if title in first_row:
        col_size = first_row.index(title) + 1
    else:
        try:
            col_size = first_row.index(None) + 1
        except:
            pass
        finally:
            sheet.cell(row=1, column=col_size, value=title)

    print(get_column_letter(col_size))
    col_letter = get_column_letter(col_size)
    sheet[col_letter+'2'] = 'testtest'

    for key, value in dict_data.items():
        if key=='Install_A':
            sheet[col_letter+'2'] = value
        elif key=='A_Users':
            sheet[col_letter+'3'] = value
        elif key=='A_Fail':
            sheet[col_letter+'4'] = value
            sheet[col_letter+'5'] = '='+col_letter+'4/'+col_letter+'2'
        elif key=='Install_B':
            sheet[col_letter+'6'] = value
        elif key=='B_Users':
            sheet[col_letter+'7'] = value
        elif key=='B_Fail':
            sheet[col_letter+'8'] = value
            sheet[col_letter+'9'] = '='+col_letter+'8/'+col_letter+'6'
        elif key=='Install_C':
            sheet[col_letter+'10'] = value
        elif key=='C_Users':
            sheet[col_letter+'11'] = value
        elif key=='C_Fail':
            sheet[col_letter+'12'] = value
            sheet[col_letter+'13'] = '='+col_letter+'12/'+col_letter+'10'
            sheet[col_letter+'14'] = '=('+col_letter+'4+'+col_letter+'8+'+col_letter+'12)/('+col_letter+'2+'+col_letter+'6+'+col_letter+'10)'

    wb.save(filename)
    wb.close()
相關文章
相關標籤/搜索