Запись в Excel работает неправильно при чтении ячеек в Excel Interop c#

#c# #com #excel-interop

Вопрос:

На первом шаге:
я записываю данные в ячейки Excel с помощью приведенных ниже кодов:

         var appType = Type.GetTypeFromProgID("Excel.Application");
        var oXL = Activator.CreateInstance(appType);
        oXL.GetType()
       .InvokeMember("Visible", BindingFlags.SetProperty, null, oXL, new object[] { true });

        //Get a new workbook.
        var wb = oXL.GetType()
        .InvokeMember("Workbooks", BindingFlags.GetProperty, null, oXL, null);
        var oWB = wb.GetType()
        .InvokeMember("Add", BindingFlags.InvokeMethod, null, wb, new object[] { string.Empty });

        var oSheet = oWB.GetType()
       .InvokeMember("ActiveSheet", BindingFlags.GetProperty, null, oWB, null);

        var cells = oSheet.GetType()
 .     InvokeMember("Cells", BindingFlags.GetProperty, null, oSheet, null);

        oSheet.GetType().InvokeMember("Cells", BindingFlags.SetProperty, null, oSheet, new object[] { 1, 1, "FirstVal" });
        oSheet.GetType().InvokeMember("Cells", BindingFlags.SetProperty, null, oSheet, new object[] { 1, 2, "SecondVal" });
        oSheet.GetType().InvokeMember("Cells", BindingFlags.SetProperty, null, oSheet, new object[] { 1, 3, "ThirdVal" });

        var columns = oSheet.GetType()
       .InvokeMember("Columns", BindingFlags.GetProperty, null, oSheet, null);

        columns.GetType()
       .InvokeMember("AutoFit", BindingFlags.InvokeMethod, null, columns, null);

        oXL.GetType()
        .InvokeMember("Visible", BindingFlags.SetProperty, null, oXL, new object[] { false });

        oXL.GetType()
        .InvokeMember("UserControl", BindingFlags.SetProperty, null, oXL, new object[] { false });

        var parameters = new object[] {path, Type.Missing, Type.Missing, Type.Missing,
             false, false, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing
        };
        oWB.GetType()
       .InvokeMember("SaveAs", BindingFlags.InvokeMethod, null, oWB, parameters);
 

Все работает нормально, и файл сохранен на моем диске, когда я открываю его, проблема не обнаруживается

введите описание изображения здесь

На втором шаге:
Когда я пытаюсь прочитать этот файл, в UsedRange есть только одна ячейка, содержащая массив объектов из трех ячеек !

         for (int s = 0; s < _sheets.Count; s  )
        {
            #region members preparation
            var sheet = _sheets[s];
            var columns = sheet.GetType()
            .InvokeMember(ConstMember.Columns, BindingFlags.GetProperty, null, sheet, null);
            var usedRange = sheet.GetType()
            .InvokeMember(ConstMember.UsedRange, BindingFlags.GetProperty, null, sheet, null);
            var rows = usedRange.GetType()
            .InvokeMember(ConstMember.Rows, BindingFlags.GetProperty, null, usedRange, null);
            var cells = rows.GetType()
           .InvokeMember(ConstMember.Rows, BindingFlags.GetProperty, null, rows, null);
            var cellCnt = (int)cells.GetType()
           .InvokeMember(ConstMember.Count, BindingFlags.GetProperty, null, cells, null);

            var rowsCnt = (int)rows.GetType()
            .InvokeMember(ConstMember.Count, BindingFlags.GetProperty, null, rows, null);
            var cellList = ToListCollection(cells);
            #endregion
            //Big-O Notation order of (n)
            #region reader Block
            var xlSheet = new XlSheet();
            var xlRowsSheets = new XlSheetRow();

            for (var i = 0; i < cellCnt; i  ) // cellCnt is 1 !
            {
                var current = cellList[i];
                var cell = current.GetType() //cell value is an array object of three cells
               .InvokeMember(ConstMember.Value, BindingFlags.GetProperty, null, current, null);
                string valueStr = cell.ToString();
                xlRowsSheets.cells.Add(valueStr);
                xlRowsSheets.RowIndex = (i / rowsCnt);

                if ((i   1) % (cellCnt/rowsCnt) == 0)
                {
                    xlSheet.Rows.Add(xlRowsSheets);
                    xlRowsSheets = new XlSheetRow();
                }
            }
            #endregion
            sheetList.Add(xlSheet);
        }
 

введите описание изображения здесь

Я понятия не имею, где я ошибаюсь, это происходит как раз тогда, когда excel создается в моем коде выше, когда я сам создаю этот файл, каждая ячейка распознается, а cellCnt поле имеет значение 3.

Узел: Поскольку я не хотел добавлять DLL в свой проект, мне нужно было использовать Reflection и COM Objects .