C# ';无效索引';在C中使用Excel互操作#

C# ';无效索引';在C中使用Excel互操作#,c#,excel,visual-studio,interop,vsto,C#,Excel,Visual Studio,Interop,Vsto,尝试检索应该存在的分页符项目时,我遇到了一个无效索引COM异常 每当我试图访问Excel.Worksheet.HPageBreaks列表中的第三个或更高项目时,它就会出现,返回无效的索引错误。如果是第1项或第2项,则检索该项并为我提供所需的参数没有问题。(我正在尝试检索每页上的分页符行,以确保我输入的数据不会在某些点被分离。) 我已经输入了我如何初始化此文档的现有代码,因为您可能看到我正在设置的某些参数相互冲突,而我可能没有意识到。我的输出是MessageBox 以下是我现有的代码:

尝试检索应该存在的分页符项目时,我遇到了一个无效索引COM异常

每当我试图访问Excel.Worksheet.HPageBreaks列表中的第三个或更高项目时,它就会出现,返回无效的索引错误。如果是第1项或第2项,则检索该项并为我提供所需的参数没有问题。(我正在尝试检索每页上的分页符行,以确保我输入的数据不会在某些点被分离。)

我已经输入了我如何初始化此文档的现有代码,因为您可能看到我正在设置的某些参数相互冲突,而我可能没有意识到。我的输出是MessageBox

以下是我现有的代码:

        Excel.Application xApp = new Excel.Application();
        Excel.Workbook xWorkBook;
        Excel.Worksheet xWorkSheet;
        object missingVal = System.Reflection.Missing.Value;

        xWorkBook = xApp.Workbooks.Add(missingVal);
        xWorkSheet = xWorkBook.Worksheets.get_Item(1);
        xWorkSheet.PageSetup.Orientation =
Microsoft.Office.Interop.Excel.XlPageOrientation.xlPortrait;
        xWorkSheet.PageSetup.Zoom = false;
        xWorkSheet.PageSetup.FitToPagesTall = 20;
        xWorkSheet.PageSetup.FitToPagesWide = 1;
        xApp.UseSystemSeparators = false;

        xWorkSheet.Columns[1].ColumnWidth = 25;
        xWorkSheet.Columns[2].ColumnWidth = 10;
        for (int i = 3; i < 28; i++)
            xWorkSheet.Columns[i].ColumnWidth = 1;

        var range = xWorkSheet.get_Range("A1", "AB1");
        range.Merge();
        range.Font.Size = 16;
        range.RowHeight = 21;
        range.Font.Bold = true;
        range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
        range = xWorkSheet.get_Range("A2", "AB2");
        range.Merge();
        range.Font.Size = 10;
        range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;

        MessageBox.Show(xWorkSheet.HPageBreaks.Count.ToString()); //This gives zero pagebreaks
        xWorkSheet.Cells[500, 1] = " ";
        MessageBox.Show(xWorkSheet.HPageBreaks.Count.ToString()); //This gives nine pagebreaks
        MessageBox.Show(xWorkSheet.HPageBreaks.Item[1].Location.Row.ToString()); //This returns 51
        MessageBox.Show(xWorkSheet.HPageBreaks.Item[2].Location.Row.ToString()); //This returns 102
        MessageBox.Show(xWorkSheet.HPageBreaks.Item[3].Location.Row.ToString()); //This is where it breaks with the error

以及

xWorkSheet.HPageBreaks[xWorkSheet.HPageBreaks.Count] //Success at 1 or 2 PBs only
并尝试在excel表格中对空格字符进行不同的放置,而不是第500行。

我完全没有想法,一直在寻找解决方案,却在2010年找到了一个不相关的解决方案。这是我第一个问题,如果我遗漏了什么,请告诉我!:)

有什么我可能错过的想法或解决方案吗

谢谢各位


EDIT:不幸的是,我还尝试使用foreach循环,就像,它再次返回一个无效的索引错误,具体指向foreach循环作为原因。我没有什么想法了…

在实例化
xWorksheet
之后,尝试插入以下行:

