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
相关产品推荐
相关产品推荐

