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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:43:19