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% pause exit /b 1 ) :: 检查源目录 if not exist "%SOURCE_DIR%" ( call :print_error "源目录不存在!" echo [错误] 请检查路径: %SOURCE_DIR% pause exit /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+=1 set "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+=1 goto :nextfile ) :: 备份原文件 copy "!source_file!" "!BACKUP_DIR!\!filename!_!extension!" >nul echo [备份] 已备份到: !BACKUP_DIR! >> "%LOG_FILE%" :: 转换文件 set retry=0 :retryloop if !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+=1 if !retry! lss %MAX_RETRIES% ( call :print_warning " 转换失败,等待重试..." echo [重试] 第!retry!次失败,等待重试 >> "%LOG_FILE%" type "!temp_output!" >> "%ERROR_FILE%" 2>nul timeout /t 2 /nobreak >nul goto :retryloop ) else ( call :print_error " 转换失败(多次重试后)" echo [失败] !filename!!extension! - 多次尝试后失败 >> "%LOG_FILE%" echo [详情] >> "%ERROR_FILE%" type "!temp_output!" >> "%ERROR_FILE%" 2>nul echo. >> "%ERROR_FILE%" set /a FAILED_FILES+=1 ) ) :: 清理临时文件 del "!temp_output!" 2>nul :nextfile echo. >> "%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>&1 echo [信息] 创建目录: %~1 echo [信息] 创建目录: %~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("转换完成!")
浙公网安备 33010602011771号