尝试使用 openpyxl 解冻窗格会造成损坏

问题描述 投票:0回答:4

我正在尝试使用 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。

python openpyxl
4个回答
1
投票

只需查看执行此操作的源代码:冻结到

A1
应该不会执行任何操作。但是,我不打算更改此代码。使用工作表视图 (
ws.views.sheetViews[0]
) 效果更好,但您需要查看格式规范以了解更多详细信息。


1
投票

按照 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)

0
投票

我在尝试解决我自己的问题时重现了您的问题: 我的问题是,如果电子表格在关闭 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 中失败的原因,我正在查看两个字段之一:

  1. ws.sheet_view.selection

     - 这是一个包含三个 Selection 对象的列表,每个对象都有一个不同的窗格 - 请注意,它们都不是 
    'topLeft'
    ,这是强制性的

  2. 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 中打开电子表格而不会出现错误。


0
投票
我查看了源代码并使用此修复:

ws.views.sheetView[0] = SheetView()
它重建了SheetView对象。

© www.soinside.com 2019 - 2024. All rights reserved.