如何通过 python 从 excel 复制/粘贴合并的单元格?

问题描述 投票:0回答:1

我尝试使用 openpyxl 并遇到了很多麻烦,现在我正在尝试使用 pandas 并获得大量的回溯。似乎复制粘贴合并的单元格很难而且非常具体,或者我只是一个笨蛋。任何人都可以提供提示或解决方案吗?

这是我的熊猫代码

import os
import pandas as pd

# Set the paths for the interim and finals folders
interim_folder = r'C:\Users\Jake_\Downloads\Code\Interims'
finals_folder = r'C:\Users\Jake_\Downloads\Code\Finals'

# Get a list of all files in the interim folder
interim_files = os.listdir(interim_folder)

# Iterate over each file in the interim folder
for file_name in interim_files:
    # Check if the file is an Excel file
    if file_name.endswith('.xlsx'):
        interim_file_path = os.path.join(interim_folder, file_name)
        finals_file_path = os.path.join(finals_folder, file_name)

        # Read the interim Excel file using pandas with the xlrd engine
        interim_data = pd.read_excel(interim_file_path, sheet_name='Financial Report Interim Mar 10', engine='xlrd')

        # Copy the required data to a new DataFrame
        finals_data = pd.DataFrame()
        finals_data['Column B'] = interim_data.iloc[3:8, 1]  # Copy B4:B8
        finals_data['Column D'] = interim_data.iloc[5:201, 3]  # Copy D6:D200
        finals_data['Column E'] = interim_data.iloc[5:201, 4]  # Copy E6:E200
        finals_data['Column F'] = interim_data.iloc[5:201, 5]  # Copy F6:F200
        finals_data['Column G'] = interim_data.iloc[5:201, 6]  # Copy G6:G200

        # Write the data to the finals Excel file
        writer = pd.ExcelWriter(finals_file_path, engine='openpyxl')
        finals_data.to_excel(writer, sheet_name='Final Financial Report July 7', index=False)
        writer.save()

这是我得到的回溯

我想做什么:我在一个名为 interims 的文件夹中有大约 100 个文件 - 每个文件都有一个对应的文件,与一个名为 finals 的文件夹同名。我想从临时文件夹中的每个文件中复制名为“Financial Report Interim Mar 10”的特定工作表中的特定几个单元格,然后粘贴到 finals 文件夹中相应文件中名为“Final Financial Report July 7”的工作表中.已经尝试并失败了大约 6 个小时。

谢谢

尝试使用 openpyxl 和现在的 pandas,仍然一点运气都没有。

python python-3.x pandas python-2.7 openpyxl
1个回答
0
投票

看起来您提供的 excel 工作簿是正在写入的工作簿,即“最终”工作表,所以不确定临时工作表是什么样的。
但是要解决 Openpyxl 中的实际问题,只能使用您提供的回溯代码;

Traceback (most recent call last):
  File "C:\Users\Jake_\Downloads\step5.py", line 34, in <module>
    merged_range = interim_worksheet.merged_cells[cell.coordinate]
TypeError: 'MultiCellRange' object is not subscriptable

您想获取合并单元格的左上角单元格。无法直接从合并单元格中获取的,更改该部分

for cell in row:
    if cell.coordinate in interim_worksheet.merged_cells:
        merged_range = interim_worksheet.merged_cells[cell.coordinate]
        top_left_cell = merged_range.split(':')[0]
        finals_worksheet[cell.coordinate].value = interim_worksheet[top_left_cell].value
    else:

像这样

for cell in row:
    if cell.coordinate in interim_worksheet.merged_cells:
        top_left_cell = ''
        for item in interim_worksheet.merged_cells.ranges:
            top_left_cell = item.coord[:2]
        finals_worksheet[cell.coordinate].value = interim_worksheet[top_left_cell].value
else:

在上面的代码示例中,如果单元格 D6 和 D7 合并,则

top_left_cell
将是
'D6'
.

但是正如主循环的评论中所指出的那样;

for row in interim_worksheet.iter_rows(min_row=6, max_row=200, min_col=4, max_col=7):
    for cell in row:

您将尝试处理不存在的单元格。使用合并单元格 D6 和 D7 的示例,在第一行循环中,单元格将是

D6, E6, F6
等,然后在第二个循环中,第一个单元格将是不存在的
D7
因此此时代码将再次中断.

© www.soinside.com 2019 - 2024. All rights reserved.