2017-02-22 10 views
0

Я пытаюсь преобразовать таблицу первенствовать в формате PDF, которая работает со следующим кодом:Excel Преобразование PDF в альбомной ориентации

xlApp = client.Dispatch("Excel.Application") 
    books = xlApp.Workbooks.Open('Table.xlsx') 
    ws = books.Worksheets[0] 
    ws.Visible = 1 
    ws.ExportAsFixedFormat(0, 'Table.pdf') 
    books.Save() 
    books.Close() 

Единственная проблема в том, что мне нужна таблица, чтобы быть в альбомной ориентации и I я не понимаю, как это сделать.

Я видел решения с кодом, например ws.PageSetup.Orientation = xlLandscape, или некоторые его варианты, но я считаю, что это работает только в VBA/Я не могу найти правильный синтаксис для python.

Любая помощь или идеи будут высоко оценены.

ответ

0

Хорошо, мне удалось взломать код, который делает то, что я изначально задавал. Я уверен, что есть лучший способ сделать это, но для тех, кто застрял в одной и той же проблеме, это может помочь.

Я закончил «сохранение как» существующего файла .xlsx в качестве нового файла с расширением макроса и ввода макроса, созданного в python. Код VBA позволяет изменять файл в альбомном режиме, а затем экспортировать в формате PDF. После выполнения макроса я удаляю файл .xlsm. Оператор try в конце предотвращает возникновение ошибки, если приложение excel еще не закрылось.

# Save as pdf 
# Start excel application 
xlApp = client.Dispatch("Excel.Application") 
# Open the table previously created 
books = xlApp.Workbooks.Open('Table.xlsx')) 

# xlmodule allows for insertion of VBA code which we will use to change orientation and save as pdf 
xlmodule = books.VBProject.VBComponents.Add(1) 
# VBACode is the VBA code used, sub ... is the name of the macro 
VBACode = '''Sub PDF_Creation() 
     With Worksheets("Overlap Matrix").PageSetup 
      .Orientation = xlLandscape 
      .Zoom = False 
      .FitToPagesWide = 1 
      .FitToPagesTall = 1 
     End With 

     Worksheets("Overlap Matrix").ExportAsFixedFormat _ 
       Type:=xlTypePDF, _ 
       Filename:="C:/.../PDF_test.pdf", _ 
       Quality:=xlQualityStandard, _ 
       IncludeDocProperties:=True, _ 
       IgnorePrintAreas:=False, _ 
       OpenAfterPublish:=True 
     End Sub''' 
# Now we add the VBA code as a macro to the excel sheet 
xlmodule.CodeModule.AddFromString(VBACode) 

# To use the VBA code we must first save the file as xlsm -> FileFormat 52 denotes xlsm 
books.SaveAs('Table', FileFormat=52) 
# Close the book so that we can reopen it as a macro enabled file 
books.Close() 

# Open the newly created xlsm file 
xlApp.Workbooks.Open(Filename='Table.xlsm', ReadOnly=1) 
# Run the macro 
xlApp.Application.Run('Table.xlsm!PDF_Creation') 

# Quit the application 
xlApp.Application.Quit() 
# Delete the macro file, we still have the file without macros as a backup 
# Use while loop to continue trying till we actually quit the excel application 
file_deleted = False 
while file_deleted is False: 
    try: 
     os.remove('Table.xlsm') 
     file_deleted = True 
    except WindowsError: 
     sleep(0.5) 
1

Более легкий подход должен был бы изменить ориентацию перед печатью:

def print_excel_worksheet_to_pdf(i_sz_excel_path, i_sz_ws_name, i_sz_pdf_path): 
excel = win32.gencache.EnsureDispatch('Excel.Application') 

excel.Visible = False #Keep the excel sheet closed 
excel.DisplayAlerts = False #"Do you want to over write it?" Will not Pop up 

try: 
    wb_source = excel.Workbooks.Open(i_sz_excel_path) 

    ws_source = wb_source.Worksheets(i_sz_ws_name) 
    ws_source.PageSetup.Orientation = 2 # change orientation to landscape 
    ws_source.Select() 

    wb_source.ActiveSheet.ExportAsFixedFormat(0, i_sz_pdf_path) 
except Exception as e: 
    print(e) 

excel.Application.Quit() 

До тех пор, пока вы не сохраните изменения, это не влияет на исходный файл, и устраняет необходимость временные файлы с макросами vbscript

Смежные вопросы