尝试使用openpyxl解冻窗格会导致损坏

时间:2018-02-12 17:35:09

标签: python openpyxl

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

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 中失败的原因,我正在查看两个字段之一:

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