LibreOffice 批量将.doc文件转换为.docx

一、LibreOffice下载地址

https://zh-cn.libreoffice.org/

二、转换操作

在Windows 11上使用LibreOffice批量将.doc文件转换为.docx,有以下几种方法:

方法一:使用LibreOffice内置功能(图形界面)

  1. 打开LibreOffice

    • 启动LibreOffice Writer

  2. 使用批量转换功能

    • 点击菜单栏的 文件 → 向导 → 文档转换器

    • 选择 "Microsoft Word" 作为源格式

    • 选择 "ODF 文本文档 (.docx)" 作为目标格式

    • 添加要转换的.doc文件

    • 按照向导提示完成转换

方法二:使用命令行批量转换(推荐)

  1. 打开命令提示符或PowerShell

    • 以管理员身份运行

  2. 使用LibreOffice的命令行工具

cd "C:\Program Files\LibreOffice\program"
soffice --headless --convert-to docx --outdir "输出目录路径" "输入文件路径\*.doc"
  1. 示例:

    cd "C:\Program Files\LibreOffice\program"
    soffice --headless --convert-to docx --outdir "D:\converted" "D:\documents\*.doc"

方法三:创建批处理脚本

  1. 创建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("转换完成!")

 

posted on 2025-12-19 15:04  uestc2007  阅读(0)  评论(0)    收藏  举报

导航