Python 3x win32com:从工作簿中的工作表中复制使用过的单元格

时间:2018-03-26 22:47:58

标签: python excel win32com

我的工作簿中有6张工作表。我想从5个工作表中复制数据(除了标题之外的所有用过的单元格)并将它们粘贴到第1个工作表中。适用的代码片段:

`

excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Open(mergedXL)
wsSIR = wb.Sheets(1)
sheetList = wb.Sheets
for ws in sheetList:
        used = ws.UsedRange
        if ws.Name != "1st sheet":
            print ("Copying cells from "+ws.Name)
            used.Copy()

` used.Copy()将复制所有使用过的单元格,但是我不想要任何工作表中的第一行。我希望能够从每张纸上复印并粘贴到第一张纸的第一个空白行中。因此,当第一张纸上的单元格(不是我要复制的纸张)粘贴在第一张纸上时,它们将从A3开始粘贴。每个后续粘贴都需要在第一个可用空白行中进行。我可能没有很好地解释这个,但是会喜欢一些帮助。 Haven没有和win32com一起工作过。

我也从我的一个旧脚本中获得了这段代码,但我不知道它是如何复制的,以及我如何修改它以便这次为我工作:

ws.Range(ws.Cells(1,1),ws.Cells(ws.UsedRange.Rows.Count,ws.UsedRange.Columns.Count)).Copy()
wsNew.Paste(wsNew.Cells(wsNew.UsedRange.Rows.Count,1))

2 个答案:

答案 0 :(得分:1)

您是否考虑过使用熊猫?

import pandas as pd

# create list of panda dataframes for each sheet (data starts ar E6
dfs=[pd.read_excel("source.xlsx",sheet_name=n,skiprows=5,usecols="E:J") for n in range(0,4)]

# concatenate the dataframes
df=pd.concat(dfs)

# write the dataframe to another spreadsheet
writer = pd.ExcelWriter('merged.xlsx')
df.to_excel(writer,'Sheet1')
writer.save()

答案 1 :(得分:1)

如果我理解你的问题,我认为这段代码可以完成这项工作:

import win32com.client 

# create an instance of Excel
excel = win32com.client.gencache.EnsureDispatch('Excel.Application')

# Open the workbook
file_name = 'path_to_your\file.xlsx'
wb = excel.Workbooks.Open(file_name)
# Select the first sheet on which you want to write your data from the other sheets
ws_paste = wb.Sheets('Sheet1')

# Loop over all the sheets
for ws in wb.Sheets:
    if ws.Name != 'Sheet1': # Not the first sheet
        used_range = ws.UsedRange.SpecialCells(11) # 11 = xlCellTypeLastCell from VBA Range.SpecialCells Method
        # With used_range.Row and used_range.Col you get the number of row and col in your range
        # Copy the Range from the cell A2 to the last row/col
        ws.Range("A2", ws.Cells(used_range.Row, used_range.Column)).Copy()
        # Get the last row used in your first sheet
        # NOTE: +1 to go to the next line to not overlapse
        row_copy = ws_paste.UsedRange.SpecialCells(11).Row + 1
        # Paste on the first sheet starting the first empty row and column A(1)
        ws_paste.Paste(ws_paste.Cells(row_copy, 1))
# Save and close the workbook
wb.Save()
wb.Close()
# Quit excel instance
excel.Quit()

我希望它也可以帮助您理解旧代码。