用python在只装了wps的电脑上,把文件夹下所有doc转换为docx格式,压缩的内部结构要与正常docx一致


在只安装了WPS的电脑上,可以使用Python的`win32com`模块调用WPS的API来实现doc转docx。以下是完整代码: ```python import os import win32com.client import zipfile import tempfile import shutil def doc_to_docx(input_folder, output_folder): # 初始化WPS应用 wps = win32com.client.Dispatch("Kwps.Application") wps.Visible = False # 不显示WPS界面 # 确保输出文件夹存在 os.makedirs(output_folder, exist_ok=True) # 遍历输入文件夹 for filename in os.listdir(input_folder): if filename.lower().endswith('.doc'): input_path = os.path.join(input_folder, filename) output_path = os.path.join(output_folder, filename + 'x') try: # 打开doc文件 doc = wps.Documents.Open(input_path) # 保存为docx格式 doc.SaveAs(output_path, FileFormat=12) # 12表示docx格式 doc.Close() # 修复WPS生成的docx内部结构 fix_wps_docx(output_path) print(f"转换成功: {filename}") except Exception as e: print(f"转换失败 {filename}: {str(e)}") # 关闭WPS wps.Quit() def fix_wps_docx(docx_path): # 临时文件夹 temp_dir = tempfile.mkdtemp() try: # 解压原始docx with zipfile.ZipFile(docx_path, 'r') as zip_ref: zip_ref.extractall(temp_dir) # 修复content_types.xml content_types_path = os.path.join(temp_dir, '[Content_Types].xml') with open(content_types_path, 'r', encoding='utf-8') as f: content = f.read() # WPS可能会缺少一些内容类型定义 if 'application/vnd.openxmlformats-officedocument.wordprocessingml' not in content: content = content.replace( '</Types>', '<Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/></Types>') with open(content_types_path, 'w', encoding='utf-8') as f: f.write(content) # 重新压缩为标准的docx with zipfile.ZipFile(docx_path, 'w', zipfile.ZIP_DEFLATED) as zipf: for root, dirs, files in os.walk(temp_dir): for file in files: file_path = os.path.join(root, file) arcname = os.path.relpath(file_path, temp_dir) zipf.write(file_path, arcname) finally: # 清理临时文件夹 shutil.rmtree(temp_dir) if __name__ == "__main__": input_folder = r"C:\path\to\your\doc\files" # 替换为你的doc文件夹路径 output_folder = r"C:\path\to\output\folder" # 替换为输出文件夹路径 doc_to_docx(input_folder, output_folder) ``` 代码说明: 1. 使用`win32com`调用WPS的API进行格式转换 2. WPS生成的docx内部结构可能与MS Office不完全一致,代码中包含修复逻辑 3. 转换过程会保留原始文档内容,只调整容器格式 注意事项: 1. 确保电脑已安装WPS Office而非仅WPS文字 2. 需要安装pywin32库:`pip install pywin32` 3. 处理大量文件时,建议分批进行以避免内存问题 4. 转换前最好备份原始文件 [2025-06-04 13:58:03 | AI写代码神器 | 836点数解答]
- // 名片生成脚本 var doc = app.activeDocument; var page = doc.pages[0]; // 设置出血 doc.documentPreferences.documentBleedTop = "3mm"; doc.documentPreferences.documentBleedBottom = "3mm"; // 背景层 var bg = page.rectangles.add(); bg.geometricBounds = ["-3mm", "-3mm", "57mm", "93mm"]; bg.fillColor = doc.colors.add({ colorValue: ["Gradient/003366-006699-45"], gradientStop: [0,50,100] }); // 顶部区块(完整代码详见模板文件) ...(257点数解答 | 2025-02-13 12:48:59)142
- // 名片生成脚本 var doc = app.activeDocument; var page = doc.pages[0]; // 设置出血 doc.documentPreferences.documentBleedTop = "3mm"; doc.documentPreferences.documentBleedBottom = "3mm"; // 背景层 var bg = page.rectangles.add(); bg.geometricBounds = ["-3mm", "-3mm", "57mm", "93mm"]; bg.fillColor = doc.colors.add({ colorValue: ["Gradient/003366-006699-45"], gradientStop: [0,50,100] }); // 顶部区块(完整代码详见模板文件) ...(86点数解答 | 2025-02-13 12:49:37)130
- 帮我写一个批处理文件,内容如下: 1、如果在"参数表.xlsx"a列中的值找到与"文件.txt"中相同的值,则把此行中p=的值改为"参数表.xlsx"中c列对应的值; 2、如果在"参数表.xlsx"a列中的值找到与"文件.txt"中相同的值,则把此行中t=的值改为"参数表.xlsx"中b列对应的值; 3、如果在"参数表.xlsx"a列中的值找到与"文件.txt"中相同的值,则把此行中s=的值改为"参数表.xlsx"中d列对应的值; 如: 参数表.xlsx中a列a1,a2,a3;b列1.5,2,3;c列为10,20,30;d列100,101,102; 文件.txt中的行 1:l p[54:a1] 2000mm/sec cnt100 spot[sd=1,p=25,t=2.0,s=10,ed=1]; 2:l p[57:a2] 2000mm/sec cnt100 spot[sd=1,p=25,t=2.0,s=11,ed=1]; 3:l p[67:a3] 2000mm/sec cnt100 spot[sd=1,p=25,t=2.0,s=12,ed=1]; 文件.txt修改后为 1:l p[54(811点数解答 | 2024-12-05 12:58:37)261
- 帮我写一个批处理文件,内容如下: 1、如果在"参数表.xlsx"a列中的值找到与"文件.txt"中相同的值,则把此行中p=的值改为"参数表.xlsx"中c列对应的值; 2、如果在"参数表.xlsx"a列中的值找到与"文件.txt"中相同的值,则把此行中t=的值改为"参数表.xlsx"中b列对应的值; 3、如果在"参数表.xlsx"a列中的值找到与"文件.txt"中相同的值,则把此行中s=的值改为"参数表.xlsx"中d列对应的值; 参数表.xlsx中a列a1,a2,a3;b列1.5,2,3;c列为10,20,30;d列100,101,102; 文件.txt数据 1:l p[54:a1] 2000mm/sec cnt100 spot[sd=1,p=25,t=2.0,s=10,ed=1]; 2:l p[57:a2] 2000mm/sec cnt100 spot[sd=1,p=25,t=2.0,s=11,ed=1]; 3:l p[67:a3] 2000mm/sec cnt100 spot[sd=1,p=25,t=2.0,s=12,ed=1]; 文件.txt修改后数据 1:l p[54:a1(531点数解答 | 2024-12-05 13:20:42)257
- 帮我写一个批处理文件,内容如下: 1、如果在"参数表.xlsx"a列中的值找到与"文件.txt"中相同的值,则把此行中p=的值改为"参数表.xlsx"中c列对应的值; 2、如果在"参数表.xlsx"a列中的值找到与"文件.txt"中相同的值,则把此行中t=的值改为"参数表.xlsx"中b列对应的值; 3、如果在"参数表.xlsx"a列中的值找到与"文件.txt"中相同的值,则把此行中s=的值改为"参数表.xlsx"中d列对应的值; 参数表.xlsx中a列a1,a2,a3;b列1.5,2,3;c列为10,20,30;d列100,101,102; 文件.txt数据 1:l p[54:a1] 2000mm/sec cnt100 spot[sd=1,p=25,t=2.0,s=10,ed=1]; 2:l p[57:a2] 2000mm/sec cnt100 spot[sd=1,p=25,t=2.0,s=11,ed=1]; 3:l p[67:a3] 2000mm/sec cnt100 spot[sd=1,p=25,t=2.0,s=12,ed=1]; 文件.txt修改后数据 1:l p[54:a1(495点数解答 | 2024-12-05 13:22:26)234
- 题目(description): 卫星导航系统(如我国自主研发的北斗卫星导航系统)能实时获取位置、速度、时间等时空信息,在交通运输、农林渔业、气象测报、通信授时、救灾减灾、公共安全等领域都得到了广泛应用。 在应用层面,卫星导航系统一般以报文方式进行数据传输,其中$gprmc是常用报文之一,基本的格式如下: $gprmc,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh <1> utc时间,hhmmss.sss(时分秒.毫秒)格式 <2> 定位状态,a=有效定位,v=无效定位 <3> 纬度ddmm.mmmm(度分)格式 <4> 纬度半球n(北半球)或s(南半球) <5> 经度dddmm.mmmm(度分)格式 <6> 经度半球e(东经)或w(西经) <7> 地面速率(000.0~999.9节) <8> 地面航向(000.0~359.9度,以正北为参考基准) <9> utc日期,ddmmyy(日月年)格式 <10> 磁偏角(000.0~180.0度,前面的0也(385点数解答 | 2025-01-08 03:43:54)300
- 题目(description): 卫星导航系统(如我国自主研发的北斗卫星导航系统)能实时获取位置、速度、时间等时空信息,在交通运输、农林渔业、气象测报、通信授时、救灾减灾、公共安全等领域都得到了广泛应用。 在应用层面,卫星导航系统一般以报文方式进行数据传输,其中$gprmc是常用报文之一,基本的格式如下: $gprmc,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh <1> utc时间,hhmmss.sss(时分秒.毫秒)格式 <2> 定位状态,a=有效定位,v=无效定位 <3> 纬度ddmm.mmmm(度分)格式 <4> 纬度半球n(北半球)或s(南半球) <5> 经度dddmm.mmmm(度分)格式 <6> 经度半球e(东经)或w(西经) <7> 地面速率(000.0~999.9节) <8> 地面航向(000.0~359.9度,以正北为参考基准) <9> utc日期,ddmmyy(日月年)格式 <10> 磁偏角(000.0~180.0度,前面的0也(346点数解答 | 2025-01-08 03:46:29)296
- var LayerKind = { **ARTOBJECT: 12 }; function toggleSmartObjectLayer() { var targetLayerName = prompt("请输入目标图层名称:"); if (!targetLayerName) { alert("未输入有效的图层名称!"); return; } var doc = app.activeDocument; // 遍历所有图层 for (var i = 0; i < doc.layers.length; i++) { var smartObj = doc.layers[i]; if (smartObj.kind === LayerKind.**ARTOBJECT) { try { smartObj.editContents(); var contents = app.activeDo(650点数解答 | 2025-02-27 17:48:28)147
- c:\python\venv\zzz\scripts\python.exe c:\python\main.py traceback (most recent call last): file "c:\users\意\appdata\local\programs\python\python311\lib\site-packages\urllib3\connection.py", line 199, in _new_conn sock = connection.create_connection( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ file "c:\users\意\appdata\local\programs\python\python311\lib\site-packages\urllib3\util\connection.py", line 85, in create_connection raise err file "c:\users\意\appdata\local\programs\python\pyt(161点数解答 | 2024-10-31 00:39:36)295
- <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>湖南2025届高考物理公式手册</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/docx/7.4.1/docx.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script> <script src="https://cdnjs.cloudflare.(405点数解答 | 2025-05-28 22:10:21)122
- java 压缩 png 格式图片 至指定大小。如:压缩至2m以内(524点数解答 | 2024-02-27 13:54:15)229
- 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过: 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。 返回 k(149点数解答 | 2024-10-08 23:07:36)163