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)
它运行没有错误,但工作没有完成。
我在样式类中的其他方法出现错误。什么时候
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。
谁能告诉我一个可行的方法来实现这一点。
提前致谢!
解决方案
您需要了解做什么copy(cell._style)
才能理解该异常。在幕后,每个openpyxl
工作簿都有不同样式的受保护属性。例如,该属性_alignments
将list
与工作簿中的对齐方式保持一致,例如:
_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
(文档)。
推荐阅读
- javascript - Heroku 部署错误 H10;错误:找不到模块“/app/console”
- javascript - 从 AJAX 创建时冻结引导程序
- c# - 如何使用 Orca 减小 1GB MSI 文件的大小?
- javascript - 在不显示 d3.js 的正文标签上添加工具提示
- azure - 无法将日期作为参数传递给 powershell 中的 uri
- excel - 如何在包含 5000 行数据的工作表中在 vba 中编写 vlookup?
- spring - 具有不同名称的多个 Spring 配置文件
- ios - 为什么这些约束在动画时似乎滞后?
- facebook - 创建页面或更改页面封面图片时出现“(#10) 应用程序无权执行此操作”
- r - 如何识别行中的重复元素