我尝试使用 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,仍然一点运气都没有。
看起来您提供的 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
因此此时代码将再次中断.