C# 使用Excel互操作冻结窗格时出现错误:生成的工作簿失去其结构

C# 使用Excel互操作冻结窗格时出现错误:生成的工作簿失去其结构,c#,excel-interop,C#,Excel Interop,我已尝试在新工作表上使用Microsoft.Excel.Interop运行以下代码,并将其添加到现有工作簿中并动态填充,然后出于显示目的,我设置了以下3个属性: worksheet.Application.ActiveWindow.SplitRow = 4; worksheet.Application.ActiveWindow.SplitColumn = 1; worksheet.Application.ActiveWindow.FreezePanes = true; 每次我在生成的工作簿中都

我已尝试在新工作表上使用Microsoft.Excel.Interop运行以下代码,并将其添加到现有工作簿中并动态填充,然后出于显示目的,我设置了以下3个属性:

worksheet.Application.ActiveWindow.SplitRow = 4;
worksheet.Application.ActiveWindow.SplitColumn = 1;
worksheet.Application.ActiveWindow.FreezePanes = true;
每次我在生成的工作簿中都会遇到相同的错误:所有其他已冻结窗格的工作表都会变得非结构化(B列的一半与C列重叠,以及其他有趣的图形细节…)

我在检查其他Excel自动化库(例如ClosedXML)时发现,其他库直接修改XML代码,因此它们不使用ActiveWindow,而是直接使用工作表本身

我的问题是否可能是因为我不正确地修改了ActiveWindow的属性? 如果是,是否有人知道是否可以不通过ActiveWindow冻结窗格? 如果没有,有人知道它从哪里来吗

提前谢谢


Roddhes

在设置属性之前,您是否激活了相应的工作表?我的意思是:

Worksheet.Activate();
Worksheet.Application.ActiveWindow.SplitRow = 4;
Worksheet.Application.ActiveWindow.SplitColumn = 1;
Worksheet.Application.ActiveWindow.FreezePanes = true;
作为帮助,您可以在此处找到一些用于冻结顶行的代码示例(请务必阅读此处的注释以获得其他代码改进):


似乎也可以使用OpenXML来冻结窗格。另一个SO线程对此进行了描述:

在设置属性之前是否激活了相应的工作表?我的意思是:

Worksheet.Activate();
Worksheet.Application.ActiveWindow.SplitRow = 4;
Worksheet.Application.ActiveWindow.SplitColumn = 1;
Worksheet.Application.ActiveWindow.FreezePanes = true;
作为帮助,您可以在此处找到一些用于冻结顶行的代码示例(请务必阅读此处的注释以获得其他代码改进):


似乎也可以使用OpenXML来冻结窗格。另一个SO线程对此进行了描述:

是的,我在使用工作表之前激活了它。在我运行此代码后,工作表上的窗格被正确冻结,唯一的问题是工作簿中所有其他工作表的附带损坏。我尝试过OpenXML,它可以工作(与其他XML互操作库一样),但要使用它,我需要通过Microsoft关闭工作簿。互操作然后通过OpenXML重新打开它,我通常使用的工作簿很重,所以我只想处理一个库。您能更准确地描述一下如何激活窗口以及在哪里分配工作表变量吗?您提到了动态创建工作表,因此,可能它的创建方式会在冻结窗格后产生所述效果。请尝试冻结现有窗格,并查看其是否适用于该窗格。或者,您可能需要写入
范围(“B5”)。而不是设置
SplitRow
SplitColumn
(然后像前面一样将
冻结窗格设置为
true
)。它不会进行实际拆分,但在这种情况下冻结窗格的效果似乎是一样的,是的,我在使用它之前激活了工作表。在我运行此代码后,工作表上的窗格被正确冻结,唯一的问题是工作簿中所有其他工作表的附带损坏。我尝试过OpenXML,它可以工作(与其他XML互操作库一样),但要使用它,我需要通过Microsoft关闭工作簿。互操作然后通过OpenXML重新打开它,我通常使用的工作簿很重,所以我只想处理一个库。您能更准确地描述一下如何激活窗口以及在哪里分配工作表变量吗?您提到了动态创建工作表,因此,可能它的创建方式会在冻结窗格后产生所述效果。请尝试冻结现有窗格,并查看其是否适用于该窗格。或者,您可能需要写入
范围(“B5”)。而不是设置
SplitRow
SplitColumn
(然后像前面一样将
冻结窗格设置为
true
)。它不会进行实际拆分,但在本场景中冻结窗格的效果似乎相同,