Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

copy cell style openpyxl

I am trying to copy a sheet, default_sheet, into a new sheet new_sheet in the same workbook.

I did managed to create a new sheet and to copy the values from default sheet. How can I also copy the style of each cell into the new_sheet cells?

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> 

I am at the moment using openpyxl 1.8.2, but i have in mind to switch to 1.8.5.

One solution is with copy:

from copy import copy, deepcopy  new_sheet._styles[cell.get_coordinate()] = copy(         default_sheet._styles[cell.get_coordinate()]) 
like image 282
FotisK Avatar asked Apr 28 '14 04:04

FotisK


People also ask

How do I style a cell in openpyxl?

To change a style property of a cell, first you either have to copy the existing style object from the cell and change the value of the property or you have to create a new style object with the desired settings. Then, assign the new style object to the cell.

Is openpyxl safe?

Is openpyxl safe to use? The python package openpyxl was scanned for known vulnerabilities and missing license, and no issues were found. Thus the package was deemed as safe to use. See the full health analysis review.


1 Answers

As of openpyxl 2.5.4, python 3.4: (subtle changes over the older version below)

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) 

For 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 
like image 89
Charlie Clark Avatar answered Oct 08 '22 02:10

Charlie Clark