提问人:Howdy 提问时间:5/12/2023 最后编辑:Howdy 更新时间:5/12/2023 访问量:226
如何通过 python 从 excel 复制/粘贴合并的单元格?
How do I copy/paste merged cells from excel via python?
问:
我尝试使用 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”的特定工作表中从临时文件夹中的每个文件中复制特定的几个单元格,然后粘贴到名为“Final Financial Report July 7 July 7”的工作表中,该工作表位于 finals 文件夹中的相应文件中。已经尝试并失败了大约 6 个小时。
谢谢
尝试使用 openpyxl 和现在的 pandas,仍然没有运气。
答:
看起来您提供的 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.split(':')[0]
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 被合并为例,在第一行循环中,单元格将是 etc,然后在第二个循环中,第一个单元格将是不存在的,因此此时代码需要确定这一点,否则它将再次中断。
同样的问题也可能以相反的方式发生。如果 D7 是临时工作表中的有效单元格,但合并在最终工作表上(左上角是“D6”),则该行D6, E6, F6
D7
finals_worksheet[cell.coordinate].value = cell.value
也会失败,因为您无法在 Finals 表中写入它。它将返回错误;
AttributeError: 'MergedCell' object attribute 'value' is read-only
评论
interim_data = pd.read_excel(interim_file_path, sheet_name='Financial Report Interim Mar 10', engine='xlrd')
xlrd.biffh.XLRDError: Excel xlsx file; not supported