代码之家  ›  专栏  ›  技术社区  ›  Jens Mühlenhoff

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

  •  2
  • Jens Mühlenhoff  · 技术社区  · 5 年前

    我正在尝试将此Excel VBA代码转换为Delphi:

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

    但是在 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
    

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

    3 回复  |  直到 5 年前
        1
  •  3
  •   Tom Brunberg    5 年前

    使用早期绑定,选择 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;
    
        2
  •  3
  •   MartynA    5 年前

    问题是,如果您使用早期绑定(例如,使用CoExcelApplication.Create)从Delphi使用Excel,那么 正在使用Excel公开的原始接口,而不是变体

    两种方法都有各自的优点,早期绑定最有利于提高速度和利用率 Delphi的类型检查和代码完成,而后期绑定是有用的 为了避免必须指定具有 很多。

    在Excel\u Tlb(或者Excel导入单元的名称)中,也许是最好的思考方式 的 Rows 委员会成员 _Worksheet 接口是一个返回 被问及以下问题:

    这就是你如何得到和使用 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;
    
        3
  •  1
  •   Freddie Bell    5 年前

    下面是一个如何使用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;