openpyxl庫,1秒合並多張表格並設置圖表格式


在日常辦公中,我們經常有這樣的需求,需要重復的合並表格數據,如果數據表不多,通常復制粘貼就足夠了,要是有成百上千的表格需要合並,普通的Ctrl+C、Ctrl+V已經難以實現,那么就要考慮用代碼去合並。

這里給大家介紹兩個Python庫,用於表格的數據合並,以及解決代碼合並后,圖表樣式固定的問題,第一個OS庫,用於遍歷文件目錄,第二個openpyxl庫用來操作表格,下面逐一介紹這兩個庫的功能。

OS模塊

 

這里先介紹OS模塊的功能,因為在調用的時候,涉及的參數不多,通常都只有一行代碼,總結常用的功能如下。

os.getcwd()    得到當前工作目錄,即當前Python腳本工作的目錄路徑。
os.listdir()      返回指定目錄下的所有文件和目錄名。
os.remove()   用來刪除一個文件。
os.path.isfile()     檢驗給出的路徑是否是一個文件。
os.removedirs(r”c:\python”)    刪除多個目錄。
os.path.exists()    檢驗給出的路徑是否真地存在。
os.path.isdir()    檢驗給出的路徑是否是一個目錄。
os.path.dirname()    獲取路徑名。
os.path.basename()    獲取文件名
os.path.abspath()    獲得絕對路徑
os.system()    運行shell命令
os.rename(old,new)      重命名
os.path.getsize(filename)    獲取文件大小
os.stat(file)    獲取文件屬性
os.mkdir(“test”)    創建單個目錄
os.makedirs(r”c:\python\test”)    創建多級目錄

 

openpyxl模塊

 

openpyxl庫用於操作表格,功能包括新建一個空的表格、給表格添加數據、導入數據表、遍歷數據表內容、合並多個表格以及修改單元格格式等。

 

 

創建一個空的表格

如何使用python創建一個空的表格,這里使用openpyxl庫,包含創建表格,更改表名以及保存空表。

from openpyxl import Workbook
#創建表格
wb=Workbook()

#獲取當前active的sheet
sheet=wb.active

#查看sheet名
sheet.title

#改sheet名
sheet.title="表格一"

#保存表
wb.save(r"C:\Users\尚天強\Desktop\測試.xlsx")

通過上面的代碼,我們成功在桌面新建了一個名叫測試的工作簿,里面有一張名叫表格一的sheet表。

 

 

 

打開已經存在目錄中的表

除了新建一張空的表,還可以使用命令打開已經存在的表格數據