xApp.ActiveWindow.View = XlWindowView.xlPageBreakPreview;
xWorkSheet.DisplayPageBreaks = true;
xWorkSheet.DisplayAutomaticPageBreaks = true;
这将允许所有分页符值在对象中可见,从而正确返回

您的计数按预期返回(9),但未找到的原因是默认的“视图”是第一页/单页。因此,您有2个分页符,但在第一页之外没有看到其余的分页符


这里的关键点实际上是
xlPageBreakPreview
——但是额外的两行应该可以让对象完全了解未来的任何更改。

实例化
xWorksheet
后,尝试插入以下行:

xApp.ActiveWindow.View = XlWindowView.xlPageBreakPreview;
xWorkSheet.DisplayPageBreaks = true;
xWorkSheet.DisplayAutomaticPageBreaks = true;
这将允许所有分页符值在对象中可见,从而正确返回

您的计数按预期返回(9),但未找到的原因是默认的“视图”是第一页/单页。因此,您有2个分页符,但在第一页之外没有看到其余的分页符



这里的关键实际上是
xlPageBreakPreview
——但是额外的两行应该也能让对象完全了解未来的任何更改。

如果调试代码,并检查
xWorksheet.HPageBreaks.Count的值,那么返回的整数是多少<代码>无效索引
错误通常是,逐字逐句-您试图引用的数字高于它认为存在的数字。正如在帖子中提到的,我已经在我发布的代码底部这样做了。它返回值9,因此我引用了一个“应该”有效但由于某种原因无效的数字。这就是为什么我认为第1项和第2项正确返回而不是第3项很奇怪,尽管
xWorksheet.HPageBreaks.Count
返回了9项。说清楚一点,你说你有9项,而不是显式
.Count
本身返回了9项。你应该把那句废话明确地写进去。明天我会更详细地看这篇文章。明白了,抱歉没有说得太清楚,我在底部编辑了它。我期待任何可能的帮助!谢谢!:)是否有一个地方可以发布
.xlsx
文件-当然,如果数据是专有信息,则会被删除。事实上,我认为您可以删除除分页符之外的所有内容。如果您调试代码,并检查
xWorksheet.HPageBreaks.Count的值,则返回的整数是多少<代码>无效索引
错误通常是,逐字逐句-您试图引用的数字高于它认为存在的数字。正如在帖子中提到的,我已经在我发布的代码底部这样做了。它返回值9,因此我引用了一个“应该”有效但由于某种原因无效的数字。这就是为什么我认为第1项和第2项正确返回而不是第3项很奇怪,尽管
xWorksheet.HPageBreaks.Count
返回了9项。说清楚一点,你说你有9项,而不是显式
.Count
本身返回了9项。你应该把那句废话明确地写进去。明天我会更详细地看这篇文章。明白了,抱歉没有说得太清楚,我在底部编辑了它。我期待任何可能的帮助!谢谢!:)是否有一个地方可以发布
.xlsx
文件-当然,如果数据是专有信息,则会被删除。事实上,你可以删除除分页符以外的所有内容,我认为。+1投票(我太新了,无法显示)-这非常有效!我可能永远也不会发现这些参数需要改变。非常感谢你的帮助和时间,我真的很感激!等等,这会引起另一个问题。我不确定是否应该提出一个新问题,因为这肯定会解决这个问题。但是,在我设置
xApp.ActiveWindow.View=XlWindowView.xlPageBreakPreview之后
每次我在excel工作表中输入任何数据时,每个单元格都使用
xWorkSheet.Cells[I+1,n+1]=dataTable.Rows[I][n]的速度急剧降低到几乎无法使用的速度。有什么想法吗?当然,提出一个新问题。链接到这一个,就像你在这里做的一样,你可以获得更好的代表。我做了,它说投票是记录的,但没有公开显示,因为我还没有足够的声誉。这很有效!!谢谢你@gravity,我很感激。:)在32年的技术支持下,最难解决的是那些讨厌的隐藏参数!我可能永远也不会发现这些参数需要改变。非常感谢你的邀请
xApp.ActiveWindow.View = XlWindowView.xlPageBreakPreview;
xWorkSheet.DisplayPageBreaks = true;
xWorkSheet.DisplayAutomaticPageBreaks = true;