使用旧版本 Excel (2003) 的 Microsoft.Office.Interop.Excel.Range 对象获取索引超出范围异常
Get Index out of range exception using Microsoft.Office.Interop.Excel.Range object for old version of Excel (2003)
几年前,我在 c# 应用程序中使用 Excel 创建包含统计数据的报告。
它是带有 .Net Framework 4.0 的 WPF 应用程序,它允许我处理一些数据、计算统计参数并在 Excel.
中创建报告
我使用 Microsoft.Office.Interop.Excel COM 库版本 11 来处理 Excel-2003 格式。所以现在我的目标是使用 Net Core 3.1 重写这个应用程序。我现在对编程有一些限制:OS-版本和 Excel-版本(Win 7 和 Excel 2003)。
我也尽量让我的代码尽可能接近原始代码。我调查后发现,如果我决定使用某些库(例如 Epplus)重写这部分使用 Excel 的应用程序,我会付出很多努力。有些库不是免费的,或者它们的免费版本受到严格限制。同样流行的 Epplus 不提供我需要自定义 excel 图表的功能。例如,我发现在 Epplus 中,我无法自定义为特定图表类型预定义的轴的文本标签方向和网格线。所以我的目标是在我的 dotnet 核心 3.1 解决方案中集成旧版本 Microsoft.Office.Interop.Excel。
但是我在这样做的过程中遇到了问题。我在下面提供了部分代码。当执行命中行 Range range1 = ws.Range[ws.Cells[kursor, i], ws.Cells[kursor, i]] 我得到 Index out of range COM 库中发生的异常,这个错误让我完全不知所措。我的代码中没有任何更改导致此错误。使用 Net Framework 4.0 的旧版本应用程序在相同的输入数据上按预期工作。我什至发现,如果我切换到 Net Framework 4.8 并添加对此 excel COM 库 v.11 的引用,我就不会出现此错误。所以我的应用程序不能只在 Net Core 环境中工作。一个愚蠢的想法,但也许新版本的 c# 现在有一个 System.Range 并且它以某种方式影响了这一点?我不这么认为,但是...
我不明白为什么会这样,这让我很难过。有人可以帮我解决这个错误吗?感谢您对此问题的任何帮助。
using Microsoft.Office.Interop.Excel;
using System;
using System.Diagnostics;
using System.Linq;
using WpfStatistica.Events;
using WpfStatistica.Statistic;
using Range = Microsoft.Office.Interop.Excel.Range;
namespace WpfStatistica.Excel.Old
{
public class ExelCreator
{
private readonly StatistCollector _statData;
private readonly string _filePath;
private Application _excel;
private Workbook _workbook;
private Sheets _sheets;
public ExelCreator(StatistCollector statData, string filePath)
{
_statData = statData;
_filePath = filePath;
}
public void CreateExcelFile()
{
_excel = new Application();
_excel.Visible = false;
_excel.SheetsInNewWorkbook = 4;
_workbook = _excel.Workbooks.Add();
_sheets = _excel.Worksheets;
ProcessFirstSheet();
ProcessSecondSheet();
ProcessThirdSheet();
ProcessFourthSheet();
_workbook.SaveAs(_filePath, 1);
_excel.Quit();
}
private void ProcessFirstSheet()
{
Worksheet ws = _excel.Worksheets[1];
ws.Name = "Types of failures";
// Place columns names
ws.Cells[1, 1] = "Test";
// Some code here
ws.Cells[1, 34] = "StdErr";
//Stat params output
for (int i = 0; i < _statData.TestNum.Count; i++)
{
ws.Cells[i + 2, 1] = _statData.TestNum[i];
// Some code here
}
// Create table with info
int kursor = _statData.TestNum.Count + 5;
Range range = null;
for (int i = 1; i <= 9; i++)
{
Range range1 = ws.Range[ws.Cells[kursor, i], ws.Cells[kursor, i]]; //=> Get Index out of range error here
Range range2 = ws.Range[ws.Cells[kursor - 1, i], ws.Cells[kursor - 1, i]];
range = ws.Range[range1, range2];
if (i == 1 || i == 2 || i == 4 || i == 7)
{
range.Merge();
range.Font.Bold = true;
}
range.Borders[XlBordersIndex.xlEdgeBottom].LineStyle = XlLineStyle.xlContinuous;
range.Borders[XlBordersIndex.xlEdgeTop].LineStyle = 1;
range.Borders[XlBordersIndex.xlEdgeLeft].LineStyle = 1;
range.Borders[XlBordersIndex.xlEdgeRight].LineStyle = 1;
range.HorizontalAlignment = XlHAlign.xlHAlignCenter;
range.VerticalAlignment = XlVAlign.xlVAlignCenter;
range1.Font.Bold = true;
}
// The rest of the code for working with filling in the table and creating a Pareto chart
}
// Other methods
}
}
在以前的版本中,这个构造 Range range1 = ws.Range[ws.Cells[kursor, i], ws.Cells[kursor, i]] 按预期工作,但现在我应该投ws.Cells[kursor, i] 明确。所以它适用于 (Range)ws.Cells[kursor, i].
几年前,我在 c# 应用程序中使用 Excel 创建包含统计数据的报告。 它是带有 .Net Framework 4.0 的 WPF 应用程序,它允许我处理一些数据、计算统计参数并在 Excel.
中创建报告我使用 Microsoft.Office.Interop.Excel COM 库版本 11 来处理 Excel-2003 格式。所以现在我的目标是使用 Net Core 3.1 重写这个应用程序。我现在对编程有一些限制:OS-版本和 Excel-版本(Win 7 和 Excel 2003)。
我也尽量让我的代码尽可能接近原始代码。我调查后发现,如果我决定使用某些库(例如 Epplus)重写这部分使用 Excel 的应用程序,我会付出很多努力。有些库不是免费的,或者它们的免费版本受到严格限制。同样流行的 Epplus 不提供我需要自定义 excel 图表的功能。例如,我发现在 Epplus 中,我无法自定义为特定图表类型预定义的轴的文本标签方向和网格线。所以我的目标是在我的 dotnet 核心 3.1 解决方案中集成旧版本 Microsoft.Office.Interop.Excel。
但是我在这样做的过程中遇到了问题。我在下面提供了部分代码。当执行命中行 Range range1 = ws.Range[ws.Cells[kursor, i], ws.Cells[kursor, i]] 我得到 Index out of range COM 库中发生的异常,这个错误让我完全不知所措。我的代码中没有任何更改导致此错误。使用 Net Framework 4.0 的旧版本应用程序在相同的输入数据上按预期工作。我什至发现,如果我切换到 Net Framework 4.8 并添加对此 excel COM 库 v.11 的引用,我就不会出现此错误。所以我的应用程序不能只在 Net Core 环境中工作。一个愚蠢的想法,但也许新版本的 c# 现在有一个 System.Range 并且它以某种方式影响了这一点?我不这么认为,但是...
我不明白为什么会这样,这让我很难过。有人可以帮我解决这个错误吗?感谢您对此问题的任何帮助。
using Microsoft.Office.Interop.Excel;
using System;
using System.Diagnostics;
using System.Linq;
using WpfStatistica.Events;
using WpfStatistica.Statistic;
using Range = Microsoft.Office.Interop.Excel.Range;
namespace WpfStatistica.Excel.Old
{
public class ExelCreator
{
private readonly StatistCollector _statData;
private readonly string _filePath;
private Application _excel;
private Workbook _workbook;
private Sheets _sheets;
public ExelCreator(StatistCollector statData, string filePath)
{
_statData = statData;
_filePath = filePath;
}
public void CreateExcelFile()
{
_excel = new Application();
_excel.Visible = false;
_excel.SheetsInNewWorkbook = 4;
_workbook = _excel.Workbooks.Add();
_sheets = _excel.Worksheets;
ProcessFirstSheet();
ProcessSecondSheet();
ProcessThirdSheet();
ProcessFourthSheet();
_workbook.SaveAs(_filePath, 1);
_excel.Quit();
}
private void ProcessFirstSheet()
{
Worksheet ws = _excel.Worksheets[1];
ws.Name = "Types of failures";
// Place columns names
ws.Cells[1, 1] = "Test";
// Some code here
ws.Cells[1, 34] = "StdErr";
//Stat params output
for (int i = 0; i < _statData.TestNum.Count; i++)
{
ws.Cells[i + 2, 1] = _statData.TestNum[i];
// Some code here
}
// Create table with info
int kursor = _statData.TestNum.Count + 5;
Range range = null;
for (int i = 1; i <= 9; i++)
{
Range range1 = ws.Range[ws.Cells[kursor, i], ws.Cells[kursor, i]]; //=> Get Index out of range error here
Range range2 = ws.Range[ws.Cells[kursor - 1, i], ws.Cells[kursor - 1, i]];
range = ws.Range[range1, range2];
if (i == 1 || i == 2 || i == 4 || i == 7)
{
range.Merge();
range.Font.Bold = true;
}
range.Borders[XlBordersIndex.xlEdgeBottom].LineStyle = XlLineStyle.xlContinuous;
range.Borders[XlBordersIndex.xlEdgeTop].LineStyle = 1;
range.Borders[XlBordersIndex.xlEdgeLeft].LineStyle = 1;
range.Borders[XlBordersIndex.xlEdgeRight].LineStyle = 1;
range.HorizontalAlignment = XlHAlign.xlHAlignCenter;
range.VerticalAlignment = XlVAlign.xlVAlignCenter;
range1.Font.Bold = true;
}
// The rest of the code for working with filling in the table and creating a Pareto chart
}
// Other methods
}
}
在以前的版本中,这个构造 Range range1 = ws.Range[ws.Cells[kursor, i], ws.Cells[kursor, i]] 按预期工作,但现在我应该投ws.Cells[kursor, i] 明确。所以它适用于 (Range)ws.Cells[kursor, i].