背景需求:
1-4月電子屏表格,都是用這個代碼將EXCEL數據整理成分類成3個WORD表格。
【辦公類-48-04】20250118每月電子屏臺賬匯總成docx-4(提取EXCLE里面1月份的內容,自制月份文件夾)-CSDN博客文章瀏覽閱讀1.2k次,點贊29次,收藏9次。【辦公類-48-04】20250118每月電子屏臺賬匯總成docx-4(提取EXCLE里面1月份的內容,自制月份文件夾)https://blog.csdn.net/reasonsummer/article/details/145230274?spm=1011.2415.3001.5331
存在問題:
每月都要把下載EXCEL名稱復制到代碼內,有點麻煩。
我希望只要把EXCEL放到文件夾下,程序就能自動轉移到2025年5月文件夾內。并識別它做三個WORD表格
deepseek的答案
20250603,獲取5月的所有EXCEL,導出文本EXCEL
放到一級文件夾下
然后用代碼慢慢生成
'''
電子屏臺賬2025年5月,自動提取當月內容(在XX之間的內容),制作當月文件夾
把EXCEL放在一級文件夾下,自動讀取它并轉移到2025年5月文件夾
自動識別2025年5月文件夾內的EXCEL,開始制作三個園區臺賬WORD,并打包rar
作者:星火訊飛、deepseek、阿夏
時間:20240603
'''print('----1、讀取EXCEL內容并合并成關鍵列表------')import os
import shutilimport pandas as pd
path= r'C:\Users\jg2yXRZ\OneDrive\桌面\電子屏每月2024'year=2025
# int(input('幾年(2025?\n'))
month=int(input('幾月?(4)\n'))garden=['總園', '一分園','二分園']folder_path = path+fr"\{year}年{month:02}月"
os.makedirs(folder_path,exist_ok=True)folder_name=folder_path+fr'\(以此為準){year}年{month:02}月電子屏臺賬(三個園區)'
os.makedirs(folder_name,exist_ok=True)# 把EXCLe復制到2025年1月文件夾
file_name = '279855026_20240901Jg2y各園部重點部位電子屏、播控系統_956f958e-4232-47d7-a6bb-2c086e4ade44.xlsx'# 把問卷星下載的xlsx轉移到2025年1月文件夾內
# 定義源文件和目標文件夾路徑
src_file = path+fr'\{file_name}'
dst_folder = folder_path
dst_file = os.path.join(dst_folder, f'{file_name}')
# 移動文件到目標文件夾
shutil.move(src_file, dst_file)# 279855026_按文本_20240901Jg2y各園部重點部位電子屏、播控系統_83_83.xlsx'
file_path = os.path.join(folder_path, file_name)
print(file_path)# 按行讀取
df = pd.read_excel(file_path)
filtered_rows = df.iloc[:, 6:22].values.tolist() # G列到W列的數據,按行轉換為列表
# print(rows)# 提取符合的日期print('----1、初始化一個空列表來存儲符合條件的行(數字是01的月份)------')
#
rows = []# 遍歷每一行
for row in filtered_rows:# 獲取第9個元素(索引從0開始,所以是14)cell_value = str(row[9])# print(cell_value)# 檢查第5-6個字符是否為“01”if cell_value[5:7] == f"{month:02}":rows.append(row)# # 打印符合條件的行
print(rows)for x in range(len(garden)):all_data=[]for y in range(len(rows)):if rows[y][0][2:]==garden[x]:# print(rows[y])for row in rows[y][1:]:# print(row)if row=='(跳過)':passelse: all_data.append(row)# print(all_data)# print(len(all_data))# 462print('----1、讀取EXCEL內容并合并成關鍵列表------')import pandas as pd# # 每行有幾個內容h=7# print(h)# # 拆分成7個一組nested_lists = [all_data[i:i+h] for i in range(0, len(all_data), h)]# print(nested_lists)# print(len(nested_lists))
# # # 26# 如果條數不滿20條,只有一頁if len(nested_lists) <=20:print(f"{len(nested_lists)} 在范圍 0-20 內")kong = 20 - len(nested_lists)print(kong)Y = 1# 判斷多頁情況下,最后一頁是否能夠湊滿20行,湊不滿,補空else: for z in range(20, 220, 20):if z < len(nested_lists) <= z + 20:# 出現過正好40條,只有兩頁,但出現了第3空頁,少了小于等于z+2-print(f"{len(nested_lists)} 在范圍 {z}-{z+20} 內")# 補多少的空格kong = z + 20 - len(nested_lists)print(kong)# 有幾頁Y = int((z + 20) / 20)# 一個列表里面有7個空w = [''] * h# 需要14個這種7空的嵌套列表v = [w] * kong# print(v)# 把實際的填寫內容+補充的空格,湊滿20的倍數頁nested_lists=nested_lists+v# print(nested_lists)# print(len(nested_lists))# 80 # 拆分合并每個格子的內容new=[]for n in range(len(nested_lists)): # 66行# 如果讀取的第一個內容為空if nested_lists[n][1]=='':for g in range(h):new.append('')else:# 添加序號不用加0new.append(n+1)# 電子屏ID '總園 校門口電子屏 402XXXXXXXX TY2021XXXXXX' split_list = nested_lists[n][1].split(' ')# print(split_list)# 將空格切開變成列表new.append(split_list[2])# 資產編號 new.append(split_list[3]) # 時間 (日期+時間new.append(nested_lists[n][2][:4]+'年'+nested_lists[n][2][5:7]+'月'+ \nested_lists[n][2][-2:]+'日'+str(nested_lists[n][3])+':'+str('%02d'%nested_lists[n][4]))# 操作內容 new.append(nested_lists[n][5])# 進出人員 (負責人)new.append(nested_lists[n][0])# 審核領導(園所管理主任)new.append(nested_lists[n][6])print(new)print(len(new))# 560 /7/20=4頁print('----2、讀取docx模板的數量------')# 讀取word的行列數from docx import Documentdoc_name = '電子屏臺賬模板.docx'doc_path = os.path.join(path, doc_name)# 打開文檔doc = Document(doc_path)# 獲取第一個表格table = doc.tables[0]# 獲取表格的行數和列數num_rows = len(table.rows)num_cols = len(table.columns)# print("行數:", num_rows)# # 22# print("列數:", num_cols)# 7# 每頁格子的坐標bg=[]for a in range(2,22):for b in range(7):bg.append('{}{}'.format('%02d'%a,'%02d'%b))# print(bg)# print(len(bg))# 140# 拆分成4頁每頁20個個一組c=int(len(new)/Y)content_lists = [new[i:i+c] for i in range(0, len(new), c)]# print(content_lists)# print(len(content_lists))# 15# 4 拆20行內容一組,一共4個嵌套列表# 列表new內容寫入docx模板,第一頁寫入20行*7的內容import os,timefrom docx import Documentfrom docx.shared import Pt, RGBColorfrom docx.enum.text import WD_PARAGRAPH_ALIGNMENTfrom docx.oxml.ns import qnfrom docx2pdf import convertfrom PyPDF2 import PdfMerger# 多少份(必須雙數)ziti = '宋體'size = 14imagePath = folder_path+r'\零時Word'if not os.path.exists(imagePath):os.makedirs(imagePath)for n in range(len(content_lists)):doc = Document(doc_path)# for b in range(0):table = doc.tables[0]for t in range(len(bg)):pp, qq, k = int(bg[t][0:2]), int(bg[t][2:4]), content_lists[n][t]run = table.cell(pp, qq).paragraphs[0].add_run(str(k))run.font.name = zitirun.font.size = Pt(size)run.bold = Falserun.font.color.rgb = RGBColor(0, 0, 0)r = run._elementr.rPr.rFonts.set(qn('w:eastAsia'), ziti)table.cell(pp, qq).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTERdoc.save(imagePath+fr'\{n:02d}.docx')time.sleep(2)print('-----3、創建一個帶頁碼的docx,合并word模板------')from docx import Documentfrom docx.enum.section import WD_SECTION_STARTimport osfrom docx.shared import Cm# # 創建一個帶頁碼的空Document對象,并把頁眉頁腳邊距改小source_dir = imagePath # 文件夾路徑combined_doc = Document(path+r'\頁碼.docx')# 讀取“整理”里面的docx的內容docx_files = []for file_name in os.listdir(source_dir):if file_name.endswith(".docx"):docx_files.append(os.path.join(source_dir, file_name))for file in docx_files:doc = Document(file)for element in doc.element.body:combined_doc.element.body.append(element) output_file = folder_name + fr'\{year}年{month:02}月({garden[x]})電子屏臺賬.docx' # 輸出文件路徑output_file1 = folder_name + fr'\{year}年{month:02}月({garden[x]})電子屏臺賬2.docx' # 輸出文件路徑combined_doc.save(output_file)time.sleep(2)print('-----4、把“合并docx"的第一段回車刪除。(頁碼模板自帶)---')doc = Document(output_file)# 刪除第1個段落(都只有一個回車)for i in [0]:dell_paragraph = doc.paragraphs[i]doc._element.body.remove(dell_paragraph._element)# 保存文檔doc.save(output_file)# time.sleep(2)print('-----5、替換園區---')import win32com.client as win32# 創建Word應用程序對象word_app = win32.gencache.EnsureDispatch("Word.Application")# 打開Word文檔doc = word_app.Documents.Open(output_file)# 創建Find對象find_object = doc.Content.Find# 設置查找和替換參數find_object.Text = "園區"find_object.Replacement.Text = garden[x]find_object.Forward = Truefind_object.Wrap = 1find_object.Format = Falsefind_object.MatchCase = Falsefind_object.MatchWholeWord = Falsefind_object.MatchWildcards = Falsefind_object.MatchSoundsLike = Falsefind_object.MatchAllWordForms = False# 執行查找和替換find_object.Execute(Replace=2)# 保存文檔doc.SaveAs(output_file)# 關閉文檔和應用程序doc.Close()word_app.Quit()time.sleep(2)# 刪除word臨時文件夾import shutilshutil.rmtree(imagePath)# 定義要打包的文件夾名稱
shutil.make_archive(folder_name, 'zip', folder_name)