LibreOffice 批量将.doc文件转换为.docx
一、LibreOffice下载地址
https://zh-cn.libreoffice.org/
二、转换操作
在Windows 11上使用LibreOffice批量将.doc文件转换为.docx,有以下几种方法:
方法一:使用LibreOffice内置功能(图形界面)
-
打开LibreOffice
-
启动LibreOffice Writer
-
-
使用批量转换功能
-
点击菜单栏的 文件 → 向导 → 文档转换器
-
选择 "Microsoft Word" 作为源格式
-
选择 "ODF 文本文档 (.docx)" 作为目标格式
-
添加要转换的.doc文件
-
按照向导提示完成转换
-
方法二:使用命令行批量转换(推荐)
-
打开命令提示符或PowerShell
-
以管理员身份运行
-
-
使用LibreOffice的命令行工具
cd "C:\Program Files\LibreOffice\program" soffice --headless --convert-to docx --outdir "输出目录路径" "输入文件路径\*.doc"
-
示例:
方法三:创建批处理脚本
-
创建convert.bat文件
@echo off set SOURCE_DIR=C:\你的源文件夹路径 set DEST_DIR=C:\你的目标文件夹路径 set LIBREOFFICE="C:\Program Files\LibreOffice\program\soffice.exe"for %%f in (%SOURCE_DIR%\*.doc) do (echo Converting %%f%LIBREOFFICE% --headless --convert-to docx --outdir "%DEST_DIR%" "%%f" )echo Conversion completed! pause
脚本增强:
@echo off chcp 65001 >nul 2>&1 setlocal enabledelayedexpansion:: ================================ :: 配置区(用户可修改) :: ================================ set "SOURCE_DIR=C:\你的源文件夹路径" set "DEST_DIR=C:\你的目标文件夹路径" set "LIBREOFFICE=C:\Program Files\LibreOffice\program\soffice.exe" set "LOG_DIR=%DEST_DIR%\logs":: 创建带时间戳的文件名 for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a" set "datetime=%dt:~0,4%-%dt:~4,2%-%dt:~6,2%_%dt:~8,2%-%dt:~10,2%-%dt:~12,2%" set "LOG_FILE=%LOG_DIR%\conversion_%datetime%.log" set "ERROR_FILE=%LOG_DIR%\errors_%datetime%.log" set "SUMMARY_FILE=%LOG_DIR%\summary_%datetime%.txt" set "BACKUP_DIR=%DEST_DIR%\backup_%datetime%"set MAX_RETRIES=3 set TIMEOUT_SECONDS=30:: ================================ :: 初始化 :: ================================ call :print_header "文档批量转换工具" echo [信息] 启动时间: %date% %time% echo.:: 检查LibreOffice if not exist "%LIBREOFFICE%" (call :print_error "未找到LibreOffice!"echo [错误] 请检查路径: %LIBREOFFICE%pauseexit /b 1 ):: 检查源目录 if not exist "%SOURCE_DIR%" (call :print_error "源目录不存在!"echo [错误] 请检查路径: %SOURCE_DIR%pauseexit /b 1 ):: 创建目录结构 call :create_directory "%DEST_DIR%" call :create_directory "%LOG_DIR%" call :create_directory "%BACKUP_DIR%":: 初始化日志文件 echo ========================================= > "%LOG_FILE%" echo 文档转换日志 - %datetime% >> "%LOG_FILE%" echo ========================================= >> "%LOG_FILE%" echo 源目录: %SOURCE_DIR% >> "%LOG_FILE%" echo 目标目录: %DEST_DIR% >> "%LOG_FILE%" echo LibreOffice路径: %LIBREOFFICE% >> "%LOG_FILE%" echo ========================================= >> "%LOG_FILE%" echo. >> "%LOG_FILE%":: ================================ :: 主转换流程 :: ================================ call :print_section "开始文件扫描" echo [信息] 扫描目录: %SOURCE_DIR% echo.set TOTAL_FILES=0 set CONVERTED_FILES=0 set FAILED_FILES=0 set SKIPPED_FILES=0:: 创建文件列表数组 set file_count=0 for %%f in ("%SOURCE_DIR%\*.doc" "%SOURCE_DIR%\*.doc?") do (set /a file_count+=1set "file_!file_count!=%%f"set "name_!file_count!=%%~nf"set "ext_!file_count!=%%~xf" )set TOTAL_FILES=%file_count% echo [信息] 找到 %TOTAL_FILES% 个待处理文件 echo [信息] 找到 %TOTAL_FILES% 个待处理文件 >> "%LOG_FILE%"if %TOTAL_FILES% equ 0 (call :print_warning "未找到任何待处理的文档文件!"goto :generate_report )echo. call :print_section "开始文档转换":: 处理每个文件 for /l %%i in (1,1,%file_count%) do (set "source_file=!file_%%i!"set "filename=!name_%%i!"set "extension=!ext_%%i!"set "dest_file=%DEST_DIR%\!filename!.docx"call :print_progress %%i %TOTAL_FILES% "处理: !filename!!extension!"echo [进度] %%i/%TOTAL_FILES% - 处理: !filename!!extension! >> "%LOG_FILE%":: 检查是否已存在if exist "!dest_file!" (call :print_warning " 目标文件已存在,跳过"echo [跳过] !filename!!extension! - 目标文件已存在 >> "%LOG_FILE%"set /a SKIPPED_FILES+=1goto :nextfile):: 备份原文件copy "!source_file!" "!BACKUP_DIR!\!filename!_!extension!" >nulecho [备份] 已备份到: !BACKUP_DIR! >> "%LOG_FILE%":: 转换文件set retry=0:retryloopif !retry! equ 0 (echo [转换] 正在转换文件...) else (echo [重试] 第!retry!/%MAX_RETRIES%次重试...):: 执行转换(重定向输出到临时文件)set "temp_output=%TEMP%\libre_temp_%random%.txt""%LIBREOFFICE%" --headless --convert-to docx --outdir "%DEST_DIR%" "!source_file!" > "!temp_output!" 2>&1:: 检查结果if exist "!dest_file!" (call :print_success " 转换成功: !filename!.docx"echo [成功] 已创建: !filename!.docx >> "%LOG_FILE%"set /a CONVERTED_FILES+=1:: 记录转换详情type "!temp_output!" >> "%LOG_FILE%" 2>nul) else (set /a retry+=1if !retry! lss %MAX_RETRIES% (call :print_warning " 转换失败,等待重试..."echo [重试] 第!retry!次失败,等待重试 >> "%LOG_FILE%"type "!temp_output!" >> "%ERROR_FILE%" 2>nultimeout /t 2 /nobreak >nulgoto :retryloop) else (call :print_error " 转换失败(多次重试后)"echo [失败] !filename!!extension! - 多次尝试后失败 >> "%LOG_FILE%"echo [详情] >> "%ERROR_FILE%"type "!temp_output!" >> "%ERROR_FILE%" 2>nulecho. >> "%ERROR_FILE%"set /a FAILED_FILES+=1)):: 清理临时文件del "!temp_output!" 2>nul:nextfileecho. >> "%LOG_FILE%"echo. ):: ================================ :: 生成报告 :: ================================ :generate_report call :print_section "转换完成" echo.:: 屏幕输出报告 echo ════════════════════════════════════════ echo 转换报告 echo ════════════════════════════════════════ echo 总文件数: %TOTAL_FILES% echo 成功转换: %CONVERTED_FILES% echo 转换失败: %FAILED_FILES% echo 跳过文件: %SKIPPED_FILES% echo ════════════════════════════════════════ echo.:: 日志文件报告 echo. >> "%LOG_FILE%" echo ========================================= >> "%LOG_FILE%" echo 转换完成报告 - %date% %time% >> "%LOG_FILE%" echo ========================================= >> "%LOG_FILE%" echo 总文件数: %TOTAL_FILES% >> "%LOG_FILE%" echo 成功转换: %CONVERTED_FILES% >> "%LOG_FILE%" echo 转换失败: %FAILED_FILES% >> "%LOG_FILE%" echo 跳过文件: %SKIPPED_FILES% >> "%LOG_FILE%" echo 备份目录: %BACKUP_DIR% >> "%LOG_FILE%" echo 日志文件: %LOG_FILE% >> "%LOG_FILE%" if exist "%ERROR_FILE%" (echo 错误日志: %ERROR_FILE% >> "%LOG_FILE%" ) echo ========================================= >> "%LOG_FILE%":: 生成单独的摘要文件 ( echo 文档转换摘要报告 echo 生成时间: %date% %time% echo. echo 源目录: %SOURCE_DIR% echo 目标目录: %DEST_DIR% echo 处理时间: %datetime% echo. echo ┌─────────────────────────────────────┐ echo │ 统计信息 │ echo ├─────────────────────────────────────┤ echo │ 总文件数: %TOTAL_FILES% │ echo │ 成功转换: %CONVERTED_FILES% │ echo │ 转换失败: %FAILED_FILES% │ echo │ 跳过文件: %SKIPPED_FILES% │ echo └─────────────────────────────────────┘ echo. if %FAILED_FILES% gtr 0 (echo 注意: 有 %FAILED_FILES% 个文件转换失败echo 请查看错误日志: %ERROR_FILE%echo. ) echo 备份文件保存在: %BACKUP_DIR% echo 详细日志: %LOG_FILE% ) > "%SUMMARY_FILE%":: 显示文件位置 echo [信息] 详细日志: %LOG_FILE% if exist "%ERROR_FILE%" (if %FAILED_FILES% gtr 0 (echo [警告] 有 %FAILED_FILES% 个文件失败,查看: %ERROR_FILE%) ) echo [信息] 摘要报告: %SUMMARY_FILE% echo [信息] 备份目录: %BACKUP_DIR% echo.:: 显示失败文件列表(如果有) if %FAILED_FILES% gtr 0 and exist "%ERROR_FILE%" (call :print_section "失败文件列表"type "%ERROR_FILE%"echo. )pause exit /b 0:: ================================ :: 函数定义 :: ================================:print_header echo ╔═══════════════════════════════════════╗ echo ║ %~1 ║ echo ╚═══════════════════════════════════════╝ exit /b:print_section echo. echo ════════════════════════════════════════ echo %~1 echo ════════════════════════════════════════ exit /b:print_progress setlocal set current=%~1 set total=%~2 set message=%~3 set /a percent=(current * 100) / total set "progress=" for /l %%i in (1,1,20) do (if %%i leq !percent! (set "progress=!progress!█") else (set "progress=!progress!░") ) echo [进度] [!percent!%%] !progress! !message! endlocal exit /b:print_success echo [成功] %~1 exit /b:print_warning echo [警告] %~1 exit /b:print_error echo [错误] %~1 exit /b:create_directory if not exist "%~1" (mkdir "%~1" >nul 2>&1echo [信息] 创建目录: %~1echo [信息] 创建目录: %~1 >> "%LOG_FILE%" ) exit /b
方法四:使用Python脚本
import os import subprocess import glob# 配置路径 libreoffice_path = r"C:\Program Files\LibreOffice\program\soffice.exe" source_folder = r"D:\documents" output_folder = r"D:\converted"# 确保输出目录存在 os.makedirs(output_folder, exist_ok=True)# 获取所有.doc文件 doc_files = glob.glob(os.path.join(source_folder, "*.doc"))for doc_file in doc_files:print(f"正在转换: {doc_file}")subprocess.run([libreoffice_path,"--headless","--convert-to", "docx","--outdir", output_folder,doc_file])print("转换完成!")