日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python杀死了excel_Python杀死了Excel|自动更新表格,告别繁琐

發布時間:2023/12/10 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python杀死了excel_Python杀死了Excel|自动更新表格,告别繁琐 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

大家好,又到了Python辦公自動化專題。

今天我們講解的案例是如何使用Python自動更新Excel表格,簡單來說就是每天都會對Excel中多個sheet進行更新,需要操作完后可以用程序完成第一張sheet 匯總表的更新,大概就是這樣👇

當然實現這一功能可以使用VBA或者Excel中的其他操作,但是查了相關操作略顯復雜,現在我們使用Python來完成,主要涉及以下操作:

os、glob模塊處理文件

Pandas處理多個表格

openpyxl調整Excel樣式

創建多個隨機數據

為了盡可能模擬讀者的生產環境多了這一步。首先我們先用Python來創建一些隨機數據,數據已經充分則可以跳到下一步驟。

我們需要把這個excel文件命名好放在桌面的data文件夾中

from openpyxl import load_workbook

import os

import glob

import random

def GetDesktopPath():

return os.path.join(os.path.expanduser("~"), 'Desktop')

# 調用glob可以利用通配符獲取指定命名格式的文件

path = glob.glob(f'{GetDesktopPath()}/data/*.xls*')[0]

workbook = load_workbook(filename=path)

sheet_init = workbook.active

接著是創建一些供隨機的內容,可以隨意寫,我們還是皮卡丘化

name_lst = ['皮卡丘', '小火龍', '杰尼龜', '妙蛙種子', '風速狗', '小拳石', '飛天螳螂']

place_lst = [chr(i).upper() for i in range(97, 123)]

# 我忘記大寫字母的碼了哈哈哈 這樣變著法換大寫字母

activity_lst = ['橢圓機', '籃球', '足球', '羽毛球', '跳繩']

source_lst = ['朋友介紹', '微信聊天', '網頁彈窗', '其他']

for i in range(30):

# 不斷去拷貝第一頁并重命名

sheet = workbook.copy_worksheet(sheet_init)

sheet.title = f'{i+1}日'

for j in range(random.randint(10, 30)):

# 從第三行開始行遍歷

for row in sheet.iter_rows(min_row=3+j, max_row=3+j):

info = [f'{j+1}', f'{i+1}日', f'{random.choice(name_lst)}', f'{random.choice(place_lst)}館',

f'{random.choice(activity_lst)}', f'{random.choice(source_lst)}', f'{random.randint(1, 10)}',

'無', f'{random.choice(["Y", "N"])}', f'{random.choice(["Y", "N"])}', f'{random.choice(["Y", "N"])}']

# 嵌套循環,對當前行的格子進行遍歷把內容寫入

for index, k in enumerate(info):

row[index].value = k

print(f'第{i+1}日已完成')

workbook.save(filename=f'{GetDesktopPath()}/data/results.xlsx')

注意以上代碼要單獨運行先生成數據,再運行后續代碼,OK現在數據就創建好了,然后正式進入我們的問題

合并多個sheet并寫入匯總sheet

由于后面多個表的更新后需要按日期順序在匯總表里呈現,因此有一個策略是利用openpyxl按順序遍歷各表然后寫回匯總表。但注意,表格中存在邊框、居中等樣式修改

這種情況下,openpyxl會識別樣式,認為這些行是已經有數據的,故純粹的sheet.append()方法是無法將數據寫入這些所謂的空行,而會從沒有樣式的行開始寫入

所以需要在各表寫入的時候不斷計算所在行,并利用sheet.iter_rows()定位。是不是有點麻煩?因此我們換個思路:利用pandas,其方便的地方在于無視表格樣式

path_new = glob.glob(f'{GetDesktopPath()}/data/results.xls*')[0]

workbook_new = load_workbook(filename=path_new)

# 方便獲取總表數便于遍歷

sheetnames = workbook.sheetnames

df_lst = []

for i in range(1, len(sheetnames)):

df = pd.read_excel(path_new , encoding='utf-8', sheet_name=i, skiprows=1)

df_lst.append(df)

# 把獲取的各表縱向合并,注意縱向合并常常需要重置索引

df_total = pd.concat(df_lst,axis=0,ignore_index=True)

# 索引是從0開始,利用索引+1重置各記錄的編號

df_total['編號'] = df_total.index + 1

將生成的表寫回匯總表即可,涉及的內容稍微比較復雜。由于直接使用dataframe.to_excel會覆蓋原excel導致只有一張sheet,其他全部丟失,需要利用pd.ExcelWriter,具體見代碼。刪除原來的匯總表并寫入新的匯總表。因為新寫入的sheet會置于末尾,可以用list.insert(0, list.pop())將最后一個元素置于開頭

writer = pd.ExcelWriter(path_new, engine='openpyxl')

writer.book = workbook

workbook.remove(workbook['匯總表'])

df_total.to_excel(excel_writer=writer, sheet_name=u'匯總表', index=None)

writer.close()

workbook._sheets.insert(0, workbook._sheets.pop())

workbook.save(filename=f'{GetDesktopPath()}/data/results.xlsx')

這就完成了嗎?沒有。

pandas的優勢“無視樣式”也成為了它的缺陷:寫入文件時沒有樣式信息,因此最后再用openpyxl對第一頁的樣式調整。

openpyxl調整樣式

調整樣式部分我們直接看代碼,關鍵部分都給了詳細注釋

# 設置對齊、線性、邊框、字體

from openpyxl.styles import Alignment

from openpyxl.styles import Side, Border

from openpyxl.styles import Font

sheet = workbook[sheetnames[0]]

sheet.insert_rows(idx=0) # 插入第一行

font = Font(name='宋體', size=18, bold=True)

sheet['A1'] = '皮卡丘體育2020年06月新學員信息登記表'

sheet['A1'].font = font # 設置字體大小和加粗

req = ':(\w)'

weight = re.findall(req, sheet.dimensions)[0]

sheet.merge_cells(f'A1:{weight}1')

# 樣式先準備好

alignment = Alignment(horizontal='center', vertical='center')

side = Side(style='thin', color='000000')

border = Border(left=side, right=side, top=side, bottom=side)

# 遍歷cell設置樣式

rows = sheet[f'{sheet.dimensions}']

for row in rows:

for cell in row:

cell.alignment = alignment

cell.border = border

# 設置前兩行的行高

sheet.row_dimensions[1].height = 38

sheet.row_dimensions[2].height = 38

# 設置列寬

letter_lst = [chr(i+64).upper() for i in range(2, ord(weight)-ord('A')+1+1)]

sheet.column_dimensions['A'].width = 8

for i in letter_lst:

sheet.column_dimensions[f'{i}'].width = 14

workbook.save(filename=f'{GetDesktopPath()}/data/results.xlsx')

到這里,我們就成功使用Python實現自動更新Excel表格,并且調整樣式,可能看上去有點復雜,但核心就是使用Pandas處理并使用openpyxl調整樣式,并且相比于在Excel中實現,一個更大的優勢就是一旦代碼寫完以后可以在有相關需求的Excel中直接使用,從而解放了雙手。拜拜,我們下個案例見~

注:本文使用的數據與源碼下載

鏈接:https://pan.baidu.com/s/139Nh59T7nPfJAW205QmDBw 密碼:863v

總結

以上是生活随笔為你收集整理的python杀死了excel_Python杀死了Excel|自动更新表格,告别繁琐的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。