2014-04-28 125 views
3

我試圖將表單default_sheet複製到同一工作簿中的新工作表new_sheet中。複製單元格樣式openpyxl

我確實設法創建了新工作表並從默認工作表中複製了值。我怎樣才能將每個單元格的樣式複製到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> 

我目前在使用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()]) 
+0

我發現了一種複製的方式,但我不確定它是否是最好的方法,它不能複製像單元格的寬度/高度一樣的東西! – FotisK

+0

是的,你需要使用複製。每個工作表都保存一個可以複製的單元格樣式的字典。但是,你真的想嘗試使用1.9分支,這個分支有一個更清潔的界面。 –

回答

5

對於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 
+3

我使用的是openpyxl 2.4.1,'cell.font'或'cell.border'是'StyleProxy'的一個實例,如果保存該類型的工作簿,您將會得到一個異常。你必須將它複製到新的單元格,如下所示:'new_cell.font = copy(cell.font)' – dawncold

+0

謝謝你dawncold,想知道爲什麼我得到一個「不可哈希類型」的錯誤。 – otocan

4

可能這是大多數的方便的方法。

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') 
+1

這不是所有的樣式,[這個答案](http://stackoverflow.com/a/34838233/831142)更好,但必須使用'copy'。 – dawncold