Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 复制单元样式openpyxl_Python_Openpyxl - Fatal编程技术网

Python 复制单元样式openpyxl

Python 复制单元样式openpyxl,python,openpyxl,Python,Openpyxl,我正在尝试将一张工作表,default\u sheet,复制到同一工作簿中的新工作表new\u sheet 我确实设法创建了一个新的工作表,并从默认工作表复制了值。如何将每个单元格的样式复制到新的表格单元格中 新建工作表=工作簿。创建工作表() new_sheet.title=图纸名称 默认工作表=工作簿。按工作表名称获取工作表(“默认”) 新建工作表=工作簿。按工作表名称(工作表名称)获取工作表 对于默认_sheet.rows中的行: col\u idx=float(默认\u sheet.ge

我正在尝试将一张工作表,
default\u sheet
,复制到同一工作簿中的新工作表
new\u sheet

我确实设法创建了一个新的工作表,并从默认工作表复制了值。如何将每个单元格的样式复制到新的表格单元格中

新建工作表=工作簿。创建工作表()
new_sheet.title=图纸名称
默认工作表=工作簿。按工作表名称获取工作表(“默认”)
新建工作表=工作簿。按工作表名称(工作表名称)获取工作表
对于默认_sheet.rows中的行:
col\u idx=float(默认\u sheet.get\u highest\u column())
启动列=chr(65+int(列idx))
对于默认_sheet.rows中的行:
对于行中的单元格:
新建_工作表[cell.get_坐标()]=cell.value
我目前正在使用OpenPYXL1.8.2,但我想切换到1.8.5

一种解决方案是复制:

从复制导入复制,深度复制
新建工作表。\u样式[单元格.获取坐标()]=复制(
默认工作表。\样式[单元格.获取坐标()

从openpyxl 2.5.4开始,Python3.4:(与下面的旧版本相比有细微的变化)

新建工作表=工作簿。创建工作表(工作表名称)
默认工作表=工作簿['default']
从副本导入副本
对于默认_sheet.rows中的行:
对于行中的单元格:
新建单元格=新建工作表单元格(行=单元格.行,列=单元格.col\u idx,
值=单元格。值)
如果cell.has_样式:
new_cell.font=复制(cell.font)
new_cell.border=复制(cell.border)
新建_cell.fill=复制(cell.fill)
新建\u cell.number\u格式=复制(cell.number\u格式)
新建\u cell.protection=复制(cell.protection)
新建\单元格对齐=复制(单元格对齐)
对于openpyxl 2.1

新建工作表=工作簿。创建工作表(工作表名称)
默认工作表=工作簿['default']
对于默认_sheet.rows中的行:
对于行中的单元格:
新建单元格=新建工作表单元格(行=单元格.行\u idx,
col=cell.col\u idx,value=cell.value)
如果cell.has_样式:
new_cell.font=cell.font
新建_cell.border=cell.border
new_cell.fill=cell.fill
新的\u cell.number\u格式=cell.number\u格式
新的\u cell.protection=cell.protection
新建单元对齐=单元对齐

也许这是最方便的方式

    from openpyxl import load_workbook
    from openpyxl import Workbook
    read_from = load_workbook('path/to/file.xlsx')
    read_sheet = read_from.active
    write_to = Workbook()
    write_sheet = write_to.active
    write_sheet['A1'] = read_sheet['A1'].value
    write_sheet['A1'].style = read_sheet['A1'].style
    write_to.save('save/to/file.xlsx')

StyleableObject
实现将样式存储在单个列表中,
\u style
和单元格上的样式属性实际上是该数组的getter和setter。您可以单独实现每个样式的副本,但这将很慢,特别是如果您像我一样在一个繁忙的内部循环中进行复制

如果您愿意深入研究私有类属性,有一种克隆样式的更快方法:

if cell.has_style:
    new_cell._style = copy(cell._style)

FWIW这就是优化的
工作表复制
类在
\u copy\u cells
方法中执行此操作的方式。

我找到了复制的方法,但我不确定这是否是最好的方法,它不会复制单元格的宽度/高度等所有内容!是的,你需要用复印件。每个工作表都有一个可以复制的单元格样式字典。但是你真的想尝试使用1.9分支,它有一个更干净的界面来处理这类事情。我使用的是openpyxl 2.4.1,
cell.font
cell.border
StyleProxy
的一个实例,如果用这种类型保存工作簿,你会得到一个异常。您必须将其复制到新单元格,如下所示:
new\u cell.font=copy(cell.font)
谢谢dawncold,他想知道我为什么会出现“非散列类型”错误。在
2.5.3
中,
填充
保护
对齐
也必须复制。通过最近的openpyxl进行编辑以添加轻微修改,包括大家提到的变化。单元格属性也有一些变化。感谢Charlie Clark,这是我所需要的基础。值得注意的是,工作簿有一个
copy\u工作表
方法已经有一段时间了,这个复制样式适合你。这不是所有样式,更好,但是必须使用
copy
namedstyle
如果您希望在多个单元格中使用相同的样式,则更有意义。代码不错。这正是我目前需要的。但事实上,在某些情况下,
NamedStyles
可能是一种更好的方法。谢谢你的单行答案