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

python Excel操作,将一个工作表中的sheet页复制到另一个工作表中(包括单元格的内容、样式、格式等)

 使用内存中的文件对象

  1. 将数据写入内存中的 Excel 文件

  2. 将内存中的文件保存到指定路径

原理:

pd.ExcelWriter() 本身创建的是一个 ExcelWriter 对象,它可以将多个 DataFrame 写入同一个 Excel 文件。你可以通过指定文件对象(如 BytesIO)来将数据写入内存中的文件,最后通过 save() 方法保存到实际的文件系统中。

代码示例:

import pandas as pd
import io# 示例数据
data = {'Column1': [1, 2, 3], 'Column2': ['A', 'B', 'C']}
df = pd.DataFrame(data)# 创建一个内存中的文件对象
excel_buffer = io.BytesIO()# 使用 ExcelWriter 将数据写入内存中的文件对象
with pd.ExcelWriter(excel_buffer, engine="xlsxwriter") as writer:df.to_excel(writer, index=False, sheet_name='Sheet1')# 将内存中的文件对象保存到指定的文件路径
result_path = "C:\\path\\to\\save"
time_now = "2025-05-15"
file_path = f"{result_path}\\Result_{time_now}.xlsx"# 将内存中的数据保存到实际文件
with open(file_path, "wb") as f:f.write(excel_buffer.getvalue())

解释:

  1. excel_buffer = io.BytesIO(): 使用 BytesIO 创建一个内存中的文件对象,这样数据就不会立即写入磁盘,而是写入内存。

  2. with pd.ExcelWriter(excel_buffer, engine="xlsxwriter") as writer:: 使用 ExcelWriter 将数据写入内存中的 excel_buffer

  3. excel_buffer.getvalue(): 获取内存中存储的 Excel 数据。

  4. with open(file_path, "wb") as f:: 使用二进制模式将内存中的数据保存到指定路径的实际文件。

总结:

通过这种方式,你可以先将数据写入内存中的 Excel 文件,之后再将其保存到实际的文件路径。这样可以避免文件写入的过程中直接操作磁盘,提高灵活性。

使用xlwings

使用 xlwings 库来实现将一个工作表中的 sheet 完全复制到另一个工作表中。以下是一个示例代码:

import xlwings as xw# 打开Excel应用
app = xw.App(visible=True)# 打开源文件和目标文件
source_workbook = app.books.open('源文件.xlsx')  # 源文件路径
destination_workbook = app.books.open('目标文件.xlsx')  # 目标文件路径# 获取源工作表和目标工作表
source_sheet = source_workbook.sheets['源工作表名称']  # 源工作表名称
destination_sheet = destination_workbook.sheets['目标工作表名称']  # 目标工作表名称# 复制源工作表到目标工作表
source_sheet.api.Copy(After=destination_sheet.api)# 保存并关闭
destination_workbook.save()
source_workbook.close()
destination_workbook.close()# 退出Excel应用
app.quit()

代码解析:

  1. xw.App(visible=True) 打开 Excel 应用并设置为可见。
  2. source_workbook.sheets['源工作表名称'] 和 destination_workbook.sheets['目标工作表名称'] 分别获取源工作簿和目标工作簿中的工作表。
  3. source_sheet.api.Copy(After=destination_sheet.api) 复制源工作表到目标工作表后面。
  4. destination_workbook.save() 保存目标工作簿。
  5. source_workbook.close() 和 destination_workbook.close() 关闭源工作簿和目标工作簿。
  6. app.quit() 退出 Excel 应用。

请根据实际文件路径和工作表名称进行修改。

 

 使用xlwings将一个工作表中的sheet页中的某部分单元格一次完全复制到另一个工作表中

要使用 xlwings 将一个工作表中的部分单元格复制到另一个工作表,你可以通过指定单元格区域进行复制。以下是一个示例代码,展示如何复制源工作表中某部分的单元格到目标工作表中:

