当前位置: 首页 > news >正文

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

📜文末寄语

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

http://www.dtcms.com/a/346416.html

相关文章:

  • 使用配置文件恢复开启Telnet端口(IndivKey方式)
  • 20250822给荣品RD-RK3588开发板刷Rockchip原厂的Android14时点亮荣品的8寸屏
  • 情绪感知+低延迟,声网语音在实战里太稳了
  • WindowsAPI|每天了解几个winAPI接口之网络配置相关文档Iphlpapi.h详细分析八
  • Mixture of Experts Guided by Gaussian Splatters Matters
  • Python 调用 sora_image模型 API 实现图片生成与垫图
  • 判断一个字母是 ​大写字母​ 还是 ​小写字母
  • [RestGPT] OpenAPI规范(OAS)
  • 容器安全实践(一):概念篇 - 从“想当然”到“真相”
  • Go语言延迟初始化(Lazy Initialization)最佳实践指南
  • 通过构建大规模动态神经回路模型,揭示了静息态人脑皮层存在层次结构
  • JCTools 并发无锁链表队列 LinkedQueue
  • 洛谷P3370字符串哈希(集合:Hash表)
  • Ubuntu解决makefile交叉编译的问题
  • 提升用户体验的交互设计实战指南:方法、流程与技巧
  • 在通义灵码中配置MCP服务
  • Linux--进程核心概念
  • 基于SamGeo模型和地图客户端的实时图形边界提取
  • 把 AI 变成「会思考的路灯」——基于自学习能耗模型的智慧路灯杆
  • Open3d:点对点ICP配准,点对面ICP配准
  • 105.QML实现现代Neumorphism风格界面01-Button实现
  • 如何提升科研能力:先停止“无效工作”,开始“有效科研”
  • 第二节阶段WinFrom-5:文件操作
  • 车载诊断架构 --- EOL引起关于DTC检测开始条件的思考
  • Linux822 shell:expect 批量
  • 《C++起源与核心:版本演进+命名空间法》
  • 易基因:Nat Commun/IF15.7:多组学研究揭示UHRF2在原始生殖细胞DNA甲基化重编程中的抗性调控机制
  • 光耦合器:电子世界的 “光桥梁“
  • Opnecv详细介绍
  • 量子计算基础