Print Excel workbook using python

前端 未结 5 1551
小鲜肉
小鲜肉 2021-01-03 12:36

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\',         


        
相关标签:
5条回答
  • 2021-01-03 13:15
    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')

    0 讨论(0)
  • 2021-01-03 13:19

    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

    0 讨论(0)
  • 2021-01-03 13:24

    I have had this issue(on windows) and it was solved by using pywin32 module and this code block(in line 5 you can specify the sheets you want to print.)

        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()
    
    0 讨论(0)
  • 2021-01-03 13:32

    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")
    
    0 讨论(0)
  • 2021-01-03 13:40

    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.

    0 讨论(0)
提交回复
热议问题