吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 317|回复: 18
上一主题 下一主题
收起左侧

[其他原创] powershell 批量转换文件夹下word/excel文档为pdf格式

[复制链接]
跳转到指定楼层
楼主
axelia 发表于 2024-11-21 14:37 回帖奖励
本帖最后由 axelia 于 2024-11-21 14:39 编辑

看论坛里也有很多使用python写的,不过因为大部分场景都是win环境,还要装python环境和库,Windows下powershell都是自带的,使用比较方便,写了一个脚本,用来将文件夹下word、excel文件转pdf(excel多个sheet的时候,使用文件名_sheet分开转为pdf )

直接贴代码了,使用的时候修改下工作目录路径就行了


# 设置工作目录
$directory = "C:\\test2"

# 设置日志文件
$logFile = "C:\test2\conversion_log.txt"

# 函数:记录日志
function Log-Message {
    param (
        [string]$message
    )
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    Add-Content -Path $logFile -Value "$timestamp - $message"
}

# 检查文件是否存在
function Check-FileExists {
    param (
        [string]$filePath
    )
    if (-Not (Test-Path -Path $filePath)) {
        Log-Message "File does not exist: $filePath"
        return $false
    }
    return $true
}

# 清理 COM 对象
function Cleanup-ComObjects {
    param (
        [object[]]$comObjects
    )
    foreach ($comObject in $comObjects) {
        if ($comObject -ne $null) {
            try {
                [System.Runtime.Interopservices.Marshal]::ReleaseComObject($comObject) | Out-Null
            }
            catch {
                Log-Message "Error releasing COM object: $_"
            }
        }
    }
    [gc]::Collect()
    [gc]::WaitForPendingFinalizers()
}

