PhpSpreadsheet导出丢失打印纸张槽设置,求PHP/PowerShell解决办法
问题描述
我使用PhpSpreadsheet官方文档的代码加载Excel模板并导出文件:
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load('template.xlsx'); $worksheet = $spreadsheet->getActiveSheet(); $worksheet->getCell('A1')->setValue('John'); $worksheet->getCell('A2')->setValue('Smith'); $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xls'); $writer->save('write.xls');
原模板已为打印机设置了特定纸张类型,可直接打印无需调整,但使用上述代码导出后,该设置丢失,打印机默认纸张槽被启用,导致以下PowerShell打印代码无法直接执行,必须手动调整纸张类型:
Param ( [string]$name ) $xl = New-Object -ComObject Excel.Application $xl.Visible = $false $filename = "C:\somepath\" + $name + ".xlsx" $wb = $xl.Workbooks.Open($filename) $ws = $wb.WorkSheets.Item(1) $ws.PrintOut() $xl.quit()
需要通过PHP或PowerShell解决纸张设置丢失的问题。
方案一:PHP(PhpSpreadsheet)端保留纸张设置
1. 改用Xlsx格式导出
问题根源在于Xls(Excel 97-2003)格式对打印参数的支持有限,换成Xlsx格式导出可完整保留模板中的打印设置:
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load('template.xlsx'); $worksheet = $spreadsheet->getActiveSheet(); $worksheet->getCell('A1')->setValue('John'); $worksheet->getCell('A2')->setValue('Smith'); # 切换为Xlsx格式写入 $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx'); $writer->save('write.xlsx');
2. 手动指定纸张类型(兜底方案)
若改用Xlsx后仍存在问题,可手动设置纸张类型匹配模板参数:
# 获取工作表打印设置对象 $printSetup = $worksheet->getPageSetup(); # 设置标准纸张大小,例如A4 $printSetup->setPaperSize(\PhpOffice\PhpSpreadsheet\Worksheet\PageSetup::PAPERSIZE_A4); # 若模板使用自定义纸张尺寸,可按如下设置(单位:毫米) # $printSetup->setPaperSize(\PhpOffice\PhpSpreadsheet\Worksheet\PageSetup::PAPERSIZE_CUSTOM); # $printSetup->setPaperWidth(210); # $printSetup->setPaperHeight(297);
方案二:PowerShell端强制设置纸张类型
如果PHP端修改受限,可在打印脚本中直接指定纸张类型,绕过文件本身的设置问题:
Param ( [string]$name ) $xl = New-Object -ComObject Excel.Application $xl.Visible = $false $filename = "C:\somepath\" + $name + ".xlsx" $wb = $xl.Workbooks.Open($filename) $ws = $wb.WorkSheets.Item(1) # 设置纸张类型,例如A4(Excel常量5对应A4) $ws.PageSetup.PaperSize = 5 # 若使用自定义纸张,需先设置为自定义模式再指定尺寸(单位:英寸) # $ws.PageSetup.PaperSize = 0 # $ws.PageSetup.PaperWidth = 8.27 # $ws.PageSetup.PaperHeight = 11.69 $ws.PrintOut() $xl.quit() # 清理COM对象,避免进程残留 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ws) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($wb) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl) | Out-Null Remove-Variable xl
常用Excel纸张类型常量:
- 5 = A4
- 1 = Letter(美式信纸)
- 9 = Legal(美式法律纸)
- 0 = 自定义尺寸
内容的提问来源于stack exchange,提问作者Ansgar Burmann
相关产品推荐
相关产品推荐

