Дело в том, что если вы работаете с Excel из Delphi, используя раннее связывание (например, используя CoExcelApplication.Create), вы работаете с необработанными интерфейсами, предоставляемыми Excel, а не с вариантами, которые вы получаете, работая с поздним связыванием (используя CreateOleObject ('Excel.Application ')).
Оба метода имеют свои сильные стороны, раннее связывание лучше для скорости и использует преимущества проверки типов в Delphi и завершения кода, тогда как позднее связывание полезно, чтобы избежать необходимости указывать всеаргументы методов, у которых их много.
В Excel_Tlb (или как называется ваша единица импорта Excel), возможно, лучший способ представить член Rows
интерфейса _Worksheet
функция, которая возвращает интерфейс к объекту ExcelRange.Члены, которые возвращают интерфейс ExcelRange, принимают два аргумента, которые определяют верхнюю левую и нижнюю правую ячейки, определяющие диапазон.Итак, один из способов сделать что-то в соответствии с тем, о чем вы спрашивали, заключается в следующем:
Вот как вы получаете и используете свойство Item
, о котором вы задумывались.
procedure TDefaultForm.TestRange;
var
WB : _Workbook;
vWB,
vRange,
vSheet : OleVariant;
Sheet: _Worksheet;
Range : ExcelRange;
begin
lcid := LOCALE_USER_DEFAULT;
Excel := CoExcelApplication.Create;
Excel.Visible[LOCALE_USER_DEFAULT] := True;
WB := Excel.Workbooks.Add(EmptyParam, LOCALE_USER_DEFAULT);
Sheet := WB.ActiveSheet as ExcelWorksheet;
Range := Sheet.Range['A1', 'B2'];
Range.RowHeight := 33;
Range.Item[1, 1] := 'some text long enough to wrap';
Range.Item[1, 1].WrapText := True;
Range.Item[1, 2] := 'more text long enough to wrap';
Range.Item[2, 2] := 'other text long enough to wrap';
// The following shows how to use the special syntax for passing arguments
// in late-binding
Excel.DisplayAlerts[LOCALE_USER_DEFAULT] := False; // suppresses "Overwrite?" prompt if file already exists
vWB := WB;
// Compare the following with what you would need if you called WB.SaveAs()
vWB.SaveAs(FileName := ExtractFilePath(Application.ExeName) + 'Test.Xlsx');
// some things using late binding
vSheet := Sheet;
vRange := vSheet.Range['c3'];
vRange.Value := 'some value';
vRange := vSheet.Range['d3:e4'];
vRange.Value := 'another value';
// retrieve the ExcelRange object from the vRange variant
Range := IDispatch(vRange) as ExcelRange;
end;