如何使用设置的样式将单元格从一个工作簿复制到另一个工作簿?

2024-03-29 04:55:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试将单元格从一个工作簿复制到另一个工作簿,但格式设置失败。我试过许多建议,但都不管用

我试过:

def copyCellStyle(new_cell,cell):
    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)

然后像这样使用它:

new_cell.value=old_cell.value 
copyCellStyle(new_cell,old_cell)

它运行时没有错误,但作业未完成

我在styles类中的其他方法中遇到错误。 什么时候

new_cell._style = copy(old_cell._style)

保存复制的文件时出现此错误时使用此选项

    Traceback (most recent call last):
  File "C:\Python Programs\test\test2.py", line 40, in <module>
    wb2.save("Test3.xlsx")
  File "C:\Anaconda3\lib\site-packages\openpyxl\workbook\workbook.py", line 392, in save
    save_workbook(self, filename)
  File "C:\Anaconda3\lib\site-packages\openpyxl\writer\excel.py", line 293, in save_workbook
    writer.save()
  File "C:\Anaconda3\lib\site-packages\openpyxl\writer\excel.py", line 275, in save
    self.write_data()
  File "C:\Anaconda3\lib\site-packages\openpyxl\writer\excel.py", line 84, in write_data
    stylesheet = write_stylesheet(self.workbook)
  File "C:\Anaconda3\lib\site-packages\openpyxl\styles\stylesheet.py", line 240, in write_stylesheet
    xf.alignment = wb._alignments[style.alignmentId]
IndexError: list index out of range

当我检查单元格是否有如下样式时:

Traceback (most recent call last)
 File "C:\Python Programs\test\test2.py", line 37, in <module>
    if cell.has_style: 
AttributeError: module 'openpyxl.cell' has no attribute 'has_style'

我正在使用Python3.x

有谁能告诉我一个有效的方法来实现这一点吗

提前谢谢


Tags: inpynewstylesavelibpackagesline
1条回答
网友
1楼 · 发布于 2024-03-29 04:55:25

您需要了解copy(cell._style)如何理解该异常。在幕后,每个openpyxl工作簿都有不同样式的受保护属性。例如,属性_alignments将保存一个带有工作簿中对齐的list,例如:

_alignments example

_style是一个列表,仅通过索引引用所述属性,例如:

_style example

因此,让我们以没有应用对齐样式的工作簿为例。在这种情况下,工作簿的_alignments列表属性将只有一项是default(空)对齐方式,因此:

len(new_workbook._alignments) == 1

当您copy(cell._style)访问新工作簿时,它会尝试通过引用受保护的属性样式(路线、边框等)来获取其新样式。但是,由于新工作簿没有样式,引用_alignment[1]将引发IndexError,因为新工作簿列表上只有一个项目,即默认项目(存储在_alignments[0]

你最初的方法是正确的。如果要将复制到新工作簿,则应在工作表的单元格上迭代,然后复制值和各个样式:

from openpyxl import load_workbook, Workbook
from copy import copy

original_wb = load_workbook('example.xlsx')
original_sheet = original_wb['Sheet1']

new_wb = Workbook()
new_ws = new_wb.active

for row in original_sheet.rows:
    for cell in row:
        new_ws[cell.coordinate] = cell.value
        new_cell = new_ws[cell.coordinate]

        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)

new_wb.save('new.xlsx')

试图复制到新工作簿时,_style方法将不起作用,并且在可以使用workbook.copy_worksheetdocumentation)的同一工作簿中不需要该方法

相关问题 更多 >