import xlwings as xw# 打开Excel应用
app = xw.App(visible=True)# 打开源文件和目标文件
source_workbook = app.books.open('源文件.xlsx')  # 源文件路径
destination_workbook = app.books.open('目标文件.xlsx')  # 目标文件路径# 获取源工作表和目标工作表
source_sheet = source_workbook.sheets['源工作表名称']  # 源工作表名称
destination_sheet = destination_workbook.sheets['目标工作表名称']  # 目标工作表名称# 指定源工作表中需要复制的单元格区域
source_range = source_sheet.range('A1:C10')  # 复制 A1 到 C10 区域# 复制内容到目标工作表中的指定区域
destination_sheet.range('A1').value = source_range.value  # 从目标工作表的 A1 开始粘贴# 保存并关闭
destination_workbook.save()
source_workbook.close()
destination_workbook.close()# 退出Excel应用
app.quit()

代码解析:

  1. xw.App(visible=True):打开 Excel 应用并设置为可见。
  2. source_workbook.sheets['源工作表名称'] 和 destination_workbook.sheets['目标工作表名称']:分别获取源工作簿和目标工作簿中的工作表。
  3. source_range = source_sheet.range('A1:C10'):指定源工作表中需要复制的单元格区域,这里是 A1 到 C10 区域。
  4. destination_sheet.range('A1').value = source_range.value:将源工作表中选定区域的内容复制到目标工作表的 A1 单元格开始的位置。
  5. destination_workbook.save():保存目标工作簿。
  6. source_workbook.close() 和 destination_workbook.close():关闭源工作簿和目标工作簿。
  7. app.quit():退出 Excel 应用。

你可以根据需要调整复制的单元格区域(例如更改 A1:C10)和目标位置。

xlwings 启用无头模式

xlwings 中,xw.App.headless = True 是用来启用无头模式的,它可以使 Excel 在后台运行而不会显示图形界面。但是,启用无头模式后,Excel 仍然会在后台启动,而不是完全阻止打开 Excel。

为了防止 xlwings 在启动时自动打开 Excel,我们需要确保在 xw.App() 实例化时,Excel 应用程序处于不可见的状态。headless = True 可以确保 Excel 在后台运行,但并不能完全阻止启动 Excel。

如果你希望不打开 Excel 窗口且不自动启动 Excel,可以通过设置 visible=False 来实现,确保 Excel 在后台运行。

示例代码:

import xlwings as xw# 启动 Excel 应用程序,设置为无头模式,且 Excel 不可见
app = xw.App(visible=False, add_book=False)# 执行需要的操作(如打开工作簿)
workbook = app.books.open('your_workbook.xlsx')# 在这里你可以进行数据处理操作
sheet = workbook.sheets['Sheet1']
data = sheet.range('A1').value
print(data)# 保存并关闭工作簿
workbook.save('your_workbook_modified.xlsx')
workbook.close()# 退出 Excel 应用程序
app.quit()

代码解释:

  1. xw.App(visible=False, add_book=False)

    • visible=False:设置为不可见,Excel 不会弹出任何界面。
    • add_book=False:防止 xlwings 自动创建一个新的工作簿。这意味着 Excel 在启动时不会创建一个默认的空白工作簿,这可以防止不必要的工作簿打开。
  2. 打开和操作工作簿:正常通过 app.books.open() 打开工作簿并进行所需的操作。

  3. 退出和关闭 Excel:在操作完成后,使用 app.quit() 退出 Excel 应用程序。

这样,你就可以确保在无头模式下,Excel 不会自动显示并且不会打开任何空的工作簿,所有操作都在后台执行

使用openpyxl

openpyxl 中,复制一个工作表到另一个工作表并不是一个直接提供的功能。不过,如果你想要将一个工作表完全复制到另一个工作表(包括单元格的内容、样式、格式等),可以通过手动逐个复制每个单元格的所有内容的方式来完成。以下是实现该操作的代码示例:

