老板又出难题,气得我写了个自动化软件
大数据DT
共 20181字,需浏览 41分钟
·
2021-07-18 12:40
导读:办公神器.exe
01 doc格式批量转为docx
pip install pypiwin32
from win32com import client as wc # 导入模块
from pathlib import Path
import os
import shutil
doc_path = r"E:\tmp\答疑整理"
temp_dir = "temp"
if os.path.exists(f"{doc_path}/{temp_dir}"):
shutil.rmtree(f"{doc_path}/{temp_dir}")
os.mkdir(f"{doc_path}/{temp_dir}")
word = wc.Dispatch("Word.Application") # 打开word应用程序
try:
for filename in Path(doc_path).glob("*.doc"):
file = str(filename)
dest_name = str(filename.parent/f"{temp_dir}"/str(filename.name))+"x"
print(file, dest_name)
doc = word.Documents.Open(file) # 打开word文件
doc.SaveAs(dest_name, 12) # 另存为后缀为".docx"的文件,其中参数12指docx文件
finally:
word.Quit()
02 批量提取docx文档的图片
import itertools
from zipfile import ZipFile
import shutil
if os.path.exists(f"{doc_path}/{temp_dir}/imgs"):
shutil.rmtree(f"{doc_path}/{temp_dir}/imgs")
os.makedirs(f"{doc_path}/{temp_dir}/imgs")
i = 1
for filename in itertools.chain(Path(doc_path).glob("*.docx"), (Path(doc_path)/temp_dir).glob("*.docx")):
print(filename)
with ZipFile(filename) as zip_file:
for names in zip_file.namelist():
if names.startswith("word/media/image"):
zip_file.extract(names, doc_path)
os.rename(f"{doc_path}/{names}",
f"{doc_path}/{temp_dir}/imgs/{i}{names[names.find('.'):]}")
print("\t", names, f"{i}{names[names.find('.'):]}")
i += 1
shutil.rmtree(f"{doc_path}/word")
03 批量图片格式转换
pip install pillow
from PIL import Image
if not os.path.exists(f"{doc_path}/imgs"):
os.mkdir(f"{doc_path}/imgs")
for filename in Path(f"{doc_path}/{temp_dir}/imgs").glob("*"):
file = str(filename)
with Image.open(file) as im:
im.convert('RGB').save(
f"{doc_path}/imgs/{filename.name[:filename.name.find('.')]}.jpg", 'jpeg')
04 完整代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 创建时间:2020/12/25 21:46
__author__ = 'xiaoxiaoming'
import itertools
import os
import shutil
from pathlib import Path
from zipfile import ZipFile
from PIL import Image
from win32com import client as wc # 导入模块
def word_img_extract(doc_path, temp_dir):
if os.path.exists(f"{doc_path}/{temp_dir}"):
shutil.rmtree(f"{doc_path}/{temp_dir}")
os.mkdir(f"{doc_path}/{temp_dir}")
word = wc.Dispatch("Word.Application") # 打开word应用程序
try:
for filename in Path(doc_path).glob("*.doc"):
file = str(filename)
dest_name = str(filename.parent / f"{temp_dir}" / str(filename.name)) + "x"
print(file, dest_name)
doc = word.Documents.Open(file) # 打开word文件
doc.SaveAs(dest_name, 12) # 另存为后缀为".docx"的文件,其中参数12指docx文件
finally:
word.Quit()
if os.path.exists(f"{doc_path}/{temp_dir}/imgs"):
shutil.rmtree(f"{doc_path}/{temp_dir}/imgs")
os.makedirs(f"{doc_path}/{temp_dir}/imgs")
i = 1
for filename in itertools.chain(Path(doc_path).glob("*.docx"), (Path(doc_path) / temp_dir).glob("*.docx")):
print(filename)
with ZipFile(filename) as zip_file:
for names in zip_file.namelist():
if names.startswith("word/media/image"):
zip_file.extract(names, doc_path)
os.rename(f"{doc_path}/{names}",
f"{doc_path}/{temp_dir}/imgs/{i}{names[names.find('.'):]}")
print("\t", names, f"{i}{names[names.find('.'):]}")
i += 1
shutil.rmtree(f"{doc_path}/word")
if not os.path.exists(f"{doc_path}/imgs"):
os.mkdir(f"{doc_path}/imgs")
for filename in Path(f"{doc_path}/{temp_dir}/imgs").glob("*"):
file = str(filename)
with Image.open(file) as im:
im.convert('RGB').save(
f"{doc_path}/imgs/{filename.name[:filename.name.find('.')]}.jpg", 'jpeg')
if __name__ == '__main__':
doc_path = r"E:\tmp\答疑整理"
temp_dir = "temp"
word_img_extract(doc_path, temp_dir)
05 GUI图形化工具开发
pip install PySimpleGUI
pip install PySimpleGUI -i https://pypi.tuna.tsinghua.edu.cn/simple
import PySimpleGUI as sg
from word_img_extract import word_img_extract
sg.change_look_and_feel("GreenMono")
layout = [
[
sg.Text("请输入word文档所在的目录:"),
sg.In(size=(25, 1), enable_events=True, key="-FOLDER-"),
sg.FolderBrowse('浏览'),
], [
sg.Button('开始抽取', enable_events=True, key="抽取"),
sg.Text(size=(40, 1), key="-TOUT-")
]
]
window = sg.Window('word文档图片抽取系统', layout)
while True:
event, values = window.read()
if event in (None,):
break # 相当于关闭界面
elif event == "抽取":
if values["-FOLDER-"]:
window["-TOUT-"].update("准备抽取!!!")
sg.popup('抽取期间程序将处于假死状态,请稍等片刻,提取完成后会弹出提示!!!\n点击ok后开始抽取!!!')
window["-TOUT-"].update("正在抽取中...")
word_img_extract(values["-FOLDER-"])
window["-TOUT-"].update("抽取完毕!!!")
sg.popup('抽取完毕!!!')
else:
sg.popup('请先输入word文档所在的路径!!!')
print(f'Event: {event}, values: {values}')
window.close()
06 打包exe
conda create -n gui python=3.6
conda activate gui
pip install PySimpleGUI
pip install pillow
pip install pywin32
pip install pyinstaller
pyinstaller -F --icon=C:\Users\Think\Pictures\ico\ooopic_1467046829.ico word_img_extract_GUI.py
-F 表示生成单个可执行文件 -w 表示去掉控制台窗口,这在GUI界面时非常有用。不过如果是命令行程序的话那就把这个选项删除吧! -p 表示你自己自定义需要加载的类路径,一般情况下用不到 -i 表示可执行文件的图标
pyinstaller -wF --icon=C:\Users\Think\Pictures\ico\ooopic_1467046829.ico word_img_extract_GUI.py
07 给GUI加入进度条
import itertools
import os
import shutil
from pathlib import Path
from zipfile import ZipFile
from PIL import Image
from win32com import client as wc # 导入模块
def word_img_extract(doc_path, temp_dir="temp"):
if os.path.exists(f"{doc_path}/{temp_dir}"):
shutil.rmtree(f"{doc_path}/{temp_dir}")
os.mkdir(f"{doc_path}/{temp_dir}")
word = wc.Dispatch("Word.Application") # 打开word应用程序
try:
files = list(Path(doc_path).glob("*.doc"))
if len(files) == 0:
raise Exception("当前目录中没有word文档")
for i, filename in enumerate(files, 1):
file = str(filename)
dest_name = str(filename.parent / f"{temp_dir}" / str(filename.name)) + "x"
# print(file, dest_name)
doc = word.Documents.Open(file) # 打开word文件
doc.SaveAs(dest_name, 12) # 另存为后缀为".docx"的文件,其中参数12指docx文件
yield "word doc格式转docx格式:", i * 1000 // len(files)
finally:
word.Quit()
if os.path.exists(f"{doc_path}/{temp_dir}/imgs"):
shutil.rmtree(f"{doc_path}/{temp_dir}/imgs")
os.makedirs(f"{doc_path}/{temp_dir}/imgs")
i = 1
files = list(itertools.chain(Path(doc_path).glob("*.docx"), (Path(doc_path) / temp_dir).glob("*.docx")))
for j, filename in enumerate(files, 1):
# print(filename)
with ZipFile(filename) as zip_file:
for names in zip_file.namelist():
if names.startswith("word/media/image"):
zip_file.extract(names, doc_path)
os.rename(f"{doc_path}/{names}",
f"{doc_path}/{temp_dir}/imgs/{i}{names[names.find('.'):]}")
# print("\t", names, f"{i}{names[names.find('.'):]}")
i += 1
yield "word提取图片:", j * 1000 // len(files)
shutil.rmtree(f"{doc_path}/word")
if not os.path.exists(f"{doc_path}/imgs"):
os.mkdir(f"{doc_path}/imgs")
files = list(Path(f"{doc_path}/{temp_dir}/imgs").glob("*"))
for i, filename in enumerate(files, 1):
file = str(filename)
with Image.open(file) as im:
im.convert('RGB').save(
f"{doc_path}/imgs/{filename.name[:filename.name.find('.')]}.jpg", 'jpeg')
yield "图片转换为jpg格式:", i * 1000 // len(files)
if __name__ == '__main__':
doc_path = r"E:\tmp\答疑整理"
for msg, i in word_img_extract(doc_path):
print(f"\r {msg}{i}", end="")
import PySimpleGUI as sg
from word_img_extract import word_img_extract
sg.change_look_and_feel("GreenMono")
layout = [
[
sg.Text("请输入word文档所在的目录:"),
sg.In(size=(25, 1), enable_events=True, key="-FOLDER-"),
sg.FolderBrowse('浏览'),
], [
sg.Button('开始抽取', enable_events=True, key="抽取"),
sg.Text(text_color="red", size=(47, 2), key="error"),
], [
sg.Text("准备:", size=(20, 1), key="-TOUT-"),
sg.ProgressBar(1000, orientation='h', size=(35, 20), key='progressbar')
]
]
window = sg.Window('word文档图片抽取系统', layout)
while True:
event, values = window.read()
if event in (None,):
break # 相当于关闭界面
elif event == "抽取":
if values["-FOLDER-"]:
window["error"].update("")
try:
for msg, i in word_img_extract(values["-FOLDER-"]):
window["-TOUT-"].update(msg)
window['progressbar'].UpdateBar(i)
window["-TOUT-"].update('抽取完毕!!!')
except Exception as e:
window["error"].update(str(e))
else:
sg.popup('请先输入word文档所在的路径!!!')
window.close()
pyinstaller -wF --icon=C:\Users\Think\Pictures\ico\ooopic_1467046829.ico word_img_extract_GUI.py
08 exe下载
评论