python Excel操作,将一个工作表中的sheet页复制到另一个工作表中(包括单元格的内容、样式、格式等)
使用内存中的文件对象
-
将数据写入内存中的 Excel 文件
-
将内存中的文件保存到指定路径
原理:
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())
解释:
-
excel_buffer = io.BytesIO()
: 使用BytesIO
创建一个内存中的文件对象,这样数据就不会立即写入磁盘,而是写入内存。 -
with pd.ExcelWriter(excel_buffer, engine="xlsxwriter") as writer:
: 使用ExcelWriter
将数据写入内存中的excel_buffer
。 -
excel_buffer.getvalue()
: 获取内存中存储的 Excel 数据。 -
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()
代码解析:
xw.App(visible=True)
打开 Excel 应用并设置为可见。source_workbook.sheets['源工作表名称']
和destination_workbook.sheets['目标工作表名称']
分别获取源工作簿和目标工作簿中的工作表。source_sheet.api.Copy(After=destination_sheet.api)
复制源工作表到目标工作表后面。destination_workbook.save()
保存目标工作簿。source_workbook.close()
和destination_workbook.close()
关闭源工作簿和目标工作簿。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()
代码解析:
xw.App(visible=True)
:打开 Excel 应用并设置为可见。source_workbook.sheets['源工作表名称']
和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()
:关闭源工作簿和目标工作簿。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()
代码解释:
-
xw.App(visible=False, add_book=False)
:visible=False
:设置为不可见,Excel 不会弹出任何界面。add_book=False
:防止xlwings
自动创建一个新的工作簿。这意味着 Excel 在启动时不会创建一个默认的空白工作簿,这可以防止不必要的工作簿打开。
-
打开和操作工作簿:正常通过
app.books.open()
打开工作簿并进行所需的操作。 -
退出和关闭 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')
代码解析:
- 加载工作簿:使用
load_workbook
打开原始 Excel 文件。 - 获取源工作表:通过
wb['Sheet1']
获取原工作表,替换'Sheet1'
为你实际的工作表名称。 - 创建新工作表:使用
create_sheet
创建一个新的工作表,命名为'CopiedSheet'
。 - 复制单元格内容:使用
iter_rows()
遍历源工作表中的每一行,复制单元格的内容。 - 复制单元格样式:除了内容,还通过复制每个单元格的样式(如字体、边框、填充色、数字格式、对齐方式和保护设置)来保持原始样式。
- 保存工作簿:将修改后的工作簿保存为新的文件
'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()
代码解析:
- 加载源工作簿:使用
openpyxl
加载原始的工作簿。 - 获取源工作表:通过
wb['Sheet1']
获取源工作表,替换'Sheet1'
为你实际的工作表名称。 - 创建新工作簿:使用
xlsxwriter.Workbook()
创建一个新的工作簿,并添加一个新的工作表。 - 复制单元格内容:通过
iter_rows()
遍历源工作表中的每一行和每个单元格,使用write()
方法将内容写入新工作表。 - 复制单元格格式:使用
add_format()
方法创建一个格式对象,复制源工作表单元格的格式,并将其应用到新工作表的相应单元格。 - 保存新工作簿:使用
workbook.close()
保存新的工作簿。
需要注意的事项:
- 这种方法只能复制基本的单元格内容和格式。如果源工作表中有更复杂的元素(如图表、图片等),这些内容不会被复制。
- 你需要确保在
add_format()
中定义的格式适合你的需求。如果你需要更多的样式支持,可以参考xlsxwriter
的 官方文档 进一步了解如何使用格式。
通过这种方法,你可以使用 openpyxl
和 xlsxwriter
来实现工作表的内容和格式复制
使用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("工作表复制完成!")
代码解析:
- 读取源工作表的数据:使用
pd.read_excel()
读取源工作簿中的工作表数据,并将其存储在df
数据框中。 - 将数据写入新的工作簿:使用
df.to_excel()
将数据框df
的内容写入到新的工作簿中的指定工作表(CopiedSheet
)。 - index=False:这表示不将行索引(
DataFrame
的默认索引)写入到新的工作表中。如果需要包括索引,去掉该参数即可。
注意:
pandas
不会复制工作表中的格式和样式,它只会复制数据内容。- 如果源工作表包含多个工作表,可以通过
sheet_name=None
读取所有工作表数据,并处理它们。