我正在尝试使用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。
发布于 2018-02-12 19:09:48
只要看一下实现这一点的源代码:冻结到A1
应该什么都不做。但是,我没有计划更改这段代码。使用工作表视图(ws.views.sheetViews[0]
)要好得多,但是您需要查看格式规范以了解更多细节。
发布于 2022-01-28 03:02:45
遵循查理克拉克上面的建议,下面的代码对我有效,不会产生错误。
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)
发布于 2021-01-09 22:51:14
我在尝试解决我自己的问题时重新创建了您的问题:我的问题是,如果电子表格在关闭freeze_panes时没有显示顶部的行/列,则使用Excel会隐藏它们。
(如果在视图位于冻结单元格外时冻结窗格(例如,在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
-这是一个包含三个选择对象的列表,每个选择对象都有不同的窗格-请注意,它们都不是'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中打开电子表格而不会出现错误。
https://stackoverflow.com/questions/48752276
复制