2013-05-22 7 views
5

Ho bisogno di scrivere uno script python per leggere i file excel, trovare ogni foglio di lavoro e poi stamparli in pdf con la formattazione standard definita in excel.Stampa i fogli di lavoro scelti nei file excel in pdf in python

ho trovato la seguente questione How can I open an Excel file in Python? che mi ha segnalato http://www.python-excel.org/

Questo mi dà la possibilità di trovare i nomi di ogni foglio di lavoro.

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

Questo si traduce in

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'] 

Ora voglio stampare ogni foglio di lavoro, che inizia con un numero a un PDF.

così posso

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? 

o qualcosa di simile al precedente ... quello che posso usare per raggiungere questo obiettivo?

La documentazione XLRD è fonte di confusione si dice

formattazione non funzioni incluse nella versione 0.6.1 XLRD: Varie foglio di livello e gli elementi a livello di libro per esempio layout di stampa, lastre di vetro dello schermo

e

Formattazione

Introduzione

Questa raccolta di funzionalità, nuovi in ​​XLRD versione 0.6.1, ha lo scopo di fornire le informazioni necessarie per (1) visualizza/visualizza il foglio di calcolo contenuto (ad esempio) su uno schermo o in un file PDF

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

Qual è il vero? è possibile utilizzare un altro pacchetto per stampare in pdf?

Per unix vedo che c'è http://dag.wieers.com/home-made/unoconv/ qualcosa per Windows? Ho trovato https://gist.github.com/mprihoda/2891437 ma non riesco a capire come usarlo ancora.

+1

Ehi @GeorgeC, hai trovato una soluzione per questo? Sto cercando un modo per "stampare" un intero xsl in pdf, quindi se invii la tua soluzione come anwer sarà utile :) –

+0

@GustavoVargas Non ho usato quanto segue in quanto non mantiene la formattazione ma xtopdf sembrava per essere una soluzione ok - dancingbison.com/products.html e lo sviluppatore è stato di grande aiuto. – GeorgeC

risposta

3

Questo sembra il posto dove mettere questa risposta.

Nella forma più semplice:

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) 

Compreso un po 'di magia di formattazione in grado di scalare per adattarsi a una singola pagina e imposta l'area di stampa:

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) 

Ho anche iniziato un modulo nel corso di un github se si vuole guardare quella: https://github.com/spottedzebra/excel/blob/master/excel_to_pdf.py

+0

Semplicemente aggiungendo tutte le altre opzioni PageSetup: https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.pagesetup_properties.aspx –

+0

Se la scheda ha più aree di stampa, come definirlo ? – Gavin

+0

Non sono sicuro, ma ho un suggerimento su come procedere. Penso che potresti aggiungere più variabili "print_area". Quindi è possibile effettuare le seguenti operazioni: area_stampante = A1: G50 area_stampa2 = A52: G52 Potrebbe anche essere necessario scorrere l'indice del foglio due volte o eseguire due volte il bit di impostazione pagina del codice nel ciclo for. Queste sono solo idee. In realtà non ho provato a stampare più aree di stampa. – spottedzebra

0

Inoltre è possibile utilizzare https://www.coolutils.com/TotalExcelConverterXPython

Esempio

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)