'Invalid Index' 在 C# 中使用 Excel Interop
'Invalid Index' using Excel Interop in C#
我在尝试检索应该存在的分页项时遇到无效索引 COM 异常。
每次我尝试访问 Excel.Worksheet.HPageBreaks 列表中的第 3 个或更高的项目时,它都会出现 returns 无效索引错误。如果它是第 1 项或第 2 项,则检索该项目并提供我需要的参数没有问题。 (我正在尝试检索每一页上的分页符行,以确保我输入的数据不会在某些点被分开。)
我已将我现有的代码用于初始化此文档,因为我设置的某些参数可能与您看到的有冲突,而我可能没有意识到这一点。我的输出是 MessageBoxes.
这是我现有的代码:
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.Count.ToString()
验证了分页符中总共有9个项目。它似乎无法检索项目 2 之后的任何项目。不确定这是否重要,但我已尝试切换
xWorkSheet.HPageBreaks.Item[3]
到
xWorkSheet.HPageBreaks[3]
然后到
xWorkSheet.HPageBreaks[xWorkSheet.HPageBreaks.Count] //Success at 1 or 2 PBs only
并在第 500 行以外的 excel 工作表中尝试了 space 字符的不同位置。
我完全没有想法并搜索了解决方案,却发现了 2010 年发布的一个不相关的解决方案。这是我的第一个问题,所以如果我遗漏了什么,请告诉我! :)
有什么我可能遗漏的想法或解决方案吗?
谢谢大家。
编辑:不幸的是,我也尝试使用 foreach 循环,就像 this post 一样,它再次返回一个无效的索引错误,具体指向 foreach 循环作为原因。我 运行 没主意了...
实例化 xWorksheet
后,尝试插入这些行:
xApp.ActiveWindow.View = XlWindowView.xlPageBreakPreview;
xWorkSheet.DisplayPageBreaks = true;
xWorkSheet.DisplayAutomaticPageBreaks = true;
这应该允许所有分页符值在对象中可见,从而正确返回。
您的计数按预期返回 (9) 但未找到的原因是因为默认 'view' 属于 first/single 页面。因此,您有 2 个分页符,但没有看到第一页之外的剩余分页符。
这里的关键实际上是 xlPageBreakPreview
- 但额外的两行也应该让对象完全了解任何未来的变化。
我在尝试检索应该存在的分页项时遇到无效索引 COM 异常。
每次我尝试访问 Excel.Worksheet.HPageBreaks 列表中的第 3 个或更高的项目时,它都会出现 returns 无效索引错误。如果它是第 1 项或第 2 项,则检索该项目并提供我需要的参数没有问题。 (我正在尝试检索每一页上的分页符行,以确保我输入的数据不会在某些点被分开。)
我已将我现有的代码用于初始化此文档,因为我设置的某些参数可能与您看到的有冲突,而我可能没有意识到这一点。我的输出是 MessageBoxes.
这是我现有的代码:
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.Count.ToString()
验证了分页符中总共有9个项目。它似乎无法检索项目 2 之后的任何项目。不确定这是否重要,但我已尝试切换
xWorkSheet.HPageBreaks.Item[3]
到
xWorkSheet.HPageBreaks[3]
然后到
xWorkSheet.HPageBreaks[xWorkSheet.HPageBreaks.Count] //Success at 1 or 2 PBs only
并在第 500 行以外的 excel 工作表中尝试了 space 字符的不同位置。
我完全没有想法并搜索了解决方案,却发现了 2010 年发布的一个不相关的解决方案。这是我的第一个问题,所以如果我遗漏了什么,请告诉我! :)
有什么我可能遗漏的想法或解决方案吗?
谢谢大家。
编辑:不幸的是,我也尝试使用 foreach 循环,就像 this post 一样,它再次返回一个无效的索引错误,具体指向 foreach 循环作为原因。我 运行 没主意了...
实例化 xWorksheet
后,尝试插入这些行:
xApp.ActiveWindow.View = XlWindowView.xlPageBreakPreview;
xWorkSheet.DisplayPageBreaks = true;
xWorkSheet.DisplayAutomaticPageBreaks = true;
这应该允许所有分页符值在对象中可见,从而正确返回。
您的计数按预期返回 (9) 但未找到的原因是因为默认 'view' 属于 first/single 页面。因此,您有 2 个分页符,但没有看到第一页之外的剩余分页符。
这里的关键实际上是 xlPageBreakPreview
- 但额外的两行也应该让对象完全了解任何未来的变化。