如何访问 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;
我正在尝试将此 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;