为什么无法在未打开 RDP 连接的情况下 Python 在 VM 上设置 Excel 打印区域?
Why can't Python set the Excel print area on a VM without open RDP connection?
我正在尝试使用 win32com
打印 Excel sheet。如果我有 运行 开启的 VM 的远程桌面连接,这会正常工作,但如果我断开连接,任务就会失败。
我遇到了两个相关错误:
1) 设置打印区域Excel:
- 已连接到 VM:文件按预期打印
- 未连接:文件打印但未设置打印区域,因此溢出到多页
2) 未设置打印区域,但使用 Python
设置了 PageSetup
- 已连接到 VM:文件按预期打印
- 未连接:文件打印失败,出现 1004 错误 "Unable to set the PaperSize property of the PageSetup class"
有关此错误的其他问题表明缺少打印机驱动程序,但对我来说并非如此,因为当我通过 RDP 连接到 VM 时它打印正常。
这是我为 Excel 包装的 class:
from pathlib import Path
import pythoncom
import win32com.client
from utils.excel.constants import XLQUALITY_STANDARD
from utils.excel.constants impor
class ExcelApp:
def __init__(self, is_visible=False):
pythoncom.CoInitialize()
excel = win32com.client.Dispatch("Excel.Application")
excel.Visible = is_visible
self.app = excel
def __getattr__(self, item):
return getattr(self.app, item)
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, exc_traceback):
self.app.Quit()
def open(self, path):
path = self._regularise_path(path)
return self.app.Workbooks.Open(path)
def _regularise_path(self, path):
path = str(Path(path).absolute())
if ":\" not in path:
path = path.replace(":", ":\")
return path
def close(self, wb, prompt=False):
wb.Close(prompt)
def save_as_pdf(
self,
wb,
sheets,
path,
quality=XLQUALITY_STANDARD,
include_doc_properties=False,
ignore_print_areas=False,
page_setup=None,
):
page_setup = page_setup or {}
path = self._regularise_path(path)
wb.WorkSheets(sheets).Select()
for prop, val in page_setup.items():
setattr(wb.ActiveSheet.PageSetup, prop, val)
wb.ActiveSheet.ExportAsFixedFormat(XLTYPE_PDF, path, quality, include_doc_properties, ignore_print_areas)
调用代码:
page_setup = {"Zoom": False, "FitToPagesTall": 1, "FitToPagesWide": 1, "PaperSize": XLPAPER_TABLOID}
with ExcelApp() as excel:
wb = excel.open(src)
excel.save_as_pdf(wb, sheets, dst, page_setup=page_setup)
问题的可能来源
如果您的计算机上没有选择 默认 打印机,就会出现此问题。 Excel 无法设置或获取页面设置属性。
可能的解决方案
因此,确保脚本是 运行 一个帐户:
- 至少 设置了一台打印机。
- 设置了默认打印机 - 这是必须的!
相关:
- Unable to set the PaperSize property of the PageSetup class
我正在尝试使用 win32com
打印 Excel sheet。如果我有 运行 开启的 VM 的远程桌面连接,这会正常工作,但如果我断开连接,任务就会失败。
我遇到了两个相关错误:
1) 设置打印区域Excel:
- 已连接到 VM:文件按预期打印
- 未连接:文件打印但未设置打印区域,因此溢出到多页
2) 未设置打印区域,但使用 Python
设置了 PageSetup- 已连接到 VM:文件按预期打印
- 未连接:文件打印失败,出现 1004 错误 "Unable to set the PaperSize property of the PageSetup class"
有关此错误的其他问题表明缺少打印机驱动程序,但对我来说并非如此,因为当我通过 RDP 连接到 VM 时它打印正常。
这是我为 Excel 包装的 class:
from pathlib import Path
import pythoncom
import win32com.client
from utils.excel.constants import XLQUALITY_STANDARD
from utils.excel.constants impor
class ExcelApp:
def __init__(self, is_visible=False):
pythoncom.CoInitialize()
excel = win32com.client.Dispatch("Excel.Application")
excel.Visible = is_visible
self.app = excel
def __getattr__(self, item):
return getattr(self.app, item)
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, exc_traceback):
self.app.Quit()
def open(self, path):
path = self._regularise_path(path)
return self.app.Workbooks.Open(path)
def _regularise_path(self, path):
path = str(Path(path).absolute())
if ":\" not in path:
path = path.replace(":", ":\")
return path
def close(self, wb, prompt=False):
wb.Close(prompt)
def save_as_pdf(
self,
wb,
sheets,
path,
quality=XLQUALITY_STANDARD,
include_doc_properties=False,
ignore_print_areas=False,
page_setup=None,
):
page_setup = page_setup or {}
path = self._regularise_path(path)
wb.WorkSheets(sheets).Select()
for prop, val in page_setup.items():
setattr(wb.ActiveSheet.PageSetup, prop, val)
wb.ActiveSheet.ExportAsFixedFormat(XLTYPE_PDF, path, quality, include_doc_properties, ignore_print_areas)
调用代码:
page_setup = {"Zoom": False, "FitToPagesTall": 1, "FitToPagesWide": 1, "PaperSize": XLPAPER_TABLOID}
with ExcelApp() as excel:
wb = excel.open(src)
excel.save_as_pdf(wb, sheets, dst, page_setup=page_setup)
问题的可能来源
如果您的计算机上没有选择 默认 打印机,就会出现此问题。 Excel 无法设置或获取页面设置属性。
可能的解决方案
因此,确保脚本是 运行 一个帐户:
- 至少 设置了一台打印机。
- 设置了默认打印机 - 这是必须的!
相关:
- Unable to set the PaperSize property of the PageSetup class