Print Excel workbook using python

此生再无相见时 提交于 2019-12-08 07:04:35

问题


Suppose I have an excel file excel_file.xlsx and i want to send it to my printer using Python so I use:

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

My problem is that this only prints the first sheet of the excel workbook but i want all the sheets printed. Is there any way to print the entire workbook?

Also, I used Openpyxl to create the file, but it doesn't seem to have any option to select the number of sheets for printing.

Any help would be greatly appreciated.


回答1:


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()

probably not the best approach, but it should work. As a workaround you can create separate .xlsx files where each has only one spreadsheet and then print them with os.startfile(path_to_file, 'print')




回答2:


you could embed vBa on open() command to print the excel file to a default printer using xlsxwriter's utility mentioned in this article: PBPYthon's Embed vBA in Excel




回答3:


Turns out, the problem was with Microsoft Excel, os.startfile just sends the file to the system's default app used to open those file types. I just had to change the default to another app (WPS Office in my case) and the problem was solved.




回答4:


Seems like you should be able to just loop through and change which page is active. I tried this and it did print out every sheet, BUT for whatever reason on the first print it grouped together two sheets, so it gave me one duplicate page for each workbook.

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")


来源:https://stackoverflow.com/questions/42751142/print-excel-workbook-using-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!