如何访问 Excel 中的一系列行?

How can I access a range of rows in Excel?

我正在尝试将此 Excel VBA 代码翻译成 Delphi:

ActiveSheet.Rows(r & ":5000").WrapText = True
ActiveSheet.Rows(r & ":5000").AutoFit

然而在Delphi中的Excel2010单元中_Worksheet.Rows是一个对象,不是函数或数组对象,我也找不到任何Items属性 或类似的。

uses
  Excel2010;

procedure Test;
var
  Sheet: ExcelWorksheet;
  R: Integer;
begin
  R := 3;
  Sheet.Rows[R.ToString + ':5000'].WrapText := True;
  // Sheet.Rows.WrapText := True;
end;

编译器消息是:

[dcc32 Error] Unit1.pas(110): E2149 Class does not have a default property

VBA 代码的正确翻译是什么?

如何访问 Excel 中特定范围的行?

这是一个如何使用 ExcelRange 的例子

var
  lcid: Integer;
  Range: ExcelRange;
  Worksheet: _WorkSheet;
  Row: Integer;
begin
  lcid := LOCALE_USER_DEFAULT;
  Wbk := ExcelApplication1.Workbooks.Open(Filename,
      EmptyParam,EmptyParam,EmptyParam,
      EmptyParam,EmptyParam,EmptyParam,
      EmptyParam,EmptyParam,EmptyParam,
      EmptyParam,EmptyParam,EmptyParam,
      EmptyParam,EmptyParam,lcid);

  WorkSheet := Wbk.Worksheets.Item['Sheet1'] as _Worksheet;
  WorkSheet.Activate(lcid);
  Row := 1;
  Range := WorkSheet.Range['A'+IntToStr(row), 'F'+IntToStr(row)];
  Range.Insert(xlShiftDown, xlFormatFromLeftOrAbove); // shift down and copy
  WorkSheet.Cells.Item[row, 6] := edtVatRate.Value;
end;

使用早期绑定,选择 A 列(第 3..5000 行)并使用 EntireRow,例如:

uses Excel2010;

procedure TForm14.Button1Click(Sender: TObject);
var
  Excel: ExcelApplication;
  Wbook: ExcelWorkbook;
  Sheet: ExcelWorksheet;
begin
  Excel := CoExcelApplication.Create;
  Wbook := Excel.Workbooks.Add(EmptyParam, LOCALE_USER_DEFAULT);
  Sheet := Wbook.ActiveSheet as ExcelWorksheet;

  Excel.Visible[LOCALE_USER_DEFAULT] := True;

  Sheet.Range['A3','A5000'].EntireRow.WrapText := True;
  Sheet.Range['A3','A5000'].EntireRow.AutoFit;

  //...
end;

事实是,如果您使用早期绑定(例如使用 CoExcelApplication.Create)从 Delphi 使用 Excel,您 正在使用 Excel 公开的原始接口,而不是变体 您开始使用后期绑定(使用 CreateOleObject('Excel.Application'))。

两种方法各有所长,早期绑定最适合速度和优势 Delphi 的类型检查和代码完成,而后期绑定很有用 避免必须指定方法的所有参数 很多。

在 Excel_Tlb 中(或者任何你的 Excel 导入单元被调用),也许是最好的思考方式 _Worksheet 接口的 Rows 成员作为函数 returns ExcelRange 对象的调度接口。 return 和 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;