Excel COM 对象忽略打印区域
Excel COM object ignores print area
当打开带有 Excel COM 对象的 Excel 工作簿时
app = gencache.EnsureDispatch("Excel.Application")
doc = app.Workbooks.Open(filepath)
所有打印区域都被删除,但当文件正常打开时,可以通过 VBA 访问它们。
本地化版本的 MS Excel 在作为 COM object 访问时忽略打印区域和标题,因此如果需要,必须为每个作品明确指定 PageSetup.PrintArea|PrintTitleColumns|PrintTitleRows
sheet .
for sh in self.doc.Worksheets: #explicitly specify print areas and titles
for name in sh.Names:
if name.Name.endswith("!Print_Area"):
sh.PageSetup.PrintArea = name.RefersTo
elif name.Name.endswith("!Print_Titles"):
#protect comma symbol in sheet name
chunks = name.RefersTo.replace(sheet.Name, "[sheet_name]").split(",")
chunks = [i.replace("[sheet_name]", sheet.Name) for i in chunks]
if len(chunks) == 1:
try: sh.PageSetup.PrintTitleColumns = chunks[0]
except: sh.PageSetup.PrintTitleRows = chunks[0]
else: sh.PageSetup.PrintTitleColumns, sh.PageSetup.PrintTitleRows = chunks
Source: Excel -> PDF (ExportAsFixedFormat)
UPD:支持 sheet 个带逗号的名称
当打开带有 Excel COM 对象的 Excel 工作簿时
app = gencache.EnsureDispatch("Excel.Application")
doc = app.Workbooks.Open(filepath)
所有打印区域都被删除,但当文件正常打开时,可以通过 VBA 访问它们。
本地化版本的 MS Excel 在作为 COM object 访问时忽略打印区域和标题,因此如果需要,必须为每个作品明确指定 PageSetup.PrintArea|PrintTitleColumns|PrintTitleRows
sheet .
for sh in self.doc.Worksheets: #explicitly specify print areas and titles
for name in sh.Names:
if name.Name.endswith("!Print_Area"):
sh.PageSetup.PrintArea = name.RefersTo
elif name.Name.endswith("!Print_Titles"):
#protect comma symbol in sheet name
chunks = name.RefersTo.replace(sheet.Name, "[sheet_name]").split(",")
chunks = [i.replace("[sheet_name]", sheet.Name) for i in chunks]
if len(chunks) == 1:
try: sh.PageSetup.PrintTitleColumns = chunks[0]
except: sh.PageSetup.PrintTitleRows = chunks[0]
else: sh.PageSetup.PrintTitleColumns, sh.PageSetup.PrintTitleRows = chunks
Source: Excel -> PDF (ExportAsFixedFormat)
UPD:支持 sheet 个带逗号的名称