2013-05-22 1 views
5

Мне нужно написать скрипт python для чтения файлов excel, найти каждый рабочий лист и затем распечатать их в pdf со стандартным формированием, определенным в excel.Печать выбранных рабочих листов в файлах excel в pdf в python

я нашел следующий вопрос How can I open an Excel file in Python? который указал мне http://www.python-excel.org/

Это дает мне возможность найти имена каждого листа.

import xlrd 
book = xlrd.open_workbook("myfile.xls") 
print "Worksheet name(s):", book.sheet_names() 

Это приводит к

Worksheet name(s): [u'Form 5', u'Form 3', u'988172 Adams Road', u'379562 Adams Road', u'32380 Adams Road', u'676422 Alderman Road', u'819631 Appleyard Road', u'280998 Appleyard Road', u'781656 Atkinson Road', u'949461 Barretts Lagoon Road', u'735284 Bilyana Road', u'674784 Bilyana Road', u'490894 Blackman Road', u'721026 Blackman Road'] 

Теперь я хочу, чтобы напечатать каждый лист, который начинается с номером в формате PDF.

Так что я могу

worksheetList=book.sheet_names() 
for worksheet in worksheetList: 
if worksheet.find('Form')!=0: #this just leaves out worksheets with the word 'form' in it 
    <function to print to pdf> book.sheet_by_name(worksheet) #what can I use for this? 

или что-то похожее на то, что выше ... можно использовать для достижения этой цели?

документация XLRD путает это говорит

Возможности форматирования не включены в xlrd версии 0.6.1: Разное листов уровня и элементов книги на уровне, например, печать макета, экран стекла

и

Форматирование

Введение

Этот набор функций, новые в xlrd версии 0.6.1, предназначена для предоставить информацию, необходимую для (1) таблица отображения/рендеринга содержимое (скажем) на экране или в файле PDF

см. https://secure.simplistix.co.uk/svn/xlrd/trunk/xlrd/doc/xlrd.html?p=4966

Что это такое? может ли какой-либо другой пакет использоваться для печати в формате pdf?

Для unix я вижу, что есть http://dag.wieers.com/home-made/unoconv/ что-нибудь для окон? Я нашел https://gist.github.com/mprihoda/2891437, но не могу понять, как его использовать.

+1

Hey @GeorgeC, вы нашли решение для этого? Я ищу способ «распечатать» весь xsl в pdf, поэтому, если вы отправляете свое решение как anwer, будет полезно :) –

+0

@GustavoVargas Я не использовал следующее, так как он не сохраняет форматирование, но xtopdf казалось быть хорошим решением - dancingbison.com/products.html, и разработчик тоже очень помог. – GeorgeC

ответ

3

Это похоже на место, где можно поставить этот ответ.

В простейшей форме:

import win32com.client 

o = win32com.client.Dispatch("Excel.Application") 

o.Visible = False 

wb_path = r'c:\user\desktop\sample.xls' 

wb = o.Workbooks.Open(wb_path) 



ws_index_list = [1,4,5] #say you want to print these sheets 

path_to_pdf = r'C:\user\desktop\sample.pdf' 



wb.WorkSheets(ws_index_list).Select() 

wb.ActiveSheet.ExportAsFixedFormat(0, path_to_pdf) 

Включая немного форматирования магии, которая масштабируется в соответствии с одной страницы и задает область печати:

import win32com.client 

o = win32com.client.Dispatch("Excel.Application") 

o.Visible = False 

wb_path = r'c:\user\desktop\sample.xls' 

wb = o.Workbooks.Open(wb_path) 



ws_index_list = [1,4,5] #say you want to print these sheets 

path_to_pdf = r'C:\user\desktop\sample.pdf' 

print_area = 'A1:G50' 



for index in ws_index_list: 

    #off-by-one so the user can start numbering the worksheets at 1 

    ws = wb.Worksheets[index - 1] 

    ws.PageSetup.Zoom = False 

    ws.PageSetup.FitToPagesTall = 1 

    ws.PageSetup.FitToPagesWide = 1 

    ws.PageSetup.PrintArea = print_area 



wb.WorkSheets(ws_index_list).Select() 

wb.ActiveSheet.ExportAsFixedFormat(0, path_to_pdf) 

Я также начал модуль над GitHub, если вы хотите посмотреть на что: https://github.com/spottedzebra/excel/blob/master/excel_to_pdf.py

+0

Просто добавьте все другие параметры PageSetup: https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.pagesetup_properties.aspx –

+0

Если вкладка имеет несколько областей печати, как определить, что ? – Gavin

+0

Я не уверен, но у меня есть предложение о том, как действовать. Я думаю, вы могли бы добавить несколько переменных «print_area». Таким образом, вы можете сделать следующее: print_area = A1: G50 print_area2 = A52: G52 Вам также может потребоваться дважды прокрутить индекс листа или дважды выполнить код установки страницы кода в цикле for. Это всего лишь идеи. Я на самом деле не пытался распечатать несколько областей печати. – spottedzebra

0

Также вы можете использовать https://www.coolutils.com/TotalExcelConverterXPython

Пример

import win32com.client 
import os.path 

c = win32com.client.Dispatch("ExcelConverter.ExcelConverterX") 

src="C:\\test\\test.xlsx"; 
dest="C:\\test\\test.pdf"; 

c.convert(src, dest, "-c PDF -log c:\\test\\Excel.log"); 

if not os.path.exists(file_path): 
    print(c.ErrorMessage)