Excel表格指定数据读取写入到另一个Excel表中(指定列指定行)
🤟致敬读者
- 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉
📘博主相关
- 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息
文章目录
- Excel表格指定数据读取写入到另一个Excel表中(指定列指定行)
- 1. 使用Pandas读取源文件中指定列数据并写入到目标文件指定位置(单列)
- 2. 使用Pandas和openpyxl读取指定列数据写入到目标文件指定位置(单列、保留样式)
- 3. 使用Pandas和openpyxl读取指定列数据写入到目标文件指定位置(多列、保留样式)
📃文章前言
- 🔷文章均为学习工作中整理的笔记。
- 🔶如有错误请指正,共同学习进步。
Excel表格指定数据读取写入到另一个Excel表中(指定列指定行)
日常读取excel表格数据使用pandas即可获取数据,当需要从一个excel文件中指定列下的指定行读取数据,并将数据写到另一个文件的指定列指定行位置时,就会略微复杂,下面有三种场景适用
第一种,单独使用pandas读取,读取指定列指定行数据后写入到目标文件指定列指定行中
(但写入后的新文件样式被修改了,且目标文件原来的sheet也会被覆盖)
第二种,适用pandas和openpyxl读取并写入,可以保留样式和目标文件的sheet页数据
(但下面的第二种内容只用于单列的数据读取和写入)
第三种,在第二种的基础上,优化,可读取多列数据写入到目标文件指定位置,当然,目标文件的列数需要与源文件读取的列一一对应
1. 使用Pandas读取源文件中指定列数据并写入到目标文件指定位置(单列)
如下,从源文件中读取A列下第4行开始的数据,然后将数据写入到目标文件的C列,从C列第2行开始写入
代码如下
read_and_write.py
import pandas as pd
import numpy as np# 读取源文件
source_df = pd.read_excel(r"D:\反射\诊断调查问卷.xlsx", sheet_name="Sheet1", header=None)# 读取目标文件
target_df = pd.read_excel(r"D:\反射\DTC填表.xlsx", sheet_name="DTC-输入", header=None)print("源文件数据:")
print(source_df)
print("\n目标文件数据:")
print(target_df)
print("===============================> 666 <===============================")# 只打印前五列数据内容
print("源文件前5列数据:")
print(source_df.iloc[:, :5])
print("\n目标文件前5列数据:")
print(target_df.iloc[:, :5])print("===============================> 666 <===============================")
# 从源文件的A列第4行开始提取数据(索引3)
source_data = source_df.iloc[3:, 0] # 第4行开始,第1列(A列)
print("源数据(A列第4行开始):")
print(source_data)print("===============================> 数据转移 <===============================")
# 确保目标文件有足够行数
required_rows = 2 + len(source_data) # 至少需要:第2行开始的位置(1) + 数据长度
print(f"源数据长度: {len(source_data)}")
print(f"目标文件当前行数: {len(target_df)}")
print(f"需要的行数: {required_rows}")# 如果目标文件行数不足,扩展行数
while len(target_df) < required_rows:# 添加新行new_row = pd.Series([None] * len(target_df.columns) if len(target_df.columns) > 0 else [None])target_df = pd.concat([target_df, new_row.to_frame().T], ignore_index=True)print(f"扩展目标文件,当前行数: {len(target_df)}")# 确保目标文件有足够列数(至少3列才能有C列)
required_cols = 3
print(f"目标文件当前列数: {len(target_df.columns)}")
print(f"需要的列数: {required_cols}")while len(target_df.columns) < required_cols:target_df[len(target_df.columns)] = Noneprint(f"扩展目标文件,当前列数: {len(target_df.columns)}")print("===============================> 执行数据写入 <===============================")
# 将数据写入目标文件的C列(第3列,索引2),从第2行开始(索引1)
for i, (idx, value) in enumerate(source_data.items()):target_row_index = 1 + i # 目标行索引(从第2行开始)target_col_index = 2 # C列索引if target_row_index < len(target_df):target_df.iloc[target_row_index, target_col_index] = valueprint(f"写入数据: 行{target_row_index+1}, 列{chr(65+target_col_index)} = {value}")else:print(f"警告: 无法写入行{target_row_index+1},超出目标文件范围")print("===============================> 更新后的目标文件 <===============================")
print(target_df)# 保存数据到目标文件的指定sheet页, 保留目标文件的原有数据和样式
target_df.to_excel(r"D:\反射\DTC填表.xlsx", index=False, sheet_name="DTC-输入", header=None)print("数据转移完成!")
2. 使用Pandas和openpyxl读取指定列数据写入到目标文件指定位置(单列、保留样式)
第一种方式的弊端是将目标文件的sheet数据全部覆盖了,相当于将读取的数据新生成一个文件,且样式都没了,现在加入openpyxl来保留样式和目标文件的原有sheet数据
如读取A列第4行开始的数据并写到目标文件的C列第2行开始位置
代码如下
read_and_write_2.py
import pandas as pd
import openpyxl# 读取源文件
source_df = pd.read_excel(r"D:\反射\诊断调查问卷.xlsx", sheet_name="Sheet1", header=None)print("源文件数据:")
print(source_df.head(10))# 从源文件的A列第4行开始提取数据(索引3)
source_data = source_df.iloc[3:, 17] # 第4行开始,第1列(A列)
print(f"\n源数据(A列第4行开始),共{len(source_data)}条:")
print(source_data.tolist())# 使用openpyxl加载目标文件以保留格式
target_file = r"D:\反射\DTC填表.xlsx"
wb = openpyxl.load_workbook(target_file)
ws = wb["DTC-输入"]print(f"\n目标工作表加载成功,当前最大行数: {ws.max_row}")# 将数据写入目标文件的C列(列索引3),从第2行开始(行索引2)
print("\n开始数据写入:")
for i, (idx, value) in enumerate(source_data.items()):target_row = 2 + i # 第2行开始 (openpyxl行索引从1开始)target_col = 3 # C列 (openpyxl列索引从1开始,A=1, B=2, C=3)cell = ws.cell(row=target_row, column=target_col, value=value)print(f"写入 {cell.coordinate} = {value}")# 保存文件,保留原有格式
wb.save(target_file)
print(f"\n文件已保存,最大行数: {ws.max_row}")
print("数据转移完成!目标文件的原有数据和格式已保留。")
3. 使用Pandas和openpyxl读取指定列数据写入到目标文件指定位置(多列、保留样式)
在上面代码的基础上,读取多列的数据并写入到目标文件指定列下,列的数量一致,一一对应
如将源文件的R(17), S(18), W(22), X(23), Z(25), AA(26), AB(27), AC(28), AD(29)列下的第4行数据读取并写入到目标文件的C(3), D(4), M(13), O(15), P(16), Q(17), BF(58), S(19), T(20)列下的第二行开始位置
代码如下
read_and_write_3.py
import pandas as pd
import openpyxl
from openpyxl.utils import get_column_letter, column_index_from_string# 读取源文件
source_df = pd.read_excel(r"D:\反射\诊断调查问卷.xlsx", sheet_name="DTC", header=None)print("源文件数据:")
print(source_df.head(10))
print(f"源文件总列数: {len(source_df.columns)}")# 定义源列和目标列的映射关系
# 源列索引: R(17), S(18), W(22), X(23), Z(25), AA(26), AB(27), AC(28), AD(29)
# 目标列索引: C(3), D(4), M(13), O(15), P(16), Q(17), BF(58), S(19), T(20)
column_mapping = {17: 3, # R -> C18: 4, # S -> D22: 13, # W -> M23: 15, # X -> O25: 16, # Z -> P26: 17, # AA -> Q27: 58, # AB -> BF28: 19, # AC -> S29: 20, # AD -> T
}# 列名映射(用于显示)
column_names = {17: 'R', 18: 'S', 22: 'W', 23: 'X', 25: 'Z', 26: 'AA', 27: 'AB', 28: 'AC', 29: 'AD'
}print("\n开始从源文件提取数据:")
source_data_dict = {}# 从源文件的指定列第4行开始提取数据(索引3)
source_start_row = 3 # 第4行开始
max_source_cols = len(source_df.columns)
print(f"源文件最大列索引: {max_source_cols - 1}")valid_column_mapping = {}for source_col_idx, target_col_idx in column_mapping.items():# 检查源列索引是否在有效范围内if source_col_idx >= max_source_cols:print(f"警告: 源文件中不存在 {column_names.get(source_col_idx, f'列{source_col_idx}')} 列 (索引 {source_col_idx}),跳过")continuetry:source_data = source_df.iloc[source_start_row:, source_col_idx]source_data_dict[source_col_idx] = source_datavalid_column_mapping[source_col_idx] = target_col_idxprint(f"源数据({column_names.get(source_col_idx, f'列{source_col_idx}')}列第{source_start_row+1}行开始),共{len(source_data)}条:")print(source_data.tolist()[:5]) # 只显示前5条数据except IndexError as e:print(f"错误: 无法访问源文件的 {column_names.get(source_col_idx, f'列{source_col_idx}')} 列: {e}")continueif not valid_column_mapping:print("错误: 没有有效的列可以处理")exit()# 使用openpyxl加载目标文件以保留格式
target_file = r"D:\反射\DTC填表\DTC填表.xlsx"
wb = openpyxl.load_workbook(target_file)
ws = wb["DTC-输入"]print(f"\n目标工作表加载成功,当前最大行数: {ws.max_row}")# 将数据写入目标文件的指定列,均从第2行开始(行索引2)
target_start_row = 2 # 第2行开始print("\n开始数据写入:")
for source_col_idx, target_col_idx in valid_column_mapping.items():source_data = source_data_dict[source_col_idx]source_col_name = column_names.get(source_col_idx, f'列{source_col_idx}')target_col_name = get_column_letter(target_col_idx)print(f"\n处理 {source_col_name} -> {target_col_name} 的数据转移:")for i, (idx, value) in enumerate(source_data.items()):target_row = target_start_row + itarget_col = target_col_idxcell = ws.cell(row=target_row, column=target_col, value=value)if i < 5: # 只显示前5条写入信息print(f" 写入 {cell.coordinate} = {value}")# 保存文件,保留原有格式
wb.save(target_file)
print(f"\n文件已保存")
print("数据转移完成!目标文件的原有数据和格式已保留。")
📜文末寄语
- 🟠关注我,获取更多内容。
- 🟡技术动态、实战教程、问题解决方案等内容持续更新中。
- 🟢《全栈知识库》技术交流和分享社区,集结全栈各领域开发者,期待你的加入。
- 🔵加入开发者的《专属社群》,分享交流,技术之路不再孤独,一起变强。
- 🟣点击下方名片获取更多内容🍭🍭🍭👇