You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell导出Excel为PDF:打印机、A3纸张及页眉日期配置问题

解决方案

关键说明

ExportAsFixedFormat 是Excel原生的PDF导出接口,完全不依赖打印机,所以你设置ActivePrinter根本不会生效。如果非要通过指定打印机生成PDF,得换用PrintOut方法,但更推荐直接调整文档页面设置后用ExportAsFixedFormat,速度更快也更稳定。

逐个解决你的问题

1. 设置A3纸张尺寸

Workbook没有PaperSize属性,必须给每个工作表单独配置:

foreach ($sheet in $wb.Worksheets) {
    $sheet.PageSetup.PaperSize = [Microsoft.Office.Interop.Excel.XlPaperSize]::xlPaperA3
}

2. 页眉右上角加当前日期时间

通过工作表的PageSetup.RightHeader属性设置,两种方式可选:

  • 固定生成时的日期时间:
$currentDateTime = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")
foreach ($sheet in $wb.Worksheets) {
    $sheet.PageSetup.RightHeader = $currentDateTime
}
  • 用Excel内置代码,打开PDF时自动显示当前时间(需PDF阅读器支持):
foreach ($sheet in $wb.Worksheets) {
    $sheet.PageSetup.RightHeader = "&D &T"
}

3. 用指定打印机生成PDF(替代ExportAsFixedFormat)

如果必须用你指定的PDFPrint打印机,放弃ExportAsFixedFormat,改用PrintOut:

# 设置目标打印机
$excel.ActivePrinter = "PDFPrint"
# 执行打印(注意:部分第三方PDF打印机需要提前配置默认输出路径,否则可能弹出保存对话框)
$wb.PrintOut()

备注:第三方PDF打印机的路径配置需要看具体软件,有些需要在打印机属性里设默认保存目录,或者用其提供的命令行参数指定。

修改后的完整代码

$filepath = "\\fileppath\file.xlsm"
$fileitem = Get-Item $filepath
$printdate = (Get-Date).ToString("yyyyMMdd")
$currentDateTime = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")

try {
    $excel = New-Object -ComObject Excel.Application
    $excel.Visible = $false
    $excel.DisplayAlerts = $false

    $wb = $excel.Workbooks.Open($fileitem.FullName)

    # 遍历所有工作表,设置A3纸张和页眉
    foreach ($sheet in $wb.Worksheets) {
        $sheet.PageSetup.PaperSize = [Microsoft.Office.Interop.Excel.XlPaperSize]::xlPaperA3
        # 固定日期时间,如需自动更新则替换为下面一行注释内容
        $sheet.PageSetup.RightHeader = $currentDateTime
        # $sheet.PageSetup.RightHeader = "&D &T"
    }

    # 生成PDF保存路径(用Join-Path更规范)
    $pdfpath = Join-Path -Path $fileitem.DirectoryName -ChildPath "$($fileitem.BaseName)_$printdate.pdf"

    # 直接导出PDF(无需打印机)
    $wb.ExportAsFixedFormat([Microsoft.Office.Interop.Excel.XlFixedFormatType]::xlTypePDF, $pdfpath)

    $wb.Close($false)
    $excel.Quit()
}
finally {
    # 释放COM对象,避免Excel进程残留
    $sheet, $wb, $excel | ForEach-Object {
        if ($_ -ne $null) {
            [void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($_)
        }
    }
    # 原代码中的stop-process会终止当前PowerShell进程,建议替换为清理Excel进程
    Get-Process excel -ErrorAction SilentlyContinue | Stop-Process -Force
}

额外提示

  • 如果文件里有隐藏工作表,可加判断if (!$sheet.Visible) { continue }跳过设置。
  • 用ExportAsFixedFormat导出时,若需要更多PDF配置(比如质量、是否包含文档属性),可以添加对应的参数,比如:
$wb.ExportAsFixedFormat(
    [Microsoft.Office.Interop.Excel.XlFixedFormatType]::xlTypePDF,
    $pdfpath,
    [Microsoft.Office.Interop.Excel.XlFixedFormatQuality]::xlQualityStandard,
    $true,  # 是否包含文档属性
    $false, # 是否打印标记
    1,      # 起始页码
    $null,  # 结束页码
    $false, # 是否仅打印活动工作表
    $false  # 忽略打印区域
)

内容的提问来源于stack exchange,提问作者Buschmxnn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 20:25:26