from openpyxl import load_workbook
from copy import copy# 加载原始工作簿
wb = load_workbook('original_workbook.xlsx')# 获取原工作表
source_sheet = wb['Sheet1']  # 替换为你要复制的工作表名称# 创建新工作表
new_sheet = wb.create_sheet('CopiedSheet')  # 新工作表名称# 复制单元格内容
for row in source_sheet.iter_rows():for cell in row:new_sheet[cell.coordinate].value = cell.value# 复制单元格样式
for row in source_sheet.iter_rows():for cell in row:new_sheet[cell.coordinate].font = copy(cell.font)new_sheet[cell.coordinate].border = copy(cell.border)new_sheet[cell.coordinate].fill = copy(cell.fill)new_sheet[cell.coordinate].number_format = copy(cell.number_format)new_sheet[cell.coordinate].alignment = copy(cell.alignment)new_sheet[cell.coordinate].protection = copy(cell.protection)# 保存修改后的工作簿
wb.save('modified_workbook.xlsx')

代码解析:

  1. 加载工作簿:使用 load_workbook 打开原始 Excel 文件。
  2. 获取源工作表:通过 wb['Sheet1'] 获取原工作表,替换 'Sheet1' 为你实际的工作表名称。
  3. 创建新工作表:使用 create_sheet 创建一个新的工作表,命名为 'CopiedSheet'
  4. 复制单元格内容:使用 iter_rows() 遍历源工作表中的每一行,复制单元格的内容。
  5. 复制单元格样式:除了内容,还通过复制每个单元格的样式(如字体、边框、填充色、数字格式、对齐方式和保护设置)来保持原始样式。
  6. 保存工作簿:将修改后的工作簿保存为新的文件 'modified_workbook.xlsx'

这种方法能够在一定程度上完整地复制源工作表的内容和样式,但需要注意的是,它并不能完全复制工作表的所有高级设置(如图表、图像等)。如果你需要复制图表或其他对象,你可能需要借助其他工具或库。

使用xlsxwriter

使用 xlsxwriter 直接复制一个工作表的整个内容和格式到另一个工作表是比较困难的,因为 xlsxwriter 主要用于创建和写入新的 Excel 文件,并且不支持直接读取和修改现有的 Excel 文件。因此,它不能像 openpyxl 那样直接读取和复制一个已存在工作簿中的工作表。

然而,如果你希望使用 xlsxwriter 将一个工作表的内容完全复制到另一个工作表,你可以先使用 openpyxl 来读取原始工作表的内容和格式,然后使用 xlsxwriter 将其写入到新的工作簿中。

以下是使用 openpyxl 读取源工作表并使用 xlsxwriter 将内容和格式写入新工作簿的步骤:

代码示例:

import openpyxl
import xlsxwriter
from copy import copy# 加载原始工作簿
wb = openpyxl.load_workbook('original_workbook.xlsx')# 获取源工作表
source_sheet = wb['Sheet1']  # 替换为你要复制的工作表名称# 创建一个新的工作簿并添加一个工作表
workbook = xlsxwriter.Workbook('new_workbook.xlsx')
new_sheet = workbook.add_worksheet('CopiedSheet')# 复制源工作表的单元格内容到新工作表
for row in source_sheet.iter_rows():for cell in row:new_sheet.write(cell.row - 1, cell.column - 1, cell.value)# 复制源工作表的单元格格式到新工作表
for row in source_sheet.iter_rows():for cell in row:# 获取原始单元格的格式(字体、颜色、对齐方式等)cell_format = workbook.add_format({'bold': cell.font.bold,'italic': cell.font.italic,'underline': cell.font.underline,'font_color': cell.font.color,'bg_color': cell.fill.start_color.rgb,'align': 'center' if cell.alignment.horizontal == 'center' else 'left','valign': 'vcenter' if cell.alignment.vertical == 'center' else 'top',})new_sheet.write(cell.row - 1, cell.column - 1, cell.value, cell_format)# 保存新的工作簿
workbook.close()

代码解析:

  1. 加载源工作簿:使用 openpyxl 加载原始的工作簿。
  2. 获取源工作表:通过 wb['Sheet1'] 获取源工作表,替换 'Sheet1' 为你实际的工作表名称。
  3. 创建新工作簿:使用 xlsxwriter.Workbook() 创建一个新的工作簿,并添加一个新的工作表。
  4. 复制单元格内容:通过 iter_rows() 遍历源工作表中的每一行和每个单元格,使用 write() 方法将内容写入新工作表。
  5. 复制单元格格式:使用 add_format() 方法创建一个格式对象,复制源工作表单元格的格式,并将其应用到新工作表的相应单元格。
  6. 保存新工作簿:使用 workbook.close() 保存新的工作簿。

