我正在尝试使用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。
答案 0 :(得分:1)
只是看看这样做的来源:冻结到11 x 11 sparse Matrix of class "dsCMatrix"
[1,] . . . 28 30 25 . . . . .
[2,] . . . . . . 40 50 . . .
[3,] . . . . . . . . 47 62 23
[4,] 28 . . . . . . . . . .
[5,] 30 . . . . . . . . . .
[6,] 25 . . . . . . . . . .
[7,] . 40 . . . . . . . . .
[8,] . 50 . . . . . . . . .
[9,] . . 47 . . . . . . . .
[10,] . . 62 . . . . . . . .
[11,] . . 23 . . . . . . . .
应该什么都不做。但是,我没有计划更改此代码。使用工作表视图(A1
)要好得多,但是您需要查看格式规范以获取更多详细信息。
答案 1 :(得分: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 中失败的原因,我正在查看两个字段之一:
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 中打开电子表格而不会出错。