如何使用Xlwings & Python合并同一Excel工作簿中的所有工作表

djp7away  于 2022-11-19  发布在  Python
关注(0)|答案(2)|浏览(425)

我试图合并所有的工作表在同一个Excel工作簿使用Xlwings如果有人可以请建议如何做到这一点?
下面的代码能够获取所有工作表并将它们合并到一个创建的输出文件中,但工作表选项卡保持分离而不是合并。

import xlwings as xw
import glob
import sys

folder = sys.argv[1]
inputFile = sys.argv[2]
outputFile = sys.argv[3]

path = r""+folder+""

excel_files = glob.glob(path + "*" + inputFile + "*")   
with xw.App(visible=False) as app:
    combined_wb = app.books.add()
    for excel_file in excel_files:
        print(excel_file)
        wb = app.books.open(excel_file)
        for sheet in wb.sheets:
            sheet.copy(after=combined_wb.sheets[0])
        wb.close()
    combined_wb.sheets[0].delete()
    combined_wb.save(outputFile)
    combined_wb.close()
63lcw9qa

63lcw9qa1#

更新**
更新了示例代码。
路径中每个工作簿的每个工作表中的数据都将粘贴到创建的合并工作簿中的默认工作表。每个工作簿的内容都由 'row_separation' 行分隔。
工作簿中的每个工作表都将从列“A”开始粘贴到合并工作表中,并以 'col_separation' 列分隔。
您需要确定将每个原始工作表粘贴到组合Excel文件中Sheet 1的位置。
注:此复制/粘贴还应包括数据样式,如字体名称、颜色、大小和格式。

row_separation = 100
col_separation = 20

row = 1
with xw.App(visible=False) as app:
    combined_wb = app.books.add()
    for excel_file in excel_files:
        col = 1
        print("Reading Excel file: " + excel_file)
        wb = app.books.open(excel_file)
        for sheet in wb.sheets:
            ws = wb.sheets[sheet]
            wb_name = str(wb.name)
            sheet_name = str(sheet.name)
            print("Extracting data from " + wb_name + "-" + sheet_name)
            combined_wb.sheets[0].range(row, col).value = 'Data from Workbook: ' + wb_name + ' Sheet: ' + sheet_name
            combined_wb.sheets[0].range(row, col).font.bold = True
            ws.used_range.copy()
            combined_wb.sheets[0].range(row+1, col).paste(paste='all')
            col += col_separation
        wb.close()
        row += row_separation
    combined_wb.save(outputFile)
    combined_wb.close()

来自3个工作簿示例工作表,工作簿1有2个工作表,工作簿2有3个工作表,工作簿3有1个工作表显示时,行分隔设置为10,列分隔设置为8
答案2 --------------------------------------------------------------
从相同的工作簿中选择相同的工作表,并作为单独的工作表添加到combined_wb中。

with xw.App(visible=False) as app:
    combined_wb = app.books.add()
    first_sheet = combined_wb.sheets[0]
    for excel_file in excel_files:
        col = 1
        print("Reading Excel file: " + excel_file)
        wb = app.books.open(excel_file)
        for sheet in wb.sheets:
            ws = wb.sheets[sheet]
            wb_name = str(wb.name)
            sheet_name = str(sheet.name)
            print("Extracting Sheet from " + wb_name + "-" + sheet_name)

            ws.api.Copy(After=first_sheet.api)
            first_sheet = combined_wb.sheets[sheet_name]

        wb.close()
    # combined_wb.sheets[0].delete()  # Delete initial Sheet1 if not required 
    combined_wb.save(outputFile)
    combined_wb.close()

isr3a4wc

isr3a4wc2#

您可以在工作表上循环,并在used_range的范围对象上使用索引,例如used_range[-1:,:],以将工作表定位在输出工作簿或更确切地说是输出工作表中。

import xlwings as xw

path_input = r"test.xlsx"
path_save = r"result.xlsx"

with xw.App(visible=False) as app:
    wb_init = xw.Book(path_input)
    wb_res = xw.Book()
    ws_res = wb_res.sheets[0]

    for ws in wb_init.sheets:
        ws.used_range.copy()
        ws_res.used_range[-1:,:].offset(row_offset=1).paste()
    ws_res["1:1"].delete() # This is just to delete the first row, which is empty.
    wb_res.save(path_save)
    wb_res.close(); wb_init.close()

数据示例

假设Excel工作簿有三个工作表。
工作表1:
| 一种|B| C语言|
| - -|- -|- -|
| 浮|取芯|瓦尔|
| 棒|格拉|插头|
| 巴兹|乌尔特|某某|
| 曲|层|星期四|
工作表2:
| U形|v型|w型|X射线|Y形|Z轴|
| - -|- -|- -|- -|- -|- -|
| 十二|九十二|八十六|二十二个||八十|
| 二十三个|二十九人||七十四||二十一个|
| 十六|10个|七十五|六十七|六十一|九十九|
工作表3:
| 一个|第二章|第三章|第四章|
| - -|- -|- -|- -|
| 一个|五个|九个|一个|
| 2个|六个|第0页|六个|
| 三个|七个||三个|
| 四个|八个|2个|第0页|
最终输出(即wb_res):
| 一种|B| C语言||||
| - -|- -|- -|- -|- -|- -|
| 浮|取芯|瓦尔||||
| 棒|格拉|插头||||
| 巴兹|乌尔特|某某||||
| 曲|层|星期四||||
| U形|v型|w型|X射线|Y形|Z轴|
| 十二|九十二|八十六|二十二个||八十|
| 二十三个|二十九人||七十四||二十一个|
| 十六|10个|七十五|六十七|六十一|九十九|
| 一个|第二章|第三章|第四章|||
| 一个|五个|九个|一个|||
| 2个|六个|第0页|六个|||
| 三个|七个||三个|||
| 四个|八个|2个|第0页|||

相关问题