Excel表格指定数据读取写入到另一个Excel表中(指定列指定行)

🤟致敬读者

  • 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉

📘博主相关


文章目录

  • Excel表格指定数据读取写入到另一个Excel表中(指定列指定行)
    • [1. 使用Pandas读取源文件中指定列数据并写入到目标文件指定位置(单列)](#1. 使用Pandas读取源文件中指定列数据并写入到目标文件指定位置(单列))
    • [2. 使用Pandas和openpyxl读取指定列数据写入到目标文件指定位置(单列、保留样式)](#2. 使用Pandas和openpyxl读取指定列数据写入到目标文件指定位置(单列、保留样式))
    • [3. 使用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

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)] = None
    print(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] = value
        print(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

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

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 -> C
    18: 4,   # S -> D
    22: 13,  # W -> M
    23: 15,  # X -> O
    25: 16,  # Z -> P
    26: 17,  # AA -> Q
    27: 58,  # AB -> BF
    28: 19,  # AC -> S
    29: 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}),跳过")
        continue
        
    try:
        source_data = source_df.iloc[source_start_row:, source_col_idx]
        source_data_dict[source_col_idx] = source_data
        valid_column_mapping[source_col_idx] = target_col_idx
        print(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}")
        continue

if 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 + i
        target_col = target_col_idx
        
        cell = 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("数据转移完成!目标文件的原有数据和格式已保留。")

📜文末寄语

  • 🟠关注我,获取更多内容。
  • 🟡技术动态、实战教程、问题解决方案等内容持续更新中。
  • 🟢《全栈知识库》技术交流和分享社区,集结全栈各领域开发者,期待你的加入。
  • 🔵加入开发者的《专属社群》,分享交流,技术之路不再孤独,一起变强。
  • 🟣点击下方名片获取更多内容🍭🍭🍭👇