Hiện tại có một số loại virus núp bóng marco trên excel để thực hiện các hành động phá hoại dữ liệu trên máy tính. Với Excel 79-2003 (.xls) macro có thể chạy trên định dạng này. Để giảm thiểu các macro có hại hoạt động và phá hủy dữ liệu, các bạn có thể save sang định dạng Excel 2010-2013-2016...(.xlsX), tuy nhiên với số lượng lớn file thì việc làm rất mất thời gian. Nên chúng tôi đã viết script để chuyển đổi hàng loạt các file với dạng .xls sang dạng .xlsX chia sẽ các bạn tham khảo.
Ý TƯỞNG THỰC HIỆN
Kiểm tra các file tại đường dẫn đưa vào nếu là excel 97-2003 (.xls) thì:
- Thực hiện chuyển các file này vào file nén .ZIP nhằm mục đích đề phòng trong quá trình chuyển đổi nội bị lỗi nội dung...
- Thực hiện chuyển đổi .xls sang .xlsx
- Ghi lại nhật ký (ghi log) các file đã chuyển thành công
- Thực hiện xóa file .xls
CODE:
import xlwings as xw
import os
from fnmatch import fnmatch
# https://stackoverflow.com/questions/2909975/python-list-directory-subdirectory-and-files
from datetime import datetime
# datetime object containing current date and time
import zipfile
now = datetime.now()
dt_str3 = now.strftime("%Y-%b-%d_%H-%M-%S")
'''
nén file
'''
def add_tozip (path,file_name):
with zipfile.ZipFile(rf"{path}\{dt_str3}_XLS_KHONG_DUNG.zip", "a") as zipf:
source_path = rf"{path}\{file_name}"
destination = rf"{file_name}"
zipf.write(source_path, destination)
# xóa file
def del_file(path,file_name):
os.remove(rf"{path}\{file_name}")
# ghi log
def write_log(path,file_name):
f = open(rf"{path}\{dt_str3}.txt","a")
f.write(rf"{path}\\")
f.write(rf"{file_name}")
f.write("\n")
f.flush() # thực hiện ghi nội dung vào file
f.close()
print (f'File"{path}\{file_name}" DA DUOC chuyen sang dinh dang moi .XLSX')
# thực hiện save sang dạng mới
def save_as(path,file_name):
add_tozip (path,file_name) # nen file
wb1 = xw.Book(rf"{path}\{file_name}")
file_name = file_name.replace(".xls","_FIXED.xlsx") # XÓA .XLS
wb1.save(rf"{path}\{file_name}")
wb1.close()
file_name = file_name.replace("_FIXED.xlsx",".xls") # đổi lại thành .xls nhằm mục đích ghi log và xóa file .xls
write_log(path,rf"{file_name}")
del_file(path,file_name)
# nếu lấy danh sách file trong folder thì dùng hàm này (không lấy trong sub được)
def getfiles(path_dir):
dir_list = os.listdir(path_dir)
return dir_list
xw.App(add_book=False)
xw.App(visible=False)
path = input('Dan duong dan vao: ')
#path = r'C:\Users\khanhvc\Downloads\Da'
'''
lst_files = getfiles(path)
# không lấy file trong subfolder
for file_name in lst_files:
# print (x)
if file_name.endswith('.xls'):
save_as(path,rf"{file_name}")
'''
for path, subdirs, files in os.walk(path):
for file_name in files:
if fnmatch(file_name, "*.xls"):
save_as(path,rf"{file_name}")
# print(os.path.join(path, name))
Hướng dẫn cho các bạn chưa biết python:
- Tải python về cài đặt
- Vào run -> cmd -> enter gõ pip install xlwings -> enter (cài đặt thư viện)
- Copy toàn bộ nội dung code dán vào notepad lưu thành file .py. Ví dụ: c:\python\vidu.py
- Vào run -> cmd -> enter gõ cd c:\python -> enter -> python vidu.py -> enter (thực thi file .py)
- Dán/nhập vào đường dẫn chứa các file .xls (chỉ cần folder cha, chương trình sẽ tự động tìm tìm trong subfolder) Ví dụ: D:\khanh\congviec
Xong!