엑셀파일을 아무거나 하나 열어서 파일탭의 정보를 눌러보면 아래와 같이 해당 엑셀파일에 대한 정보가 나오게 된다.

우측 속성에 보면 눈에 띄는 정보가 만든이가 있는데 회사에서 일을 하다 보면 다양한 오피스 문서들을 편집하고 pdf 로 내보내기도 하고 때로는 원본 오피스 파일도 전달하며 일을 하게 된다.
저 정보를 보는이가.. 몇이나 있을지는 모르겠으나.. ㅎㅎ 가끔은 전혀 관련없는 사람이 만든이로 들어가있으면 (특히 다른 회사 사람) 눈에 거슬릴 때가 있다..
하나하나 열어서 확인해보고 수정해도 되지만 파일이 많아지면 괴로워지므로... 일괄로 저 정보를 원하는 값으로 바꾸는 파이썬 스크립트를 하나 만들어보자.
우선 간단한 UI는 python 자체 내장된 tkinter를 이용하였고 가장 중요한 엑셀파일 수정을 위한 패키지는 openpyxl을 이용하였다.
아래 소스를 수행해보면 창이 하나 뜨는데 첫번째 버튼을 눌러서 원하는 폴더를 하나 지정하고 두번째 버튼을 누르게 되면 해당 폴더의 하위 폴더까지 모두 돌면서 확장자가 .xlsx 인 것들만 열어서 처리하게 되는 구조이다.

엑셀 파일탭-정보 에서 속성정보 중 내가원하는 값을 변경하기 위해서는 openpyxl에서 특정엑셀파일의 workbook을 연 다음 아래 두가지 값을 변경해주고 저장하면 된다.
wb.properties.creator = 'NoOneElseME'
wb.properties.lastModifiedBy = 'NoOneElseME'
소스를 보면 알겠지만 파일이 많을 경우를 대비해서 전체 파일개수를 얻어온 다음 처리하는 과정에서 Progress bar를 그려서 보여주는 부분도 들어있다.
UI 이쁘게 하는 데는 소질이 없는 편이라.. 화면구성은 그냥 그저 그렇다..ㅎㅎ
UI 창 제목에도 적었지만 원래는 모든 office file에 대해서 같은 동작(속성값에서 만든이 및 수정한 이 변경)을 하려고 시작한 소소한 일이다. 엑셀 말고도 워드/파워포인트 에 대해서도 openpyxl 과 같은 패키지가 분명 있을 것 같다. 이건 차차 공부를 더 해봐야 하겠다.
아래를 좀 더 발전시키면... 여러개의 office 파일에 대해서 특정 내용에 대하여 찾기 바꾸기를 일괄로 수행하는 것으로도 발전시켜볼 수도 있겠다..
import sys
import tkinter as tk
import tkinter.ttk as ttk
import tkinter.filedialog as fd
from tkinter import *
from tkinter import messagebox
from unicodedata import normalize
import os
import traceback
import clipboard
import openpyxl
from openpyxl import Workbook
from openpyxl import load_workbook
from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font, Color
from openpyxl.styles.borders import Border, Side
from openpyxl.drawing.image import Image
from openpyxl.cell.text import InlineFont
from openpyxl.cell.rich_text import TextBlock, CellRichText
from openpyxl.worksheet.datavalidation import DataValidation
from openpyxl.comments import Comment
from openpyxl.worksheet.properties import WorksheetProperties, PageSetupProperties
from openpyxl.packaging.extended import ExtendedProperties
recursive_level = 0
all_file_count = 0
current_count =0
offset=16
root = tk.Tk()
root.geometry('450x430')
root.title('All Office files property automatic changer.')
root.resizable(False, False)
path = os.path.join(os.path.dirname(__file__), 'icon.ico')
if os.path.isfile(path):
root.iconbitmap(path)
frame = tk.Frame(root)
frame.pack()
txt = Label(root, pady=offset, text="Path : Please set Path to click SetPath button")
txt.pack()
def getDir():
root.dirName = fd.askdirectory()
root.dirName.replace("/", "\\")
print("GetDirPath : " + root.dirName)
getAllFilesCount(root.dirName)
txt.configure(text="Path : "+root.dirName)
btn2.configure(state='normal')
def getAllFilesCount(dirname):
global all_file_count
filenames = os.listdir(dirname)
for filename in filenames:
tempname = os.path.join(dirname, filename)
all_file_count+=1
if os.path.isdir(tempname):
getAllFilesCount(tempname)
btn = Button(root, width=100, pady=offset, text="SetPath", command=getDir)
btn2 = Button(root, width=100, pady=offset, text="Start Property Change!", command=lambda: change_property_office_file(root.dirName))
btn.pack()
btn2.pack()
btn2.configure(state='disabled')
pb_var = DoubleVar()
pb = ttk.Progressbar(root, maximum=100, length=450, variable=pb_var, mode="determinate")
pb.pack(ipady=20)
def change_property_office_file(dirname):
global recursive_level
global all_file_count
global pb
global current_count
recursive_level += 1
filenames = os.listdir(dirname)
for filename in filenames:
current_count+=1
pb_var.set(current_count/all_file_count * 100)
pb.update()
full_filename = os.path.join(dirname, filename)
filename2, fileExtention = os.path.splitext(filename)
if os.path.isdir(full_filename):
change_property_office_file(full_filename)
elif fileExtention == '.xlsx':
wb = load_workbook(full_filename)
print("File : " + full_filename + " creator : " + wb.properties.creator + " lastModifier : " + wb.properties.lastModifiedBy)
wb.properties.creator = 'NoOneElseME'
wb.properties.lastModifiedBy = 'NoOneElseME'
wb.save(full_filename)
recursive_level -= 1
if recursive_level==0:
messagebox.showinfo("Info", "Processing Complete!")
root.mainloop()'STUDY' 카테고리의 다른 글
| LLM AI에게 문서요약 물어보기... (0) | 2024.11.20 |
|---|---|
| Python으로 Pptx Docx Xlsx 모두 속성 변경하기.. (1) | 2024.11.14 |
| 난 자전거 Cadence를 몇으로 탔나..? (3) | 2024.10.05 |
| Resilience / 回復彈力性 讀書感想文 (1) | 2024.02.11 |
| 손상된 m4a 파일 복구 삽질기/Process Explorer 활용기 (0) | 2023.10.31 |
댓글