使用python

时间:2017-03-12 18:06:45

标签: python excel windows printing openpyxl

假设我有一个excel文件excel_file.xlsx,我想使用Python将它发送到我的打印机,所以我使用:

import os
os.startfile('path/to/file','print')

我的问题是,这只打印excel工作簿的第一张,但我想要打印所有的工作表。有没有办法打印整个工作簿?

另外,我使用Openpyxl来创建文件,但它似乎没有任何选项来选择要打印的页数。

非常感谢任何帮助。

5 个答案:

答案 0 :(得分:3)

from xlrd import open_workbook
from openpyxl.reader.excel import load_workbook
import os
import shutil

path_to_workbook = "/Users/username/path/sheet.xlsx"
worksheets_folder = "/Users/username/path/worksheets/"
workbook = open_workbook(path_to_workbook)


def main():

    all_sheet_names = []
    for s in workbook.sheets():
        all_sheet_names.append(s.name)

    for sheet in workbook.sheets():

        if not os.path.exists("worksheets"):
            os.makedirs("worksheets")

        working_sheet = sheet.name

        path_to_new_workbook = worksheets_folder + '{}.xlsx'.format(sheet.name)

        shutil.copyfile(path_to_workbook, path_to_new_workbook)

        nwb = load_workbook(path_to_new_workbook)

        print "working_sheet = " + working_sheet

        for name in all_sheet_names:

            if name != working_sheet:
                nwb.remove_sheet(nwb.get_sheet_by_name(name))

        nwb.save(path_to_new_workbook)

    ws_files = get_file_names(worksheets_folder, ".xlsx")

    # Uncomment print command
    for f in xrange(0, len(ws_files)):
        path_to_file = worksheets_folder + ws_files[f]
        # os.startfile(path_to_file, 'print')
        print 'PRINT: ' + path_to_file

    # remove worksheets folder
    shutil.rmtree(worksheets_folder)


def get_file_names(folder, extension):
    names = []
    for file_name in os.listdir(folder):
        if file_name.endswith(extension):
            names.append(file_name)
    return names


if __name__ == '__main__':
    main()

可能不是最好的方法,但应该有效。 作为一种解决方法,您可以创建单独的.xlsx文件,其中每个文件只有一个电子表格,然后使用os.startfile(path_to_file, 'print')打印它们

答案 1 :(得分:1)

我遇到了这个问题(在Windows上),通过使用pywin32模块和此代码块解决了(在第5行中,您可以指定要打印的图纸。)

    import win32com.client
    o = win32com.client.Dispatch('Excel.Application')
    o.visible = True
    wb = o.Workbooks.Open('/Users/1/Desktop/Sample.xlsx')
    ws = wb.Worksheets([1 ,2 ,3])
    ws.printout()

答案 2 :(得分:0)

你可以在open()命令上嵌入vBa,使用本文中提到的xlsxwriter实用程序将excel文件打印到默认打印机: PBPYthon's Embed vBA in Excel

答案 3 :(得分:0)

事实证明,问题出在Microsoft Excel上, os.startfile只是将文件发送到系统的默认应用程序,用于打开这些文件类型。我只需将默认值更改为另一个应用程序(在我的情况下为WPS Office),问题就解决了。

答案 4 :(得分:0)

似乎您应该能够循环浏览并更改哪个页面处于活动状态。我尝试了一下,它确实打印出了每张纸,但是无论出于何种原因,在第一次打印时它都会将两张纸组合在一起,所以它给了我每个工作簿一个重复的页面。

wb = op.load_workbook(filepath)

for sheet in wb.sheetnames:
    sel_sheet = wb[sheet]


    # find the max row and max column in the sheet
    max_row = sel_sheet.max_row
    max_column = sel_sheet.max_column

    # identify the sheets that have some data in them
    if (max_row > 1) & (max_column > 1):

        # Creating new file for each sheet
        sheet_names = wb.sheetnames
        wb.active = sheet_names.index(sheet)

        wb.save(filepath)
        os.startfile(filepath, "print")