我正在尝试将工作表复制default_sheet到new_sheet同一工作簿中的新工作表中.
我设法创建了一个新工作表并从默认工作表复制值.如何将每个单元格的样式复制到new_sheet单元格中?
new_sheet = workbook.create_sheet()
new_sheet.title = sheetName
default_sheet = workbook.get_sheet_by_name('default')
new_sheet = workbook.get_sheet_by_name(sheetName)
for row in default_sheet.rows:
col_idx = float(default_sheet.get_highest_column())
starting_col = chr(65 + int(col_idx))
for row in default_sheet.rows:
for cell in row:
new_sheet[cell.get_coordinate()] = cell.value
<copy also style of each cell>
Run Code Online (Sandbox Code Playgroud)
我目前正在使用openpyxl 1.8.2,但我想切换到1.8.5.
一个解决方案是复制:
from copy import copy, deepcopy
new_sheet._styles[cell.get_coordinate()] = copy(
default_sheet._styles[cell.get_coordinate()])
Run Code Online (Sandbox Code Playgroud)
Cha*_*ark 21
从openpyxl 2.5.4开始,python 3.4 :(对下面的旧版本进行细微更改)
new_sheet = workbook.create_sheet(sheetName)
default_sheet = workbook['default']
from copy import copy
for row in default_sheet.rows:
for cell in row:
new_cell = new_sheet.cell(row=cell.row, column=cell.col_idx,
value= cell.value)
if cell.has_style:
new_cell.font = copy(cell.font)
new_cell.border = copy(cell.border)
new_cell.fill = copy(cell.fill)
new_cell.number_format = copy(cell.number_format)
new_cell.protection = copy(cell.protection)
new_cell.alignment = copy(cell.alignment)
Run Code Online (Sandbox Code Playgroud)
对于openpyxl 2.1
new_sheet = workbook.create_sheet(sheetName)
default_sheet = workbook['default']
for row in default_sheet.rows:
for cell in row:
new_cell = new_sheet.cell(row=cell.row_idx,
col=cell.col_idx, value= cell.value)
if cell.has_style:
new_cell.font = cell.font
new_cell.border = cell.border
new_cell.fill = cell.fill
new_cell.number_format = cell.number_format
new_cell.protection = cell.protection
new_cell.alignment = cell.alignment
Run Code Online (Sandbox Code Playgroud)
该StyleableObject实现将样式存储在一个列表中_style,并且单元格上的样式属性实际上是此数组的获取器和设置器。您可以分别为每种样式实现副本,但这会很慢,特别是如果您像以前那样在繁忙的内部循环中进行复制。
如果您愿意研究私有类属性,则有一种更快的克隆样式的方法:
if cell.has_style:
new_cell._style = copy(cell._style)
Run Code Online (Sandbox Code Playgroud)
FWIW,这是优化的WorksheetCopy类在_copy_cells方法中的实现方式。