使用旧版本 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].