使用Python将选定的Excel工作表打印为PDF

14

我需要编写一个Python脚本来读取Excel文件,查找每个工作表,然后使用在Excel中定义的标准格式打印到PDF中。

我发现了以下问题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中的新功能,旨在   提供所需的信息,以便在屏幕或PDF文件中显示/呈现电子表格内容

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

哪一个是正确的?还有其他的软件包可以用来打印PDF吗?

对于Unix,我看到有http://dag.wieers.com/home-made/unoconv/,有Windows的吗?我找到了https://gist.github.com/mprihoda/2891437,但还不知道如何使用它。


1
嗨 @GeorgeC,你找到解决方案了吗?我正在寻找一种将整个xsl“打印”到pdf的方法,所以如果你提交你的解决方案作为答案将会很有帮助 :) - Gustavo Vargas
@GustavoVargas 我没有使用以下内容,因为它不能保留格式,但是xtopdf似乎是一个不错的解决方案 - dancingbison.com/products.html,而且开发人员也非常乐于助人。 - GeorgeC
2个回答

34

这似乎是放置此答案的地方。

最简单的形式:

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


1
只需添加所有其他PageSetup选项:https://msdn.microsoft.com/zh-cn/library/microsoft.office.interop.excel.pagesetup_properties.aspx - Kristen G.
如果选项卡有多个打印区域,如何定义? - Gavin
5
你好,因为你使用了库:import win32com.client,所以这似乎是只适用于 Windows 的解决方案。它能在没有安装 Microsoft Office 的 Linux 服务器上运行吗? - Palu
@milowh74 我正在尝试按照 [3, 1, 2] 这样的特定顺序导出表格,但它却按照 1、2、3 的顺序导出。有没有可能限制导出的顺序与列表中的顺序相同? - YasserKhalil
1
@Palu,经过4.5年的时间,似乎仍然没有简单的方法可以在Linux上使用Python将带有漂亮饼图的xlsx文件打印成PDF。 - Kashyap
显示剩余5条评论

0
是的,Kashyap, 我得出结论,在Python中基本上是不可能的。 所以我转而进入JVM语言的领域。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接