1、背景
客户政府行业,文档多为 doc 格式且数量比较多,目前 MaxKB 支持 docx 格式文档导入,一个个改太麻烦,通过 Python 脚本批量转换为 MaxKB 兼容的 docx 格式。
2、实现方式
import os
import sys
import time
from win32com import client as wc
from tqdm import tqdm # 用于显示进度条,可选
def doc_to_docx(input_path, output_path):
"""将单个doc文件转换为docx格式"""
word = None
try:
time.sleep(1) # 跑太快,word报错,时间可调整
word = wc.Dispatch("Word.Application")
word.Visible = False # 后台运行
word.DisplayAlerts = False # 关闭警告
doc = word.Documents.Open(os.path.abspath(input_path))
doc.SaveAs(os.path.abspath(output_path), 16) # 16表示docx格式
return True
except Exception as e:
print(f"转换错误: {e}")
return False
finally:
if word:
doc.Close()
word.Quit()
def batch_convert_doc_to_docx(directory):
"""批量转换目录下的所有doc文件为docx"""
directory = os.path.abspath(directory)
if not os.path.exists(directory):
print(f"错误:目录不存在 - {directory}")
return
# 获取目录下所有doc文件(包括子目录)
doc_files = []
for root, _, files in os.walk(directory):
for file in files:
if file.lower().endswith('.doc'):
doc_files.append(os.path.join(root, file))
if not doc_files:
print("该目录下未找到.doc文件")
return
print(f"找到 {len(doc_files)} 个.doc文件,开始转换...")
# 创建输出目录(如果不存在)
output_dir = os.path.join(directory, "docx_files")
os.makedirs(output_dir, exist_ok=True)
# 转换统计
success_count = 0
fail_count = 0
# 转换每个文件
for input_path in tqdm(doc_files, desc="转换进度"):
try:
# 保持原始目录结构
rel_path = os.path.relpath(os.path.dirname(input_path), directory)
output_subdir = os.path.join(output_dir, rel_path)
os.makedirs(output_subdir, exist_ok=True)
# 生成输出路径
filename = os.path.basename(input_path)
output_filename = os.path.splitext(filename)[0] + ".docx"
output_path = os.path.join(output_subdir, output_filename)
# 转换文件
if doc_to_docx(input_path, output_path):
success_count += 1
else:
fail_count += 1
print(f"转换失败: {filename}")
except Exception as e:
fail_count += 1
print(f"\n处理 {filename} 时出错: {e}")
print(f"\n转换完成! 成功: {success_count}, 失败: {fail_count}")
print(f"结果已保存到: {output_dir}")
if __name__ == "__main__":
# 获取用户输入或使用当前目录
if len(sys.argv) > 1:
directory = sys.argv[1]
else:
directory = input("请输入文档目录路径: ").strip('"')
batch_convert_doc_to_docx(directory)