我正在尝试使用 openpyxl 读取工作表并解冻窗格。 Openpyxl 文档表明,要做到这一点,我会将 worksheet.freeze_panes 设置为
"A1"
或 None
。我正在这样做(参见下面的代码)
wb=load_workbook(path)
ws=wb["Sheet"]
ws.freeze_panes=ws["A1"]
wb.save(path)
但是当我尝试打开工作簿时,Excel 说
'We found a problem with some content, do you want us to try to recover as much as we can?"
然后它会给出维修日志,上面写着
"Removed Feature: View from /xl/worksheets/sheet2.xml part"
但是,当我尝试冻结任何其他窗格时,我没有遇到任何问题。还有其他人遇到过这个问题吗?我做错了什么吗?将不胜感激任何见解。我使用的是 openpyxl 版本 2.5.0 和 python 版本 3.5.2。
只需查看执行此操作的源代码:冻结到
A1
应该不会执行任何操作。但是,我不打算更改此代码。使用工作表视图 (ws.views.sheetViews[0]
) 效果更好,但您需要查看格式规范以了解更多详细信息。
按照 Charlie Clark 的上述建议,以下代码对我有用并且不会产生错误。
wb = openpyxl.load_workbook(filename)
ws = wb.active
ws.views.sheetView[0].pane = openpyxl.worksheet.views.Pane() # makes pane empty
ws.views.sheetView[0].selection[0] = openpyxl.worksheet.views.Selection()
ws.views.sheetView[0].topLeftCell = 'A1' # scroll to top left corner
wb.save(filename)
我在尝试解决我自己的问题时重现了您的问题: 我的问题是,如果电子表格在关闭 Excel 时未显示顶部行/列,则使用 freeze_panes 会隐藏顶部行/列。
(如果您在视图位于冻结单元格之外时冻结窗格, (例如,在Excel中打开一个电子表格,向下滚动并向右滚动并保存,然后尝试使用openpyxl冻结窗格),那么冻结的视图将变得混乱)
解决方案是通过 Excel 解冻窗格,然后在 python 中重试,但尝试使用
freeze_panes = None
解冻会导致与 Excel 消息相同的问题。
首先,如果您尝试解冻窗格,因为冻结它们会弄乱视图,那么解决方案是在冻结窗格之前更改视图以显示 A1:
# Go to cell A1 - Mandatory for freeze_panes to work
ws.sheet_view.topLeftCell = 'A1'
# Freeze Panes on cell E5
ws.freeze_panes = 'E5'
为了重现这种情况,我在 Excel 中保存了一个空电子表格,然后使用 openpyxl 打开它,冻结和取消冻结窗格并保存:
wb=openpyxl.load_workbook(xlspath)
ws=wb.active
ws.freeze_panes = 'E5'
ws.freeze_panes = 'A1'
wb.save(filename=xlspath)
为了了解它在 Excel 中失败的原因,我正在查看两个字段之一:
ws.sheet_view.selection
- 这是一个包含三个 Selection 对象的列表,每个对象都有一个不同的窗格 - 请注意,它们都不是
'topLeft'
,这是强制性的
ws.views.sheetView[0].selection
- 显示与上面相同(至少在这个场景中,我不完全确定是否还有其他场景)
'topLeft'
:
ws.sheet_view.selection=[ws.sheet_view.selection[0]]
ws.sheet_view.selection[0].pane='topLeft'
wb.save(filename=xlspath)
这解决了我的问题,并允许我在 Excel 中打开电子表格而不会出现错误。
ws.views.sheetView[0] = SheetView()
它重建了SheetView对象。