需要注意的事项:

  • 这种方法只能复制基本的单元格内容和格式。如果源工作表中有更复杂的元素(如图表、图片等),这些内容不会被复制。
  • 你需要确保在 add_format() 中定义的格式适合你的需求。如果你需要更多的样式支持,可以参考 xlsxwriter 的 官方文档 进一步了解如何使用格式。

通过这种方法,你可以使用 openpyxlxlsxwriter 来实现工作表的内容和格式复制

 

使用pandas

要使用 pandas 将一个工作表中的所有数据从一个工作簿复制到另一个工作簿的工作表中,虽然 pandas 本身不支持复制整个工作表的格式(如字体、边框等),但它可以非常方便地处理数据内容的复制。

下面是一个使用 pandas 读取 Excel 文件并将数据从一个工作表复制到另一个工作表的示例:

代码示例:

import pandas as pd# 读取源工作簿和工作表
source_file = 'source_workbook.xlsx'
source_sheet = 'Sheet1'  # 要复制的工作表名称# 使用pandas读取源工作表的数据
df = pd.read_excel(source_file, sheet_name=source_sheet)# 将数据写入到新的工作簿中的新工作表
destination_file = 'destination_workbook.xlsx'
df.to_excel(destination_file, sheet_name='CopiedSheet', index=False)print("工作表复制完成!")

代码解析:

  1. 读取源工作表的数据:使用 pd.read_excel() 读取源工作簿中的工作表数据,并将其存储在 df 数据框中。
  2. 将数据写入新的工作簿:使用 df.to_excel() 将数据框 df 的内容写入到新的工作簿中的指定工作表(CopiedSheet)。
  3. index=False:这表示不将行索引(DataFrame 的默认索引)写入到新的工作表中。如果需要包括索引,去掉该参数即可。

注意:

  • pandas 不会复制工作表中的格式和样式,它只会复制数据内容。
  • 如果源工作表包含多个工作表,可以通过 sheet_name=None 读取所有工作表数据,并处理它们。
http://www.dtcms.com/a/195347.html

相关文章:

  • 进阶-数据结构部分:1、数据结构入门
  • SOLIDWORKS Simulation接触定义精讲(一)
  • 【Linux】Linux安装并配置MongoDB
  • Manim教程:第12章 函数,函数图像和文字的渲染
  • React组件(一):生命周期
  • 用Python绘制梦幻星空
  • 软件架构风格系列(3):管道 - 过滤器架构
  • JavaScript - JavaScript 运算符之圆括号运算符与方括号运算符(圆括号运算符概述、圆括号运算符用法、方括号运算符概述、方括号运算符用法)
  • 方案精读:122页智能制造APS MES信息化系统技术方案【附全文阅读】
  • opencloudos 安装 mosquitto
  • UNiAPP地区选择
  • MySQL的缓存策略
  • Femap许可优化策略
  • 学习日志09 java
  • 中级统计师-统计学基础知识-第一章
  • spring框架的JDBC模板技术
  • lesson03-简单回归案例(理论+代码)
  • GTS-400 系列运动控制器板卡介绍(三十四)---运动程序多线程累加求和
  • 练习小项目3:随机正能量语录生成器
  • C语言—指针4
  • EXCEL在一列数据前统一添加负号
  • 【Manim】使用manim画一个高斯分布的动画
  • 黑马k8s(八)
  • Spring MVC 对 JavaWeb 的优化:从核心组件到注解
  • 使用 LSTM/GRU 预测设备异常的模型
  • 前端 vue 部署 nginx 请求 404
  • MCP概述及MCP Server的使用和实现(谷歌ADK使用MCP Server)
  • P6123 [NEERC 2016] Hard Refactoring 题解
  • Invicti-Professional-V25.5
  • C/C++实践(九)C++二叉搜索树深入讲解