Как я могу получить доступ к диапазону строк в Excel? - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь перевести этот код Excel VBA в Delphi:

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

Однако в модуле Excel2010 в Delphi _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?

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018

При раннем связывании выберите столбец 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;
0 голосов
/ 24 сентября 2018

Дело в том, что если вы работаете с 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;
0 голосов
/ 24 сентября 2018

Вот пример того, как использовать 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;
...