#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
.