我正在寻找一种在其他文件中复制和Excel的方法。我有一个“file_1.xlsx”,但我想要一个不存在的“file_1_copy.xlsx”。副本必须与原始文件完全相同,这意味着单元格大小、它们的融合、单元格中文本的颜色、背景、如果有边框,就好像我用右键单击。
我有:
import openpyxl
from openpyxl.styles import Font
wb = openpyxl.load_workbook('test excel.xlsx')
ws = wb.active
new_wb = openpyxl.Workbook()
new_ws = new_wb.active
for row in ws.iter_rows():
for cell in row:
new_cell = new_ws.cell(row=cell.row, column=cell.col_idx, value=cell.value)
if cell.has_style:
new_cell.font = Font(name=cell.font.name, size=cell.font.size, bold=cell.font.bold, italic=cell.font.italic, color=cell.font.color)
new_wb.save('test copie excel.xlsx')
所以在图像上,左边是原始文件。副本位于右侧,但第一个单元格中的文本应该有两种颜色:右侧和蓝色,并以黄色突出显示。或者在副本中,我只有一种颜色,所有文本都变成红色,并且不再过亮。 是否存在一种简单的方法来复制 Excel,就好像通过右键单击手动完成一样,这将准确复制原始文件及其内部的所有属性/元素?
Excel 单元格通常只有一种字体。如果 Excel 单元格中存在富文本格式的文本,则单元格内容本身就是富文本单元格内容。但出于性能原因,默认情况下加载工作簿文件时不会读取富文本单元格内容。因此,如果需要,必须在
rich_text=True
中设置 load_workbook('test excel.xlsx', rich_text=True)
。
颜色是单元格的填充颜色。为了保持这一点,还必须复制填充。
顺便说一句:
copy
中的copy
可用于复制整个cell.font
和cell.fill
,以避免复制每个单个字体和填充属性。
并且列宽是工作表尺寸设置,如果要相同,也需要为
new_ws
设置。
from openpyxl import load_workbook, Workbook
from copy import copy
wb = load_workbook('test excel.xlsx', rich_text=True)
ws = wb.active
new_wb = Workbook()
new_ws = new_wb.active
for row in ws.iter_rows():
for cell in row:
new_cell = new_ws.cell(row=cell.row, column=cell.col_idx, value=cell.value)
new_cell.font = copy(cell.font)
new_cell.fill = copy(cell.fill)
for column_name in ws.column_dimensions:
new_ws.column_dimensions[column_name].width = ws.column_dimensions[column_name].width
new_wb.save('test copie excel.xlsx')
这适用于您现在拥有的单元格和工作表属性。如果需要复制所有可能的单元格和工作表属性,那么代码会变得非常长且复杂。
但是使用另一种方法不是更方便吗? 使用
test excel.xlsx
打开 wb = openpyxl.load_workbook('test excel.xlsx', rich_text=True)
。然后在wb
中进行所需的更改。最后使用 wb.save('test copie excel.xlsx')
以新文件名保存文件。根本不需要 new_wb
和 new_ws`。