首页 > 解决方案 > 如何将单元格从一个工作簿复制到具有其设置样式的另一个工作簿?

问题描述

我一直在尝试将一个单元格从一个工作簿复制到另一个工作簿,但格式化却失败了。我尝试了很多建议,但没有任何效果。

我努力了:

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)

它运行没有错误,但工作没有完成。

我在样式类中的其他方法出现错误。什么时候

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'

我正在使用 python 3.x。

谁能告诉我一个可行的方法来实现这一点。

提前致谢!

标签: pythonpython-3.xexcelopenpyxl

解决方案


您需要了解做什么copy(cell._style)才能理解该异常。在幕后,每个openpyxl工作簿都有不同样式的受保护属性。例如,该属性_alignmentslist与工作簿中的对齐方式保持一致,例如:

_alignments 示例

_style是一个仅通过索引引用所提及属性的列表,如下所示:

_style 示例

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

len(new_workbook._alignments) == 1

当您copy(cell._style)访问新工作簿时,它会尝试通过引用受保护的属性样式(对齐、边框等)来获得新样式。但是,由于新工作簿没有样式,因此引用_alignment[1]将引发 an 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_worksheet文档)。


推荐阅读