# 遍历目录中的所有文件
Get-ChildItem -Path $directory -Recurse | Where-Object { $_.PSIsContainer -eq $false } | ForEach-Object {
    # 获取文件扩展名
    $extension = $_.Extension.ToLower()
    # 获取文件全路径
    $filePath = $_.FullName
    # 获取文件的基本名称和目录
    $fileBaseName = $_.BaseName
    $fileDirectory = $_.Directory.FullName
    # 记录文件路径
    Log-Message "Processing file: $filePath"
    # 定义输出路径
    $outputPath = Join-Path $_.directory ($_.BaseName + ".pdf")

    # 加载Word和Excel COM对象
    $wordApp = $null
    $excelApp = $null

    try {
        $wordApp = New-Object -ComObject Word.Application
        $excelApp = New-Object -ComObject Excel.Application

        # 禁用 Word 提示
        $wordApp.DisplayAlerts = $false
        # 禁用 Excel 提示
        $excelApp.DisplayAlerts = $false

        # 根据文件类型进行处理
        switch ($extension) {
            '.doc' {
                if (Check-FileExists -filePath $filePath) {
                    # 打开Word文档并保存为PDF
                    $document = $wordApp.Documents.Open($filePath)
                    $document.SaveAs($outputPath, 17) # 17是wdFormatPDF
                    $document.Close()
                    Log-Message "Converted $filePath to PDF successfully."
                }
            }
            '.docx' {
                if (Check-FileExists -filePath $filePath) {
                    # 同上
                    $document = $wordApp.Documents.Open($filePath)
                    $document.SaveAs($outputPath, 17)
                    $document.Close()
                    Log-Message "Converted $filePath to PDF successfully."
                }
            }
            '.xls' {
                if (Check-FileExists -filePath $filePath) {
                    # 打开Excel工作簿
                    $workbook = $excelApp.Workbooks.Open($filePath)
                    foreach ($worksheet in $workbook.Worksheets) {
                        $sheetName = $worksheet.Name
                        $outputPath = Join-Path $fileDirectory ($fileBaseName + "_" + $sheetName + ".pdf")

                        # 设置页面布局
                        $worksheet.PageSetup.Zoom = $false
                        $worksheet.PageSetup.FitToPagesWide = 1
                        $worksheet.PageSetup.FitToPagesTall = 1
                        $worksheet.PageSetup.PaperSize = 9
                        $worksheet.PageSetup.LeftMargin = $excelApp.InchesToPoints(0.75)
                        $worksheet.PageSetup.RightMargin = $excelApp.InchesToPoints(0.75)
                        $worksheet.PageSetup.TopMargin = $excelApp.InchesToPoints(1)
                        $worksheet.PageSetup.BottomMargin = $excelApp.InchesToPoints(1)
                        $worksheet.PageSetup.Orientation = 2

                        # 导出单个工作表为PDF
                        $worksheet.ExportAsFixedFormat(0, $outputPath) # 0是xlTypePDF
                        Log-Message "Converted sheet '$sheetName' from $filePath to PDF successfully."
                    }
                    $workbook.Close()
                }
            }
            '.xlsx' {
                if (Check-FileExists -filePath $filePath) {
                    # 打开Excel工作簿
                    $workbook = $excelApp.Workbooks.Open($filePath)
                    foreach ($worksheet in $workbook.Worksheets) {
                        $sheetName = $worksheet.Name
                        $outputPath = Join-Path $fileDirectory ($fileBaseName + "_" + $sheetName + ".pdf")

                        # 设置页面布局
                        $worksheet.PageSetup.Zoom = $false
                        $worksheet.PageSetup.FitToPagesWide = 1
                        $worksheet.PageSetup.FitToPagesTall = 1
                        $worksheet.PageSetup.PaperSize = 9
                        $worksheet.PageSetup.LeftMargin = $excelApp.InchesToPoints(0.75)
                        $worksheet.PageSetup.RightMargin = $excelApp.InchesToPoints(0.75)
                        $worksheet.PageSetup.TopMargin = $excelApp.InchesToPoints(1)
                        $worksheet.PageSetup.BottomMargin = $excelApp.InchesToPoints(1)
                        $worksheet.PageSetup.Orientation = 2

                        # 导出单个工作表为PDF
                        $worksheet.ExportAsFixedFormat(0, $outputPath) # 0是xlTypePDF
                        Log-Message "Converted sheet '$sheetName' from $filePath to PDF successfully."
                    }
                    $workbook.Close()
                }
            }
        }
    }
    catch {
        Log-Message "Error converting $filePath : $_"
    }
    finally {
        # 关闭应用程序
        if ($wordApp -ne $null) {
            $wordApp.Quit()
        }
        if ($excelApp -ne $null) {
            $excelApp.Quit()
        }

        # 清理 COM 对象
        Cleanup-ComObjects @($wordApp, $excelApp)
    }
}

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
indobe + 1 + 1 我很赞同!
Huo7471 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
anbanke 发表于 2024-11-21 15:30
感谢博主分享
推荐
那年夏天52 发表于 2024-11-21 15:01
3#
HuskyHappy 发表于 2024-11-21 15:08
.docx : 设置“DisplayAlerts”时发生异常:“无法将值“False”转换为类型“Microsoft.Office.Interop.Word.WdAlertLevel”。错误:“从“System.Boolean”到“Microsoft.Office.Interop.Word.WdAlertLevel”的强制转换无效。””

这个是什么错误,大佬
4#
 楼主| axelia 发表于 2024-11-21 15:11 |楼主
HuskyHappy 发表于 2024-11-21 15:08
.docx : 设置“DisplayAlerts”时发生异常:“无法将值“False”转换为类型“Microsoft.Office.Interop.Word ...

       # 禁用 Word 提示
        $wordApp.DisplayAlerts = $false


这一行,你试试先关掉全部word文档,然后再试试,还报错就注释掉这一行先
5#
wj阿斗 发表于 2024-11-21 15:12
一看就是相当巴适
6#
爱学习的小妖精 发表于 2024-11-21 15:15
学到了这波,超赞感谢博主分享
8#
markChenZhiWei 发表于 2024-11-21 15:58
感谢分享
9#
稻海香 发表于 2024-11-21 16:04
这个造福大家,感谢
10#
xiaotuyun 发表于 2024-11-21 16:05
博主,你好,这个是直接运行就可以吗,需要装python环境之类的么
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-21 20:07

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表