#打開一個存在的表
from openpyxl import load_workbook
wb2=load_workbook(r"C:\Users\尚天強\Desktop\2017年銷售明細\銷售明細第1季度.xlsx"")

向表格中寫入數據

向空表中寫入數據有三種方式,可以依次向單元格填寫,也可以按照附加行的方式進行填寫,填寫的效果如下所示。

from openpyxl import Workbook
import datetime
#創建表格
wb=Workbook()
#獲取當前active的sheet
sheet=wb.active

#方式一:數據可以直接分配到單元格中(可以輸入公式)
sheet["A1"]="李明"
sheet["B2"]="小紅"
sheet["C3"]="小王"

#方式二:可以附加行,從第一列開始附加(從最下方空白處,最左開始)(可以輸入多行)
sheet.append(["張三","李四","王五"])

#方式三:Python類型會被自動轉換
sheet["A5"]=datetime.datetime.now().strftime("%Y-%m-%d")

#保存表
wb.save(r"C:\Users\尚天強\Desktop\測試.xlsx")

 

 

獲取已有表格中的數據

要打開一張表,可以先查看這張表的所有sheet名,對sheet賦值,然后獲取對應的值,這里得出一月這張表中A1單元格中的值。

from openpyxl import load_workbook
wb2=load_workbook(r"C:\Users\尚天強\Desktop\2017年銷售明細\銷售明細第1季度.xlsx")

#查看sheet名
wb2.sheetnames

#獲取一月這張表
sheet=wb2.get_sheet_by_name("一月")

#查看第一張表中A1單元格中的值
sheet["A1"].value
'銷售日期'

借助for循環導入A1到A5單元格中的值。

#打印一列值
for cell in sheet["A1:A5"]:
     print(cell[0].value)

 

 

導入全部數據

如果要導入單元格中的全部數據,需要先遍歷所有的行,然后遍歷所有的單元格,數據導入結果如下所示。

#打印全部值
for row in sheet:
    for cell in row:
        print(cell.value,end=",")
    print()#換行

 

 導入指定行數據
指定導入數據的行數和列數,這里限定導入前五行和前五列數據,數據結果如下所示。

#遍歷指定行,第1行開始至第5行,每行打印5列
for row in sheet.iter_rows(min_row=0,max_row=5,max_col=5):
    for cell in row:
        print(cell.value,end="")
    print()

 

 導入全部列數據
導入全部的列數據,需要先遍歷所有的列,然后遍歷所有的單元格,數據導入結果如下。

#遍歷全部列
for column in sheet.columns:
    for cell in column:
        print(cell.value,end="")
    print()

 

 導入指定列數據
導入指定的列數據,在參數中限定最小和最大列數,以及最小和最大行數,數據導入結果如下所示。

#遍歷指定幾列的數據
for col in sheet.iter_cols(min_col=2,max_col=5,min_row=3,max_row=5):
    for i in col:
        print(i.value,end="")
    print()

 

 刪除工作表

若要刪除工作表,有remove和del兩種方式。

#刪除工作表
#方式一
wb.remove(sheet)

#方式二
del wb[sheet]

設置表格樣式

設置表格的樣式,通常會設置表格的字體、字號大小、顏色、表格邊框、行高、列寬、字體位置等,這部分的參數設置較為瑣碎,這里舉例常用的幾個參數設置,結果如下所示。

#導入包
from openpyxl.styles import Font,colors,Alignment,Border,Side
from openpyxl import load_workbook

wb=load_workbook(r"C:\Users\尚天強\Desktop\測試.xlsx")

#獲取當前active的sheet
sheet=wb.active
#設置字體樣式
sheet['A1'].font=Font(name='微軟雅黑',size=10,italic=False,color=colors.BLUE,bold=True)

#設置A1中的數據垂直居中和水平居中
sheet['A1'].alignment=Alignment(horizontal='center',vertical='center')

#第2行行高
sheet.row_dimensions[2].height=15

#C列列寬
sheet.column_dimensions["C"].width=20

#設置邊框
border=Border(left=Side(border_style='medium',color=colors.BLACK),
              right=Side(border_style='medium',color=colors.BLACK),
              top=Side(border_style='medium',color=colors.BLACK), 
              bottom=Side(border_style='medium',color=colors.BLACK), 
              diagonal=Side(border_style='medium',color=colors.BLACK), 
              diagonal_direction=0, 
              outline=Side(border_style='medium',color=colors.BLACK),
              vertical=Side(border_style='medium',color=colors.BLACK), 
              horizontal=Side(border_style='medium',color=colors.BLACK))              

sheet["B4"].border=border   

#保存表
wb.save(r"C:\Users\尚天強\Desktop\測試.xlsx")

 

 

分析實例

 

以上部分,逐一介紹了openpyxl部分庫的功能,下面舉一個實例進行表格的合並以及格式的設置,如下是2017年的銷售明細,包含2017年4個季度的銷售數據明細。

 

 且每一個季度銷售數據里又包含三個月的具體明細,現在需要批量合並4個工作簿,共計12張表,使用Ctrl+C、Ctrl+V功能已經不能很好的解決這里的問題,需要用代碼解決。

 

 這里首先使用os庫,循環遍歷該文件下的目錄,使用openpyxl庫循環遍歷單元格中的數據,並且導入,合並結果如下,共計合並14283行記錄

from openpyxl import Workbook,load_workbook
import os

def concat_data(file_path,save_path):
    files_name=os.listdir(file_path)
    
    #創建新表格
    new_wb=Workbook()
    new_ws=new_wb.active
    header=['銷售日期', '員工工號', '銷售員', '貨號', '銷售單編號', '銷量', '銷售額']
    new_ws.append(header)
    
    #向新的表格寫入數據
    for file_name in files_name:
        wb=load_workbook(file_path+"\\"+file_name)
        for sheet in wb.sheetnames:
            ws=wb[sheet]
            for row in ws.iter_rows(min_row=2,values_only=True):
                new_ws.append(row)
    
    #數據保存
    new_wb.save(save_path+"\\"+"數據合並.xlsx")

concat_data(r"C:\Users\尚天強\Desktop\2017年銷售明細",r"C:\Users\尚天強\Desktop")

 

 同時給表格設置固定的圖表樣式,其中的單元格屬性值可以直接進行修改

from openpyxl import Workbook,load_workbook
from openpyxl.styles import Font,PatternFill,Alignment,Border,fills,colors,Side

#導入表格數據
wb=load_workbook(r"C:\Users\尚天強\Desktop\數據合並.xlsx")

#操作單元格
ws=wb.active

#調整列寬
ws.column_dimensions["A"].width=25
ws.column_dimensions["B"].width=10
ws.column_dimensions["C"].width=10
ws.column_dimensions["D"].width=13
ws.column_dimensions["E"].width=35
ws.column_dimensions["F"].width=8
ws.column_dimensions["G"].width=10

#設置單元格格式
#設置字體格式
font=Font("微軟雅黑",size=12,color=colors.BLACK,bold=False)

#單元格顏色填充
fill=PatternFill(fill_type="solid",start_color="CDCDCD",end_color="CDCDCD") #CDCDCD淺灰色

#單元格對齊方式
alignment=Alignment(horizontal="center",vertical="center",indent=0) #wrap_text=True文字換行,shrink_to_fit=True自適應寬度

#單元格邊框
bd=Border(left=Side(border_style="thin",color=colors.BLACK),
          right=Side(border_style="thin",color=colors.BLACK),
          top=Side(border_style="thin",color=colors.BLACK),
          bottom=Side(border_style="thin",color=colors.BLACK),
          outline=Side(border_style="thin",color=colors.BLACK),
          vertical=Side(border_style="thin",color=colors.BLACK),
          horizontal=Side(border_style="thin",color=colors.BLACK)
         )

#遍歷數據
for irow,row in enumerate(ws.rows,start=1):
    font=font
    fill=fill
    alignment=alignment
    border=bd
    for cell in row:
        cell.font=font
        cell.fill=fill
        cell.alignment=alignment
        cell.border=bd
        
#設置表頭字體格式
ft=Font("宋體",size=12,color=colors.BLUE,bold=True)#italic=True斜體
ws["A1"].font=ft
ws["B1"].font=ft
ws["C1"].font=ft
ws["D1"].font=ft
ws["E1"].font=ft
ws["F1"].font=ft
ws["G1"].font=ft

#保存數據
wb.save(r"C:\Users\尚天強\Desktop\[格式調整]數據合並.xlsx")
View Code

 


免責聲明!

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



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